美文网首页golang
golang 结合实例更好的理解参数传递和指针

golang 结合实例更好的理解参数传递和指针

作者: 名白 | 来源:发表于2019-08-12 00:19 被阅读0次
关于参数传递

其实go的参数传递,核心就是一句话:go里所有参数传递都是值传递,既把参数复制一份放到函数里去用。

go的函数传参,不管参数是什么类型,都会复制一份,然后新的参数在函数内部被使用。

不像其他语言,有的时候传参只是传递一个原来参数的引用(引用和指针的区别,欢迎翻看我上上上上一篇分享),在函数内部操作变量,其实还是操作的原变量。go内不会直接的操作原变量。

关于指针

相比于C里的指针,go内部的指针一个被简化过的指针,指针可以取值获取其变量;变量可以取地址获取一个指针类型的值。 但是不可以对指针执行 地址的加减操作(unsafe.Pointer 可以,不在本次讨论范围之内)。

我觉得这个简化挺好,保留了参数传递时避免大变量的优势,又去掉了复杂性。

下面来通过实例具体说明

之所以用 切片做示例,是因为 切片是引用类型,也就是说切片内部有一个指针 指向底层放数据的数组。 类似于 一个指针变量。由于它的这个特性,更能说明问题。

错误示例1

package main

import "log"

var str []string

func main()  {
    setVal(str)
    log.Println(str)
}


//需要在这里赋值str,但是又不能直接引用 str
func setVal(val []string)  {
    val = []string{"a", "b"}
}

结果是空数组
虽然切片是引用类型,还是没有复制成功。 原因就是,在传参之前 这个切片并没有被赋值,它内部的指针是一个空的。

传参的时候,复制了一个切片变量,这个新的变量 指向setVal函数内的实例变量。但是setVal 内的操作并不影响原来的切片变量。

错误示例2
package main

import "log"

var str *[]string

func main()  {
    setVal(str)
    log.Println(str)
}

//需要在这里赋值str,但是又不能直接引用 str
func setVal(val *[]string)  {
    val = &[]string{"a", "b"}
}

这个例子,看似使用了指针,不仔细就得话,可能觉得指针作为参数应该会对原参数产生效果,但其实不会,最后的结果是 nil。

其错误原因与上一个例子基本一致,虽然传递的是一个 指针。但是 这个指针只是原参数的复制品,一个新的指针,由于参数传递时,指针并没有复制,这个新的指针跟原来的指针毫无关系。

正确版本:
package main

import "log"

var str []string

func main()  {
    setVal(&str)
    log.Println(str)
}

//需要在这里赋值str,但是又不能直接引用 str
func setVal(val *[]string)  {
    *val = []string{"a", "b"}
}

注意看main 函数,这个时候原参数是一个变量,main 函数内作为参数的是这个变量的地址,同时也是一个指针变量。在setVal内复制了一个指针变量,其值同样是这个原参数的地址。所以这个例子里setVal 函数内的形参指针进行取值, 会取到原参数,所以其操作会对原参数产生影响。

总结

没啥好总结的了,总结都被写在前边了,还总结个毛线 ~ ~

相关文章

  • golang 结合实例更好的理解参数传递和指针

    关于参数传递 其实go的参数传递,核心就是一句话:go里所有参数传递都是值传递,既把参数复制一份放到函数里去用。 ...

  • Rust语言编程实例100题-066

    Rust语言编程实例100题-066 题目:Rust指针练习。先来理解下引用和借用的概念。引用是作为参数传递给函数...

  • Go语言指针作为函数参数

    Go 语言允许向函数传递指针,只需要在函数定义的参数上设置为指针类型即可。以下实例演示了如何向函数传递指针,并在函...

  • 后端研发体系

    记录自己为了面试发现的文章 golang golang中都是值传递,没有引用传递,哪怕是指针,也是指针的值拷贝。 ...

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

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

  • Go语言学习笔记(三)

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

  • Golang值传递和指针传递

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

  • 十六、vue-router路由

    1、简介 基本用法 3.路由嵌套和参数的传递 4.路由实例方法 5.路由结合动画

  • 指针

    指针 数组指针和指针数组 函数指针和指针函数 指针作为参数 指针多用于处理值传递,减少值复制耗费的内存

  • 02_C++笔记_函数

    复习数组和指针的关系: 结果如下: 数组和指针作为参数传递: 进一步改进: const和指针, 指针指向指针: 函...

网友评论

    本文标题:golang 结合实例更好的理解参数传递和指针

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