摘要:
接口值由动态类型和动态值组成 未初始化的接口类型变量的值为nil,其动态类型和动态值都是nil,调用nil接口值上的方法会产生panic 所有类型都实现了空接口interface{},任意值都能赋给空接口类型 接口里方法的名字必须是唯一的,名字相同,参数或返回值不同,也会报错 接口可以内嵌其他接口, 阅读全文
摘要:
main goroutine返回时,所有goroutine都会被直接打断,程序退出 go f(x,y),f、x、y的求值发生在当前goroutine中,f的执行发生在新goroutine中 goroutine运行在相同的地址空间中,访问共享内存需要同步 未初始化的channel类型变量的值为nil, 阅读全文
摘要:
go语言101,对引用路径作了比较详细的解释 一个代码包可以由若干Go源文件组成。一个代码包的源文件须都处于同一个目录下。 一个目录(不包含子目录)下的所有源文件必须都处于同一个代码包中,亦即这些源文件开头的package pkgname语句必须一致。 所以,一个代码包对应着一个目录(不包含子目录) 阅读全文
摘要:
func h() []*int { s := []*int{new(int), new(int), new(int), new(int)} // 使用此s切片 ... s[0], s[len(s)-1] = nil, nil // 指针指向的两个int可以被回收 return s[1:3:3] } 阅读全文
摘要:
func main() { // 可变参数是interface{}类型, var a = []interface{}{1, 2, 3} fmt.Println(a) // 将整个a当作一个interface{},输出 [1,2,3] fmt.Println(a...) // 将a当作interfac 阅读全文
摘要:
mutex := make(chan struct{}, 1) // 容量必须为1 increase := func() { mutex <- struct{}{} // 加锁 ...... <-mutex // 解锁 } mutex := make(chan struct{}, 1) mutex 阅读全文
摘要:
func source(c chan<- int32) { ra, rb := rand.Int31(), rand.Intn(3) + 1 time.Sleep(time.Duration(rb) * time.Second) // 睡眠1~3秒 c <- ra } func main() { r 阅读全文
摘要:
func longTimeRequest() <-chan int32 { r := make(chan int32) go func() { time.Sleep(time.Second * 3) // 模拟一个工作负载 r <- rand.Int31n(100) }() return r } f 阅读全文
摘要:
超时 select { case v := <-in: fmt.Println(v) case <-time.After(time.Second): return } 非阻塞 select { case v := <-in: // 尝试接收 fmt.Println(v) default: } 阅读全文
摘要:
type ( subscriber chan interface{} // 订阅者为一个管道 topicFunc func(v interface{}) bool // 主题为一个过滤器 ) // 发布者对象 type Publisher struct { m sync.RWMutex // 读写锁 阅读全文