The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
gramyang

问一个特别基本的问题。。。。

  •  
  •   gramyang · Oct 30, 2019 · 5574 views
    This topic created in 2566 days ago, the information mentioned may be changed or developed.
    x := make([]int, 3)
    fmt.Printf("%p\n", &x) //不变 0xc000004480
    //y := make([]int, 3)
    y := x
    fmt.Printf("%p\n", &y) //不变 0xc0000044c0
    x[0] = 1
    fmt.Println(x) //[1 0 0]
    fmt.Println(y) //[1 0 0]

    问题:为啥 x 和 y 的地址不一样。。。
    21 replies  •  2019-10-31 11:39:37 +08:00
    Immortal
    Immortal
    Oct 30, 2019 via Android
    1
    爸爸给第一个小孩起名叫“小明”
    第二个孩子也叫“小明”
    两个小孩都叫“小明”
    但是两个不同的人(载体)
    Cooky
    Cooky
    Oct 30, 2019 via Android
    2
    输出的是变量自身的地址?那肯定不一样吧
    没学过 go,盲猜
    dosmlp
    dosmlp
    Oct 30, 2019
    3
    因为那是两个变量啊
    95aluo
    95aluo
    Oct 30, 2019
    4
    这得看你的语言基础了,Go 语言是基于 C 语言的,可以看一下 C 语言变量地址相关知识
    ahsjs
    ahsjs
    Oct 30, 2019
    5
    y:=x 有值拷贝了,换成 y:=&x 用*y 指针访问就一样了。
    javapythongo
    javapythongo
    Oct 30, 2019❤️1
    6
    slice 是由三个字段组成的,*data、length、cap,只有 data 数组是引用同一个指针,但是 length、cap 并不是,所以 y:=x 是两个 slice,只是*data 是同一个指针
    catror
    catror
    Oct 30, 2019 via Android❤️1
    7
    Go 里面有个玩意儿叫 Slice,这里 x 和 y 都是 Slice,同时引用你 make 出来的数组。这里取地址取到的是 Slice 的地址。
    gramyang
    gramyang
    OP
    Oct 30, 2019
    8
    @ahsjs 照你的方法解决了

    请教一下,y := x 值拷贝,x 和 y 的地址不一样,是如何指向同一个切片的呢?
    zarte
    zarte
    Oct 30, 2019
    9
    @gramyang #6 是正经 的解释。
    gramyang
    gramyang
    OP
    Oct 30, 2019
    10
    @zarte 明白了! x 和 y 不是同一个切片,但是底层数组是一样的,另外 go 里面只有值传递
    wangkai0351
    wangkai0351
    Oct 30, 2019
    11
    这就是我反对不学 C 的原因
    gramyang
    gramyang
    OP
    Oct 30, 2019
    12
    @wangkai0351 这和 C 还真没什么关系,go 里面没有引用传递,都是值传递
    reus
    reus
    Oct 30, 2019
    13
    @gramyang 你这里都没有函数调用,和值传递引用传递有什么关系?如果你懂 C,当然会知道 x 和 y 是不同的变量,不同的变量自然有不同的地址。
    unionx
    unionx
    Oct 30, 2019
    14
    这就是我反对不学 C 的原因
    zarte
    zarte
    Oct 31, 2019
    15
    @gramyang 错啦,切片是默认是引用的。
    justfly
    justfly
    Oct 31, 2019
    16
    上边太复杂了,还涉及不到 slice 的实现,这就相当于:

    var a []int
    var b []int

    你比较 a b 俩变量的地址,当然是不一样的。
    merin96
    merin96
    Oct 31, 2019
    17
    x := make([]int, 3)
    fmt.Printf("%p\n", &x[0])
    y := x
    fmt.Printf("%p\n", &y[0])
    BinGo1994
    BinGo1994
    Oct 31, 2019
    19
    切片是引用类型,X,Y 是不同的变量,但是指向同一段内存地址
    welkim
    welkim
    Oct 31, 2019
    20
    你造了个房间,里面放了一些东西,开了一扇门,然后又开了一扇门,两扇门是不一样的,但是都能进到房间里,看到一样的东西。
    TypeErrorNone
    TypeErrorNone
    Oct 31, 2019
    21
    y 和 x 都是指针变量,指向同一个地址 make([]int, 3)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2039 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    ♥ Do have faith in what you're doing.