代码改变世界

golang 案例分析

  天心PHP  阅读(73)  评论(0编辑  收藏  举报
复制代码
package main

import (
    "fmt"
)

type student struct {
    Name string
    Age  int
}

func main() {
    //定义map
    m := make(map[string]*student)

    //定义student数组
    stus := []student{
        {Name: "zhou", Age: 24},
        {Name: "li", Age: 23},
        {Name: "wang", Age: 22},
    }

    //将数组依次添加到map中
    for _, stu := range stus {
        fmt.Printf("%v\t%p\n",stu,&stu)
        m[stu.Name] = &stu
    }

    //打印map
    for k,v := range m {
        fmt.Println(k ,"=>", v.Name)
    }
}
复制代码

 

结果:

{zhou 24}    0xc000004480
{li 23}    0xc000004480
{wang 22}    0xc000004480
zhou => wang
li => wang
wang => wang

 

通过上面的案例,我们不难发现stu变量的地址始终保持不变,每次遍历仅进行struct值拷贝,故m[stu.Name]=&stu实际上一直指向同一个地址,最终该地址的值为遍历的最后一个struct的值拷贝。

修正方案,取数组中原始值的地址:

for i, _ := range stus {
    stu:=stus[i]
    m[stu.Name] = &stu
}

 

  

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示