go 语言值传递和引用传递

值传递

普通的值传递

package main
import "fmt"
func main(){
    fmt.Println(Hello("hello"," fpp"));
}
func Hello(stringName string,stringName2 string)(string){
    return stringName+stringName2;
}

在这里插入图片描述

string类型是引用传递吗?

package main
import "fmt"
func main(){
    stringName:="hello";
    stringName2:=" fpp";
    fmt.Println(Hello(stringName,stringName2));
    fmt.Println(stringName);
}
func Hello(stringName string,stringName2 string)(string){
    stringName="hell";
    return stringName+stringName2;
}

在这里插入图片描述

说明string类型是值传递

引用传递

传递一个数组

package main
import "fmt"
func main(){
    var array1 [2]int={1,2};
     MyArray(array1);
    var i int;
    for i=0;i<2;i++{
        fmt.Println(array1[i]);
    }
}
func MyArray(array1 []int){
    array[0]=1234;
}

在这里插入图片描述

运行报错 不能这样传参我笑了 习惯了java

我猜测要这样才能运行,必须指定长度

package main
import "fmt"
func main(){
    var array1 [2]int={1,2};
     MyArray(array1);
    var i int;
    for i=0;i<2;i++{
        fmt.Println(array1[i]);
    }
}
func MyArray(array1 [2]int){
    array1[0]=1234;
}

果然可以 但是并没有修改到数组的值 ,说明这不是我们想象的那种引用传递

疑问是不是只能传指针呢才能生效

package main
import "fmt"
func main(){
    var array1 [2]int={1,2};
    var array1Point *[2]int;
    var i int;
    //将数组的地址传给指针
    for i=0;i<2;i++{
        array1Point[i]=&array1[i];
    }
    MyArray(array1Point);
    for i=0;i<2;i++{
        fmt.Println(array1[i]);
    }
}
func MyArray(array1 [2]*int){
  var a int=1234;
   array1[0]=&a;
}

又报错了 我了个去

在这里插入图片描述

看了半天 原来指针的声明方式错了 应该是

var arrayPoint [2]*int;

修改代码重新试一试

package main
import "fmt"
func main(){
   array1:=[2]int{1,2};
   var array1Point [2]*int;
   var i int;
   for i=0;i<2;i++{
     array1Point[i]=&array1[i];
   }
   MyArray(array1Point);
   for i=0;i<2;i++{
    fmt.Println(*array1Point[i]);
  }
}
func MyArray(array1 [2]*int){
  var a int=1234;
   array1[0]=&a;
}

发现没有报错但是还是没有达到 引用传递的目的
在这里插入图片描述

这个类似 array1[0]=&a; 将变量a的地址 赋给指针array1[0]

但是貌似这个指针的值并没有发生改变非常奇怪啊

我理解变量a的地址指向 1234,并且把这个地址指向了这个array1指针,按理来说应该值会变啊 为啥不会变非常奇怪

我理解的 未执行MyArray 方法时候的内存地址图

go 语言值传递和引用传递_第1张图片

执行MyArray方法之后的内存地址图

go 语言值传递和引用传递_第2张图片
修改代码打印一下地址

package main
import "fmt"
func main(){
   array:=[2]int{1,2};
   var arrayPoint [2]*int;
   var i int;
   for i=0;i<2;i++{
    fmt.Printf("array 内存地址 %v",&array[i]);
    fmt.Println()
   }
   for i=0;i<2;i++{
      arrayPoint[i]=&array[i]
       fmt.Printf("point value %v,%v",*arrayPoint[i],&arrayPoint[i]);
        fmt.Println()
   }
   MyArray(arrayPoint);
    //遍历数组
    for i=0;i<2;i++{
        fmt.Printf("after point value %v,%v ",*arrayPoint[i],&arrayPoint[i]);
        fmt.Println()
    }
}

func MyArray(arrayPoint [2]*int){
    temp:=123;
    arrayPoint[0]=&temp;
}

go 语言值传递和引用传递_第3张图片

地址没改变 值也没改变,看来与java的引用传递还是不太一样,这个地址的传递应该不是我们想象当中的那种传递

再修改代码试试

package main
import "fmt"
func main(){
   array:=[2]int{1,2};
   var arrayPoint [2]*int;
   var i int;
   for i=0;i<2;i++{
    fmt.Printf("array 内存地址 %v",&array[i]);
    fmt.Println()
   }
   for i=0;i<2;i++{
      arrayPoint[i]=&array[i]
       fmt.Printf("point value %v,%v",*arrayPoint[i],&arrayPoint[i]);
        fmt.Println()
   }
   MyArray(arrayPoint);
    //遍历数组
    for i=0;i<2;i++{
        fmt.Printf("after point value %v,%v ",*arrayPoint[i],&arrayPoint[i]);
        fmt.Println()
    }
}
func MyArray(arrayPoint [2]*int){
    *arrayPoint[0]=123;
}

go 语言值传递和引用传递_第4张图片

*arrayPoint[0]=123; 这种方式能够改变 0x00004e250 地址所指向的值

总结

1.值传递就是将普通的值传过来,在被处理的函数内部修改了参数也不会修改原来参数的值。 string类型就是值传递 和java一样

2.引用传递 目前测试过程当中 使用以下两种方式都不能达到引用传递的目的。

  1. array1[0]=1234;   
    array1是数组类型 但是这样修改数组里面元素的值
    
  2. var a int=1234;
    
    array1[0]=&a;   
    
    array1是指针类型
    
    这样想通过修改角标为0的地址值 然后达到修改值的目的 但是这样既不能修改地址,也不能修改值
    

正确的达到引用传递的目的应该是这种方式 *arrayPoint[0]=123; 这样是修改指针指向地址的值 不会修改指针的地址

由此可以大胆猜测 :

go语言想要达到引用传递的目的 是不是必须是指针作为入参,并且要通过*arrayPoint[0]=123 这种方式才能达到引用传递的目的?我将在后续的学习过程当中继续验证这个问题。

你可能感兴趣的:(#,go基础,golang)