首页后端开发其他后端知识go值传递与地址传递的方法是什么?

go值传递与地址传递的方法是什么?

时间2024-03-27 06:26:03发布访客分类其他后端知识浏览919
导读:在这篇文章中我们会学习到关于“go值传递与地址传递的方法是什么?”的知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望对大家学习或工作能有帮助。下面就请大家跟着小编的思路一起来学习一下吧。 下面由golang教程栏目给大...
在这篇文章中我们会学习到关于“go值传递与地址传递的方法是什么?”的知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望对大家学习或工作能有帮助。下面就请大家跟着小编的思路一起来学习一下吧。

下面由golang教程栏目给大家介绍go 值传递和地址传递的例子 ,希望对需要的朋友有所帮助!

先来看个简单的例子

1、变量前面加个& 表示这个变量的地址(也就是这个变量的指针),指针变量前面加*表示这个指针对应的值 (自己理解下)

//main.gopackage main
func ByAss() {
    
  s := 100
  p := &
s  // s 的地址给了p

  fmt.Println(*p) //100 所以p对应的值变成了100
  *p += 100
  fmt.Println(*p)  //200
  fmt.Println(s) //200 p和s相同的地址,所以s也变成200}
//demo.gopackage main
func main() {

  ByAss()}

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。

2、普通值传递 (注意这个例子,看起来很简单,但是容易忽略)

func ByValue1(n1 int) {
    
  //此时n1 是n 的一个拷贝,所以地址不一样
  fmt.Println(&
n1)//0xc00000a098}
package main
func main() {
    
  n := 100
  fmt.Println(&
n) //0xc00000a090
  ByValue1(n)//传递副本}
    

如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加 & 符号,比如 & variable)传递给函数,这就是按引用传递,比如 Function(& arg1),此时传递给函数的是一个指针。

3、如果想用地址传递

func main() {
    
    n := 100
    fmt.Println(&
    n) //0xc00000a090
    ByReference(&
n) //传递指针
    fmt.Println(n) //200}
//注意函数 参数类型需要是用指针符号(*)func ByReference(n1 *int) {
    

   *n1 += 100
   fmt.Println(n1)//0xc00000a090 地址与n相同, 所以n值被改变了
  //注意
  //ip := &
n1//这个写法有问题,表示地址的地址
  //fmt.Println(ip)}

4、看下数组

  • (a)数组也是值传递
    arr := [5]int{
    1,3,5,6,7}
        arrByValue(&
        arr) //也需要使用&
     符号fmt.Println(arr) //[100 300 5 6 7]func arrByValue(arr1 *[5]int) {
    
     arr2 := arr1
     arr2[0] = 100
     arr2[1] = 300}
    

5、下面是切片的例子 (可变的数组)切片是引用传递

func main() {

    arr := []int{
1,3,5,6,7}
    
    bbb(arr) //没有使用&
 符号
    fmt.Print(arr[0])// 11 结果已经改变,说明数组是地址传递

    //就算不通过函数,也是引用传递
    //arr := []int{
1,3,5,6,7}

    //arr2 := arr
    //arr2[1] = 0
    //fmt.Print(arr)//[1 0 5 6 7]}
//aaafunc bbb(arr1 []int) {

   arr1[0] += 10}
    
  • (b)在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。



关于“go值传递与地址传递的方法是什么?”的内容就介绍到这,感谢各位的阅读,相信大家对go值传递与地址传递的方法是什么?已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注网络,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

gogolang

若转载请注明出处: go值传递与地址传递的方法是什么?
本文地址: https://pptw.com/jishu/654038.html
Angular变更检测的概念和原理是什么,执行策略包括哪些 JavaScript WebAPI包括哪些部分,用法是怎样

游客 回复需填写必要信息