var total int = 42 // A declarafon with inifalizafon 第一眼看上去有些奇怪,但这样是有好处的,例如下面的这个C 代码片段: int* a, b; 这就意味着a是一个指针,但b却不是。要声明他们都是指针必 须重复两次,但在Go中,你可以这样声明: var a, b *int 当一个变量被初始化后,编译器会自动识别他的类型,所以不 必要指明其类型: var label = "name" 这样var关键字也就多余了,因此作者提出了一个新的赋值操作 符声明并初始化一个新变量: name := "Samuel"
switch (byte) { case 'a': case 'b': { result = 1 break } default: result = 0 } Go 代码: var result int switch byte { case 'a', 'b': result = 1 default: result = 0 }
if (result < 0) { /* negafve */ } else if (result > 0) { /* posifve */ } else { /* zero */ } Go 代码: switch result := calculate(); true { case result < 0: /* negafve */ case result > 0: /* posifve */ default: /* zero */ } 当switch的值被忽略时,假设为真,所以上述代码还可 简化为: switch result := calculate(); { case result < 0: /* negafve */ case result > 0: /* posifve */ default: /* zero */ }
case 0 <= Num && Num <= 3 : fmt.Printf (“0-‐3”) case 4 <= Num && Num <= 6 : fmt.Printf (“4-‐6”) } ü 循环语句 //case 1 sum := 0 for i := 0; i < 10; i++ {//条件表达式中也支持多重赋值 sum += i } //case2 sum := 0 for { //相当于while,do-‐while sum++ //支持按标签break }
Go语言中的大多数类型都是值语义,并且都可以包含 对应的操作方法。在需要的时候,你可以给任何类型(包括 内置类型)增加新方法。而在实现某个接口时,无需从从该 接口继承,只需要实现该接口要求的所有方法即可。 type Integer int func (a Integer) Less (b Integer) bool { return a < b } func main () { var a Integer = 1 if a.Less (2) { fmt.Println (a, “Less 2”) } }
value int handler func (int) int next chan int } func handler (queue chan *PipeData) { for data := range queue { data.next <-‐ data.handler (data.value) } } Go语言中channel本身是一个原生类型,因此channel可以传递。 下面我们利用这个特性来实现*nix常见的管道特性