go的浅拷贝

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

请问arr里面有张三吗?

package main

import (
    "fmt"
    "math/rand"

    "time"
)

type SonSeed struct {
    RtaObject string
}
type FatherSeedStu struct {
    name string
    age  int
    Son  *SonSeed
}

func init() {
    rand.Seed(time.Now().UnixNano())
}
func Seed1() {
    var st *FatherSeedStu
    st = new(FatherSeedStu)
    st.Son = new(SonSeed)
    arr := make([]*FatherSeedStu, 0)
    for i := 0; i < 3; i++ {
        rdn := rand.Intn(5)
        if rdn < 2 {
            st.Son.RtaObject = "张三"
        } else {
            st.Son.RtaObject = "李四"
        }
        temp := *st
        if temp.Son.RtaObject == "李四" {
            arr = append(arr, &temp)
        }
    }
    for k := range arr {
        fmt.Println("---写入:", arr[k].Son.RtaObject)
    }
}
func main() {
    for i := 0; i < 20; i++ {
        go func() {
            Seed1()
        }()
    }
    time.Sleep(1 * time.Second)

}

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

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

2048 次点击  ∙  2 赞  
加入收藏 微博
8 回复  |  直到 2021-08-30 10:48:51
wonder_wjy
wonder_wjy · #1 · 4年之前

有可能有,即使temp:=*st复制了st的数据,因为Son是指针,所以复制的是指针,指针还是指向同一地址。

zzustu
zzustu · #2 · 4年之前

懒得看那么长的代码,要问什么问题,就把代码精简一下,把无用的干扰去掉,把问题突出出来,

GO_go_GO1
GO_go_GO1 · #3 · 4年之前
wonder_wjywonder_wjy #1 回复

有可能有,即使temp:=*st复制了st的数据,因为Son是指针,所以复制的是指针,指针还是指向同一地址。

没错 这就是浅拷贝问题

GO_go_GO1
GO_go_GO1 · #4 · 4年之前
zzustuzzustu #2 回复

懒得看那么长的代码,要问什么问题,就把代码精简一下,把无用的干扰去掉,把问题突出出来,

不长 吧 主体函数 就一个 for循环 赋值啊

tablecell
tablecell · #5 · 4年之前

贴代码为什么不用文本格式?

cy422396350
cy422396350 · #6 · 4年之前

建议用文本格式贴代码,我们好粘贴运行,不然还要手打

GO_go_GO1
GO_go_GO1 · #7 · 4年之前
cy422396350cy422396350 #6 回复

建议用文本格式贴代码,我们好粘贴运行,不然还要手打

好的 下次注意

GO_go_GO1
GO_go_GO1 · #8 · 4年之前
cy422396350cy422396350 #6 回复

建议用文本格式贴代码,我们好粘贴运行,不然还要手打

之前不会markdown 语法 查了一下 ,现在可以复制了

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