• 衡子 置顶
    2018-08-22
    希望文字能再精简些,很绕!看起来比较费劲!当然内容还是不错的!
     3
     198
  • 咖啡色的羊驼 置顶
    2018-08-22
    会报redeclared。
    采用import . xxx如文章所说,基本上就会认为引入的代码包的代码,如同在本包中一样,那作用域其实是同一个,自然不允许重复声明。
    后文期待作者提到变量逃逸的问题,这个还蛮有趣的。

     1
     35
  • êwěn 置顶
    2018-08-22
    如果都是全局的变量,会报重复声明,如果只是在函数体重新声明,作用域不一样,应该不会报错吧

    作者回复: 对,作用域不一样,会出现屏蔽现象。

    
     27
  • atompi 置顶
    2018-08-22
    从此地铁上那半小时变得格外充实👍
    
     15
  • 衡子 置顶
    2018-08-22
    内容很不错👍 文字能再精简些就更好了!
    
     9
  • @hl 置顶
    2018-08-22
    什么是全域代码块

    作者回复: 一个Go程序可以访问到的所有代码共同组成的代码块,也可以理解为Go标准库和所有工作区中的代码共同组成的代码块。

    
     4
  • xiaolonghuster 置顶
    2018-08-22
    对于和重名变量,不同类型时,可在使用之前通过查看变量类型来确定使用的是哪个地方定义的变量,reflect.TypeOf(container)
    
     2
  • javaadu 置顶
    2018-08-22
    变量重复声明和变量重名不是一个事情,上篇讲的是前者,这一篇讲后者。变量重名按照作用域进行屏蔽,查找过程从小作用域查到大作用域

    作者回复: 很对。

    
     2
  • lik0914 置顶
    2018-08-22
    模块级私有,怎么全是模块级别呢
    
     1
  • 云学 置顶
    2018-08-22
    这种变量命名算是code smell么?

    作者回复: 可重名变量如果没用对地方就算

    
    
  • 小小笑儿 置顶
    2018-08-22
    报错,重定义
    
    
  • 卖轮子
    2018-08-22
    文字多 看着比较费劲。 而且为啥咋感觉每句话都很长而且绕口呢?

    作者回复: 这个专栏是以音频为主的,文字版是备份和巩固。有的句子里概念较多,可以多读两遍试试。

    
     25
  • 我来也
    2018-08-22
    当初在学校学c时,老师说重名变量时用了个很形象的比喻:强龙不压地头蛇。

    作者回复: 赞

    
     22
  • 时间的奴隶
    2018-10-10
    最后的思考题,应该分情况对待!
    1、如果子包中,声明的变量使用的是小写,如:var str = "abc" ,那么,在main包中同样声明 var str = "aaa" 是没有任何问题的,编译通过;
    2、如果子包中声明变量是大写,如:var Str = "abc",在main包中同样声明 var Str = "aaa",IDE工具提示'Str' redeclared in this package。但是在执行 `go run main.go` 或 `go run *` 时,代码是没有任何错误的;
    测试代码如下:

    ```
    package main // main包代码

    import "fmt"
    import . "geektime/go05/t1/p1"

    var Str = "aaa"

    func main() {
        fmt.Println(Str)

        P()
    }
    ```

    ```
    package p1 // 子包p1的代码

    import "fmt"

    var Str = "abc"

    func P() {
        fmt.Println(Str)
    }
    ```
    代码编译OK,执行结果为
    ```
    aaa
    abc
    ```
    展开
    
     5
  • Sky
    2019-06-04
    import . XXX
    应该是 import . "XXX"

    作者回复: 好吧,貌似"XXX"更一致一些。谢谢。

    
     2
  • happyhacker
    2018-10-26
    我还以为只有我自己觉得文风很怪,尤其被朗读者读出来的时候听着更难受了。不过文章的细节很到位。刚买了本作者的Go并发编程实战

    作者回复: 谢谢惠顾。写作技巧持续增进中。

    
     2
  • Ye
    2018-10-04
    老师您好,针对jenningsloy318代码的问题我做了些修改。
    先创建个test5文件夹,把main.go放进去,在test5文件夹里面建个package1文件夹作为放置"package1" 包的路径,并将func1.go放入package1文件夹里。
    代码如下
    main.go

    package main
    import "test5/package1"
    var amv = 123
    func main(){
         amv := 456
         package1.Printa(amv)
    }

    --------------------
    func1.go

    package package1
    import "fmt"
    func Printa(input int){
        fmt.Println(input)
    }

    编译成功,输出结果456。这里思路main文件想通过条用package1包里面的Printa来打印main文件里面的amv变量,在调用Printa时候创建了新的作用域。但和main作用域分别属于不同的包,所以Printa不能共享main 里面的变量或者全域变量,所以必须给Printa手动添加amv作为输入值。另外,如果我删除func main 里面的 amv :=456,package1.Printa()找不到amv值,所以就会去找代码块外的amv,也就是 package main 里面全域变量的amv,然后输出结果就是123了,我的理解对吗?
    展开
    
     2
  • 伟-Vae
    2019-04-11
    你好老师,请看代码
    var result int
    switch(op){
    case 1:
            result = 1
    break
    case 2:
            result =2
    break
    ......
    }
    fmt.println(result)

    switch内属于一个代码块,里面对result赋值,怎么会改变外部result的值
    展开

    作者回复: 因为它们操作的是同一个变量啊。你可以在case里用 := 给 result 赋值再看看。

    
     1
  • 言十年
    2019-01-07
    我觉得用了变量就尽量用一个类型。用一个变量代表不同类型的,我觉得算是编码粗糙了。
    隐晦的问题。不仅是可重声明变量。下面代码也会。

    ```
    package main

    var name = "野原新之助"
    func main() {
        var name = 1
        print(name)
    }
    ```

     
    展开

    作者回复: 小新,你好。这确实是需要避免的。

    
     1
  • 蛋蛋鸡
    2018-11-17
    ”可重命名变量“这个词听起来容易让人误解。初学者可能会认为这是变量的特性,但其实是作用域的问题,外围变量被隐藏了。当然,关于这个问题作者已经在文章中说得很清楚了,这里只是指出对于这个名词的顾虑。有C++经验的同学可能会比较有感触,用作用域操作符(::)可以把全局变量找出来。
    
     1
我们在线,来聊聊吧