传int改副本,传int改原变量;Go所有参数均为值传递,但int传递的是地址副本,解引用可修改原值。

如何在Golang中理解指针与值类型_Golang指针与值类型基础解析

函数参数传 int 和传 *int 的区别在哪?

区别就一句话:传 int 是改副本,传 *int 是改本人。

Go 所有传参都是值传递,但“值”本身可以是数字(比如 42),也可以是地址(比如 0xc000010240)。传 *int 时,你传的是地址的副本——它仍指向原变量,所以解引用 *p = 42 就真把原变量改了。

结构体该用 Person{} 还是 &Person{} 传参?

看两点:结构体大小 + 是否要改字段。

小结构体(比如 2–3 个基础字段)传值更清晰;大结构体(含数组、嵌套 map、大字符串)传指针避免复制开销。更重要的是:只有传指针,函数才能真正修改原结构体字段。

为什么 mapslice 不用传指针也能改内容?

因为它们底层是“带指针的值类型”。map 本质是个结构体,里面存着指向哈希表的指针;slice 也是结构体,含指向底层数组的指针、长度和容量。

所以传 map[string]int,函数内能改 m["key"] = 1,但不能让 m 指向新 map——除非你传 *map[string]int

接口赋值时,MyType*MyType 能混用吗?

不能随意混。接口的方法集取决于你用什么类型去实现它。

如果所有方法都用值接收者定义,那 MyType{}&MyType{} 都能赋值给该接口;但如果有一个方法用了指针接收者(func (m *MyType) Do()),那只有 *MyType 在方法集中,MyType{} 就不满足该接口。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。