在Go语言中,值类型参数传递是按值进行的,函数接收的是变量副本,因此无法直接修改原值;要修改原始值必须使用指针。例如,modifyValue(x int) 中对 x 的修改不影响原变量 a,而 modifyValuePtr(x *int) 通过传入 &a 并解引用 *x = 100 可成功修改原值。结构体作为值类型同样适用此规则,如 updatePerson(p *Person) 可修改 person 的字段。一般原则是:需修改原数据、结构体较大或需避免复制开销时使用指针,仅读取小数据时可传值。掌握传值与传指针的区别是编写正确Go函数的关键。

在 Go 语言中,函数参数默认是按值传递的。这意味着当你把一个变量传入函数时,函数接收到的是该变量的一个副本。对于值类型(如 int、float64、bool、struct 等),如果想在函数内部修改其原始值,必须通过指针来实现。
值类型为何无法直接修改
Go 中的值类型在传参时会被复制。比如你传一个 int 或自定义的 struct,函数拿到的是副本,对它的任何修改都不会影响原变量。
例如:
func modifyValue(x int) { x = 100}func main() { a := 10 modifyValue(a) fmt.Println(a) // 输出:10,未被修改}
这里 x 是 a 的副本,modifyValue 内部的赋值只作用于副本。
使用指针实现值类型修改
要让函数能修改原始值,需传递变量的地址(即指针)。
立即学习“go语言免费学习笔记(深入)”;
修改上面的例子:
func modifyValuePtr(x *int) { *x = 100 // 解引用并赋值}func main() { a := 10 modifyValuePtr(&a) fmt.Println(a) // 输出:100,已被修改}
通过 &a 传入地址,函数参数类型为 *int,再用 *x = 100 修改原始值。
结构体值类型的修改实践
结构体是典型的值类型。若需在函数中修改其字段,也应使用指针。
示例:
type Person struct { Name string Age int}func updatePerson(p *Person) { p.Name = "Alice" p.Age = 30}func main() { person := Person{Name: "Bob", Age: 25} updatePerson(&person) fmt.Printf("%+vn", person) // 输出:{Name:Alice Age:30}}
即使不显式解引用(Go 会自动解引用指针访问字段),p.Name 实际上操作的是原始结构体。
何时传值,何时传指针
虽然指针能修改原值,但不是所有场景都需要。可参考以下原则:
需要修改调用方数据时,使用指针 结构体较大时,传指针更高效(避免复制开销) 希望保持一致性或模拟引用行为时,使用指针 仅读取数据且类型较小(如 int、bool),可直接传值
基本上就这些。掌握值传递与指针机制,是写出正确 Go 函数的关键。函数内修改值类型的核心就是:传指针,解引用,再赋值。不复杂但容易忽略细节。
以上就是如何用Golang实现函数内值类型修改_Golang 函数值修改实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1427140.html
微信扫一扫
支付宝扫一扫