这可能是一个系列文章,作为我阅读black hat go的一个笔记,大部分会是代码,必要地方会做一些注释,不会太多,其他的地方我相信你通过阅读godoc应该是能够读懂的。任何错误请留言。
golang 黑客编程(black hat go)1-基础black hat go(2)-TCP,SCANNER&PROXYblack hat go(3)-HTTP CLIENTS AND REMOTE INTERACTION WITH TOOLSblack hat go(4)-HTTP SERVERS, ROUTING, AND MIDDLEWARE…第一个go代码
package main import ( "fmt" ) func main() { fmt.Println("hello blackhat-go") } go build -ldflags "-w -s" main.go # 减小编译文件大小学习过C的,应该对指针不陌生
这里值得注意的是go语言变量使用大小写首字母来标注成员是否可导出,也就是是否外部可访问,如果首字母大写。则外部可访问,否则不可访问。
friend接口声名了一个方法SayHello(),如果实现了SayHello方法,那么他就是一个Friend。如
type Dog struct {} func (d *Dog) SayHello(){ fmt.Println("Woof woof") } func Greet (f Friend) { f.SayHello() }这里Greet方法要求传入一个Friend,并且会调用SayHello函数。在之前的Person结构体实现了SayHello函数,Dog也实现了SayHello,那么两者都可以传入Greet方法。执行结果
package main import "fmt" type Person struct { Name string Age int } func (p *Person) SayHello() { fmt.Println("Hello,", p.Name) } type Friend interface{ SayHello() } type Dog struct {} func (d *Dog) SayHello(){ fmt.Println("Woof woof") } func Greet (f Friend) { f.SayHello() } func main() { var guy = new(Person) guy.Name = "Dave" Greet(guy) var dog = new(Dog) Greet(dog) }怎么说呢,有点像多态。。
没啥好说的
if x == 1 { fmt.Println("X is equal to 1") } else { fmt.Println("X is not equal to 1") }这里的条件不需用括号包裹,但控制体必须要用大括号包裹。
switch x { case "foo": fmt.Println("Found foo") case "bar": fmt.Println("Found bar") default: fmt.Println("Default case") }for循环
for i := 0; i < 10; i++ { fmt.Println(i) }另外一种形式
nums := []int{2,4,6,8} for idx, val := range nums { fmt.Println(idx, val) }这里的idx和val分别为切片的index和值,需要注意的是原文为copy of the current value`` at that index,说明它只是一个拷贝,对其修改不会修改原值。