方法method
-GO方法虽没有class,依旧有method
-通过显示说明receiver来实现与某个类型的组合
-只能为同一个包中的类型定义方法
-RECEIVER可以是类型的值或指针
-不存在方法重载
-可以使用值或指针来调用方法,编译器会自动完成转换
-从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数
-如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
-类型别名不会拥有底层类型所附带的方法
-方法可以调用结构中的非公开字段
接口interface
-接口是一个或多个方法签名的集合
反射reflection
并发concurrency
Channel
-Channel是goroutine沟通的桥梁,大都是阻塞同步的
-通过make创建,close关闭
-Channel是引用类型
package main
import "fmt"
import "time"
func main(){
c :=make(chan bool)
go func(){
fmt.Println("GO GO GO")
c <-true
}()
<-c
time.Sleep(2*time.Second)
}
-可以使用for range 来迭代不断操作channel
package main
import "fmt"
//import "time"
func main(){
c :=make(chan bool)
go func(){
fmt.Println("GO GO GO")
c <-true
close(c)
}()
for v :=range c{
fmt.Println(v)
}
}
-可以设置单项或双向通道
-可以设置缓存大小,在未被填满前不会发生阻塞
package main
import "fmt"
import "runtime"
func main(){
runtime.GOMAXPROCS(runtime.NumCPU())
c :=make(chan bool,10)
for i :=0;i<10;i++{
go Go(c,i)
}
for i :=0;i<10;i++{
<-c
}
}
func Go(c chan bool,index int){
a :=1
for i :=0;i<100000000;i++{
a+=1
}
fmt.Println(index,a)
c<-true
}
等价///
package main
import "fmt"
import "runtime"
import "sync"
func main(){
runtime.GOMAXPROCS(runtime.NumCPU())
wg :=sync.WaitGroup{}
wg.Add(10)
for i :=0;i<10;i++{
go Go(&wg,i)
}
wg.Wait()
}
func Go(wg *sync.WaitGroup,index int){
a :=1
for i :=0;i<100000000;i++{
a+=1
}
fmt.Println(index,a)
wg.Done()
}
Select
-可处理一个或多个channel的发送与接收
-同时有多个可用的channel时按随机顺序处理
-可用空的select来阻塞main函数
-可设置超时