Golang 语言面试题 - 第 2 天 (一起来看下评论区热闹的讨论!!!)

Seek · 2021-02-28 14:07:08 · 2879 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-02-28 14:07:08 的主题,其中的信息可能已经有所发展或是发生改变。

来看下今天的题目:

下面这段代码输出什么,说明原因。

func main() {

    slice := []int{0,1,2,3}
    m := make(map[int]*int)

    for key,val := range slice {
        m[key] = &val
    }

    for k,v := range m {
        fmt.Println(k,"->",*v)
    }
}

参考答案:

0 -> 3
1 -> 3
2 -> 3
3 -> 3

解析:这是新手常会犯的错误写法,for range 循环的时候会创建每个元素的副本,而不是元素的引用,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值为3,所有输出都是3.

正确的写法:

func main() {

    slice := []int{0,1,2,3}
    m := make(map[int]*int)

    for key,val := range slice {
        value := val
        m[key] = &value
    }

    for k,v := range m {
        fmt.Println(k,"===>",*v)
    }
}

扩展题目

type Test struct {
    name string
}

func (this *Test) Point(){
    fmt.Println(this.name)
}


func main() {

    ts := []Test{
        {"a"},
        {"b"},
        {"c"},
    }

    for _,t := range ts {
        //fmt.Println(reflect.TypeOf(t))
        defer t.Point()
    }

}


参考: https://blog.csdn.net/idwtwt/article/details/87378419


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

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

2879 次点击  ∙  1 赞  
加入收藏 微博
13 回复  |  直到 2021-03-08 22:30:55
ShynHan
ShynHan · #1 · 4年之前

正确写法中循环赋值部分感觉如果这么写会好一点

    for key := range slice {
        m[key] = &slice[key]
    }
Seek
Seek · #2 · 4年之前

嗯 你的是优化写法,👍

ps:

原题摘自:Golang语言面试题(精编263道题),包含解析!!!

machinism1011
machinism1011 · #3 · 4年之前

c b a defer的出栈方式

Seek
Seek · #4 · 4年之前
machinism1011machinism1011 #3 回复

c b a defer的出栈方式

你运行下代码试试看,会有惊喜。

Seek
Seek · #5 · 4年之前

欢迎大家来交流这道题!

Seek
Seek · #6 · 4年之前

扩展题目有知道正确答案的同学吗?

zzustu
zzustu · #7 · 4年之前
SeekSeek #6 回复

扩展题目有知道正确答案的同学吗?

给struct绑定方法时,尽量不要用 this me self等这些名词呀

Seek
Seek · #8 · 4年之前
zzustuzzustu #7 回复

#6楼 @Seek 给struct绑定方法时,尽量不要用 `this` `me` `self`等这些名词呀

是的,一般推荐使用结构体名称的简写,比如这里可以使用 t。

Seek
Seek · #9 · 4年之前
Seek
Seek · #10 · 4年之前

又是新的一天,加油!💪

cfanbo
cfanbo · #11 · 4年之前

两道题一样的现象 ccc

Seek
Seek · #12 · 4年之前
cfanbocfanbo #11 回复

两道题一样的现象 ccc

是的。

tablecell
tablecell · #13 · 4年之前

作用域

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