Golang Go语言中没有引用类型,指针也与众不同

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

兄弟们实锤了奥,go 就是值传递,可以确认的是 Go 语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型( int 、string 、struct 等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map 、slice 、chan 等这些),这样就可以修改原内容数据。

是否可以修改原内容数据,和传值、传引用没有必然的关系。在 C++中,传引用肯定是可以修改原内容数据的,在 Go 语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型。

有的小伙伴会在这里还是懵逼,因为你把引用类型和传引用当成一个概念了,这是两个概念,切记!!!
Golang Go语言中没有引用类型,指针也与众不同


更多关于Golang Go语言中没有引用类型,指针也与众不同的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

刚好相反的是 java ,一切都是传引用

更多关于Golang Go语言中没有引用类型,指针也与众不同的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


。。。。。lz 这是没学过 c 语言吗

void print_info(const People& p);
这个 C++函数,传引用,你看这个函数能不能修改 p 的值。。。

#3 虽然楼主的理解问题比较大,不过

struct People
{
mutable int mutable_field;
int field;
};

void print_info(const People &p)
{
p.mutable_field = 1;
const_cast<People &>§.field = 2;
}

int main()
{
People inst;
print_info(inst);
}

这就是 c++恶心的地方 一个 const 都能玩出花来

又是 const 又是 mutable 再来个 const_cast ,C++太可怕了

在Go语言中,关于“没有引用类型”的说法其实需要澄清一下。实际上,Go语言有引用语义的类型,尽管它并不像一些其他编程语言那样明确地称它们为“引用类型”。

在Go中,指针是实现引用语义的一种主要方式。虽然指针的行为在某些方面可能与其他语言中的引用有所不同,但它们确实允许你存储和传递变量的地址,从而允许函数或方法修改调用者变量的值。这种能力在需要高效数据传递或需要修改原始数据时非常有用。

此外,Go语言中的切片(slice)、映射(map)和通道(channel)等复合类型也表现出某种引用语义。例如,切片实际上是对底层数组的引用,并且当切片被传递或返回时,它们的行为类似于对原始数组的引用。同样,映射和通道也通过引用机制实现数据的共享和通信。

因此,虽然Go语言没有像一些其他语言那样明确区分值类型和引用类型,但它确实提供了通过指针和复合类型实现引用语义的机制。这些特性使得Go语言在数据传递、共享和修改方面既灵活又高效。

总之,Go语言中的指针和复合类型是实现引用语义的关键,它们允许开发者在需要时利用引用的优势,同时保持Go语言简洁和高效的特性。

回到顶部