美文网首页
GO参数传递:指针还是值

GO参数传递:指针还是值

作者: 天边一钩残月带三星 | 来源:发表于2019-11-08 10:33 被阅读0次

假设有以下三个方法

type MyStruct struct {
    Val int
}

func myfunc() MyStruct {
    return MyStruct{Val: 1}
}

func myfunc() *MyStruct {
    return &MyStruct{}
}

func myfunc(s *MyStruct) {
    s.Val = 1
}
  • 第一个方法返回MyStruct{Val:1}的复制
  • 第二个方法在函数内创建MyStruct{Val:1}的指针,将其返回
  • 第三个方法需要传入一个MyStruct,然后函数会覆盖其值
    这三种情况在各大源码中都有出现,但其作用相同,那么在这三种方式中进行选择的最佳实践是什么呢?

简要回答

  1. 大多数情况下使用指针传递。google开发组的经验是:“当你不知道改选择什么进行传递时,就使用指针吧”
  2. Slices, maps, channels, strings, function values, 和 interface values本身就是使用指针实现的,所以再使用指针传递是多余的
  3. 对于打的结构体,或者不得不修改的结构体传指针,否则传值,因为由于传递指针导致结构体被修改的问题很难被排查

详细分析

大多数情况下都要使用指针传递

  • 因为函数经常要修改传递过来的参数,所以在go语言指导中,推荐使用指针传递,但也有极少部分需要使用值传递,如:

还有一些情况不需要使用指针

  • google代码审查小组提倡对不需要函数进行修改的、小的结构体中使用值传递,例如type Point struct { latitude, longitude float64 }
    • 值传递可以避免由于别名而带来的值的修改错误
    • 有时使用小的结构体的值进行参数传递可以避免缓存未命中或者重新分配堆空间
  • 对于slice,是没有必要使用指针传递的,参考Go数据结构探究

大结构体和小结构体如何区分
没有相关知道,需要自己判断

参考

Pointers vs. values in parameters and return values

相关文章

  • Go语言学习笔记(三)

    指针 Go的指针不能运算 参数传递 Go的参数传递是值传递(值传递:开辟新的空间,拷贝传递参数的值,引用传递:引用...

  • GO参数传递:指针还是值

    假设有以下三个方法 第一个方法返回MyStruct{Val:1}的复制 第二个方法在函数内创建MyStruct{V...

  • go 语言指针

    go 语言指针 go 语言的参数传递全部都是 值传递 用一个交换的例子学习指针

  • 2-7 指针

    指针 不能运算 参数传递 go语言只有值传递一种方式

  • 【golang】3.0 指针、数组、range关键字、Slice

    指针 指针在go语言中是一个很重要的概念,但比c语言简单多了。 指针简单在:指针不能运算参数传递:值传递还是引用传...

  • 读书笔记17.06.02【stack】【vector】

    C++中参数传递:按值传递,指针传递和引用传递按值传递:形参是实参的拷贝。指针传递:拷贝指针,被调用函数对指针指向...

  • 按值传递与按引用传递

    按值传递 -- 传递的是参数的值,即参数本身。 按引用传递 -- 传递的是指向参数的值的引用(指针),而不是参数的...

  • Golang值传递和指针传递

    指针传递与值传递 严格地说,go方法或函数只有一种传递方式,那就是值传递。每次将一个变量作为参数传递时,都会创建一...

  • 面试题(一)

    1. Go 语言参数传递是值传递还是引用传递 Go 语言中所有的传参都是值传递,都是一个副本,一个拷贝。因为拷贝的...

  • golang笔记之函数

    函数参数传递类型 1.按值传递:Go 默认使用按值传递来传递参数,也就是传递参数的副本。 2.引用传递:如果你希望...

网友评论

      本文标题:GO参数传递:指针还是值

      本文链接:https://www.haomeiwen.com/subject/nkoxuctx.html