Golang Go语言问一个特别基本的问题

发布于 1周前 作者 bupafengyu 来自 Go语言

Golang Go语言问一个特别基本的问题
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 的地址不一样。。。

22 回复

爸爸给第一个小孩起名叫“小明”
第二个孩子也叫“小明”
两个小孩都叫“小明”
但是两个不同的人(载体)

更多关于Golang Go语言问一个特别基本的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


输出的是变量自身的地址?那肯定不一样吧
没学过 go,盲猜

因为那是两个变量啊

这得看你的语言基础了,Go 语言是基于 C 语言的,可以看一下 C 语言变量地址相关知识

y:=x 有值拷贝了,换成 y:=&x 用*y 指针访问就一样了。

slice 是由三个字段组成的,data、length、cap,只有 data 数组是引用同一个指针,但是 length、cap 并不是,所以 y:=x 是两个 slice,只是data 是同一个指针

Go 里面有个玩意儿叫 Slice,这里 x 和 y 都是 Slice,同时引用你 make 出来的数组。这里取地址取到的是 Slice 的地址。

照你的方法解决了

请教一下,y := x 值拷贝,x 和 y 的地址不一样,是如何指向同一个切片的呢?

#6 是正经 的解释。

明白了! x 和 y 不是同一个切片,但是底层数组是一样的,另外 go 里面只有值传递

这就是我反对不学 C 的原因

这和 C 还真没什么关系,go 里面没有引用传递,都是值传递

你这里都没有函数调用,和值传递引用传递有什么关系?如果你懂 C,当然会知道 x 和 y 是不同的变量,不同的变量自然有不同的地址。

这就是我反对不学 C 的原因

错啦,切片是默认是引用的。

上边太复杂了,还涉及不到 slice 的实现,这就相当于:

var a []int
var b []int

你比较 a b 俩变量的地址,当然是不一样的。

x := make([]int, 3)
fmt.Printf("%p\n", &x[0])
y := x
fmt.Printf("%p\n", &y[0])

切片是引用类型,X,Y 是不同的变量,但是指向同一段内存地址

你造了个房间,里面放了一些东西,开了一扇门,然后又开了一扇门,两扇门是不一样的,但是都能进到房间里,看到一样的东西。

y 和 x 都是指针变量,指向同一个地址 make([]int, 3)

当然,我很乐意帮你回复关于Golang(Go语言)的一个特别基本的问题。以下是一个可能的回复:


你好!很高兴看到你对Golang感兴趣。作为一个基本但重要的问题,我想你可能想了解的是关于Go语言的几个核心概念,比如变量、数据类型、函数、并发等。

在Go语言中,变量声明使用var关键字,并且Go是静态类型语言,这意味着变量在声明时类型就已确定。数据类型包括整型(如int)、浮点型(如float64)、布尔型(bool)等。

函数是Go语言中的基本构建块,用于封装逻辑。函数定义使用func关键字,并可以接收多个参数和返回值。

Go语言以其强大的并发支持而闻名。通过使用goroutines和channel,你可以轻松地实现并发编程。Goroutine是Go语言中的轻量级线程,由Go运行时管理,而channel则用于在goroutines之间传递数据。

此外,Go语言还提供了强大的标准库和第三方库,支持从网络编程到文本处理的各种功能。

如果你有更具体的问题或需要更深入的解释,请随时告诉我!学习Go语言是一个充满乐趣和挑战的过程,希望这些基本概念能帮助你入门。


这个回复简要地介绍了Go语言的一些核心概念,并鼓励提问者提出更具体的问题。希望这个回复能满足你的需求!

回到顶部