疑似go bug?也许是我对使用go姿势不对!

anko · 2020-09-27 20:19:22 · 1324 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2020-09-27 20:19:22 的文章,其中的信息可能已经有所发展或是发生改变。

遇到一个看似像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未使用,即不可编译通过
    }
}

为了便于观看,给出上面代码的截图

image.png

为了修复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未使用,即不可编译通过
    }
}

同理,给出代码截图如下:

image.png

好久没法文章,各位怎么看?用了挺久go才遇到这么一个让我疑惑的地方,还请各位大佬支招!


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1324 次点击  ∙  1 赞  
加入收藏 微博
11 回复  |  直到 2020-10-11 13:05:29
polaris
polaris · #1 · 5年之前

明显自己对作用域没理解

anko
anko · #2 · 5年之前
polarispolaris #1 回复

明显自己对作用域没理解

image.png

anko
anko · #3 · 5年之前

所以我的意思是,这个冒号真要慎用,

niexinbi
niexinbi · #4 · 5年之前

生命jsonBy时,同时声明err不就OK了

polaris
polaris · #5 · 5年之前

明白你的意思,但这并不是 Go 的 Bug,语法、作用域就是这样的。

yuantiancai
yuantiancai · #6 · 5年之前

怎么看?很明显你不熟悉Go

alphayan
alphayan · #7 · 5年之前

是你的姿势不对

anko
anko · #8 · 5年之前
yuantiancaiyuantiancai #6 回复

怎么看?很明显你不熟悉Go

冒号不大熟悉,我以为go足够智能检测我是赋值还是申明,,,作用域确实是硬伤

wuly
wuly · #9 · 5年之前

冒号会声明一个局部变量,实际上是两个对象

anko
anko · #10 · 5年之前
wulywuly #9 回复

冒号会声明一个局部变量,实际上是两个对象

并没有,这里才是申明了2个变量,但是冒号并不是申明全部变量的意思,并排申明时候只要有一个是新变量,则要使用冒号了!

yuantiancai
yuantiancai · #11 · 5年之前

与其纠结疑惑,不如看一遍Go圣经

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传