Pointers golang中slice的地址

Pointers golang中slice的地址,pointers,go,slice,Pointers,Go,Slice,我有这段代码 package main import ( "fmt" ) func Extend(slice []int, element int) []int { n := len(slice) if n == cap(slice) { // Slice is full; must grow. // We double its size and add 1, so if the size is zero we still grow.

我有这段代码

package main

import (
    "fmt"
)

func Extend(slice []int, element int) []int {
    n := len(slice)
    if n == cap(slice) {
        // Slice is full; must grow.
        // We double its size and add 1, so if the size is zero we still grow.
        newSlice := make([]int, len(slice), 2*len(slice)+1)
        copy(newSlice, slice)
        slice = newSlice
    }
    slice = slice[0 : n+1]
    slice[n] = element
    return slice
}

func main() {
    slice := make([]int, 0, 5)
    for i := 0; i < 10; i++ {
        slice = Extend(slice, i)
        fmt.Printf("len=%d cap=%d slice=%v\n", len(slice), cap(slice), slice)
        fmt.Println("address of 0th element:", &slice[0])
        fmt.Println("address of slice:", &slice) // why does this print the slice and not its address?
        fmt.Printf("address of slice: %p\n", &slice) // why is this different from below? and why does it not change when a new slice is created pointing to a different array?
        fmt.Printf("address of slice: %p\n\n", slice)
    }
}
主程序包
进口(
“fmt”
)
func扩展(片[]整型,元素整型)[]整型{
n:=len(切片)
如果n==上限(切片){
//切片已满;必须生长。
//我们将它的大小加倍并加上1,所以如果大小为零,我们仍然会增长。
新闻片:=make([]整数,len(片),2*len(片)+1)
拷贝(新闻片,切片)
切片=新闻片
}
切片=切片[0:n+1]
切片[n]=元素
返回片
}
func main(){
切片:=make([]整数,0,5)
对于i:=0;i<10;i++{
切片=延伸(切片,i)
fmt.Printf(“len=%d cap=%d slice=%v\n”,len(slice),cap(slice),slice)
fmt.Println(“第0个元素的地址:,&片[0]”)
fmt.Println(“片的地址:,&slice)//为什么要打印片而不是它的地址?
fmt.Printf(“片的地址:%p\n”,&slice)//为什么这与下面的不同?为什么在创建指向不同数组的新片时它不会改变?
fmt.Printf(“切片地址:%p\n\n”,切片)
}
}
游乐场:

我对循环底部第二个Println的问题。如果您运行它,您将看到它打印出&[values…]。为什么不打印地址?我知道你可以用Printf和其他方法来做,而且很有效,但是Println呢?Println with&slice[0]工作正常,它打印的是地址而不是值,但Println with&slice与nope类似


我还注意到,当我使用&slice执行Printf语句%p时,与只执行slice相比,我得到了不同的地址。为什么?带&slice的地址在更改时不会更改(运行它,程序将调整数组大小并创建新的片)。但是printf(%p,slice)确实改变了吗?

这就是
fmt.Println
的定义

发件人:

Println格式使用其操作数的默认格式,并写入标准输出。始终在操作数之间添加空格,并追加换行符。它返回写入的字节数和遇到的任何写入错误

在该页的前面,描述了默认格式:

对于复合对象,元素使用以下规则以递归方式打印,布局如下:

struct:             {field0 field1 ...}
array, slice:       [elem0 elem1 ...]
maps:               map[key1:value1 key2:value2]
pointer to above:   &{}, &[], &map[]
也许你的问题是“为什么”是这样的。答案是有争议的,但我想这是因为人们认为用这种形式显示数据比用原始指针更有用


您还会问,为什么修改一个片不会改变它的地址。切片是一种值类型(不是引用类型),它包含指向底层数组(以及其容量和当前长度)的指针。将新值分配给切片类型的变量会覆盖该值,但不会更改其地址。是一个很好的参考。

好的,现在更有意义了,但是,最后一个呢。为什么修改切片时fmt.Printf(“切片地址:%p\n\n”,切片)会更改?我明白为什么另一个保持不变了。@aubble我有一个答案,但也许这应该是一个新问题?我明白了。它来自