遇到一个看似像go bug的写法,想向各位求证! (go版本14.7)
package main
import (
"encoding/json"
"fmt"
)
func main() {
ls:=[]uint8{1,2,3,4,5,6}
var jsonBy []byte
for k, v := range ls {
if k == 0 {
fmt.Println(jsonBy)
jsonBy, err := json.Marshal(v)
if err != nil {
fmt.Println("序列化失败")
return
}
//fmt.Println(jsonBy)//位置1,如果放这里,则正确
}
fmt.Println(jsonBy)//位置2,如果放这里,则提示上面的jsonBy未使用,即不可编译通过
}
}
为了便于观看,给出上面代码的截图
为了修复bug,事实上我的业务必须放在第二个位置而不能放到第一个位置(上面的业务是我业务的简版),看来不是所有的地方都能使用冒号,所以我们为了申请新变量err,就把他在获取值之前先申明,如下代码:
package main
import (
"encoding/json"
"fmt"
)
func main() {
ls:=[]uint8{1,2,3,4,5,6}
var jsonBy []byte
for k, v := range ls {
if k == 0 {
fmt.Println(jsonBy)
var err error//err在这里申明
jsonBy, err = json.Marshal(v)//这一行去掉冒号
if err != nil {
fmt.Println("序列化失败")
return
}
//fmt.Println(jsonBy)//位置1,如果放这里,则正确
}
fmt.Println(jsonBy)//位置2,如果放这里,则提示上面的jsonBy未使用,即不可编译通过
}
}
同理,给出代码截图如下:
好久没法文章,各位怎么看?用了挺久go才遇到这么一个让我疑惑的地方,还请各位大佬支招!
有疑问加站长微信联系(非本文作者))

明显自己对作用域没理解
所以我的意思是,这个冒号真要慎用,
生命jsonBy时,同时声明err不就OK了
明白你的意思,但这并不是 Go 的 Bug,语法、作用域就是这样的。
怎么看?很明显你不熟悉Go
是你的姿势不对
冒号不大熟悉,我以为go足够智能检测我是赋值还是申明,,,作用域确实是硬伤
冒号会声明一个局部变量,实际上是两个对象
并没有,这里才是申明了2个变量,但是冒号并不是申明全部变量的意思,并排申明时候只要有一个是新变量,则要使用冒号了!
与其纠结疑惑,不如看一遍Go圣经