13. ? 例子 func generate(ch chan int ) { for i := 2; ; i++ { ch <- i // Send 'i' to channel 'ch'. } } func filter(in, out chan int , prime int) { for { I := <- in // Receive value of new variable 'i' from 'in'. if i % prime != 0 { out <- i // Send 'i' to channel 'out'. } } } func main() { runtime.GOMAXPROCS(1); ch := make(chan int) // Create a new channel. go generate(ch) // Start generate() as a goroutine. for { prime := <-ch fmt.Println(prime) ch1 := make(chan int) go filter(ch, ch1, prime) ch = ch1 } }
22. 语法细节 - slice 定义方法 数组: var array [100]int slice : var slice []int slice 可以对数组内任意一段做引用 slice = array[X:Y] len(slice) = Y – X cap(slice) : slice 实际占用的内存 取代指针,安全的数组引用 slice = &array 等同于 slice = array[0:len(array)]
23. 语法细节 – 类 定义方式类似 C type SomeClass struct { … } func (self *SomeClass) method(...) { … } 调用方式类似 C++ var class *SomeClass = &SomeClass{ … } class.method( … ) 独特的继承 type Base struct { … } type Child struct { Base; … } func (p *Child) method() { p.BaseMethod( … ); }
24. 语法细节 – 非继承 动态绑定 interface type PrintInterface interface { print(); } type Printable struct { … } // no inherit here func (p *Printable) print() { … } var i PrintInterface = &Printable{ … } i.print() Any 可以传入任意类型 type Any interface {} 调用方式 any.(PrintInterface).print()
25. 语法细节 - type True typedef 让错误的代码 显而易见 直接报错 —— 《软件随想录》 P189 例子: type UnsafeString string; type SafeString string; var input UnsafeString = form.data; var valid SafeString; valid = input; // compile error. valid = SafeString(input); // can convert with cast