GO编译指令 go build test.go
time ./test
》》》./test 0.01s user 0.01s system 1% cpu 1.016 total
1、结构体初始化
数组初始化要加上数组类型
msg_send2 := &msg{
Mode: 0,
IsExist: 0,
S: SInfo{
amId: 1,
pInfo: [8]pInfo{
B{Id: 0, A: [4]float64{0, 0, 0, 0}},
B{Id: 1, A: [4]float64{-351, -375, -375, -358}},
B{Id: 2, A: [4]float64{0, 0, 0, 0}},
B{Id: 3, A: [4]float64{0, 0, 0, 0}},
B{Id: 4, A: [4]float64{0, 0, 0, 0}},
B{Id: 5, A: [4]float64{0, 0, 0, 0}},
B{Id: 6, A: [4]float64{0, 0, 0, 0}},
B{Id: 7, A: [4]float64{0, 0, 0, 0}},
},
},
}
p, err := json.Marshal(msg_send2)
if err != nil {
fmt.Print(err.Error())
}
2、接口切片([ ]interface{ }) 类型转换为[ ]string、[ ]int、[ ]float64、[ ]byte、等其他类型的切片、:
var dataSlice []int = foo()
var interfaceSlice []interface{} = make([]interface{}, len(dataSlice))
for i, d := range dataSlice {
interfaceSlice[i] = d
}
3、遍历通道中的参数:
//无限循环从通道中读取数据
for i := range ch {
fmt.Println(i)
}
4、使用select{} 让main一直运行不退出
//method 1:
func main() {
defer func() { for {} }()
}
//method 2:
func main() {
defer func() { select {} }()
}
//method 3:
func main() {
defer func() { <-make(chan bool) }()
}
//method 4:
func main() {
for i := 0; i < 20; i++ { //启动20个协程处理消息队列中的消息
c := consumer.New()
go c.Start()
}
select {} // 阻塞
}
5、Channel引起的死锁的常见场景
场景1:一个通道在一个go协程读写
func main() {
c:=make(chan int)
c<-666
<-c
}
场景二:go程开启之前使用通道
func main() {
c:=make(chan int)
c<-666
go func() {
<-c
}()
}
场景三:通道1中调用了通道2,通道2中调用通道1
func main() {
c1, c2 := make(chan int), make(chan int)
go func() {
for {
select {
case <-c1:
c2 <- 10
}
}
}()
for {
select {
case <-c2:
c1 <- 10
}
}
}