普通的值传递
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 方法时候的内存地址图
执行MyArray方法之后的内存地址图
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;
}
地址没改变 值也没改变,看来与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;
}
*arrayPoint[0]=123; 这种方式能够改变 0x00004e250 地址所指向的值
1.值传递就是将普通的值传过来,在被处理的函数内部修改了参数也不会修改原来参数的值。 string类型就是值传递 和java一样
2.引用传递 目前测试过程当中 使用以下两种方式都不能达到引用传递的目的。
array1[0]=1234;
array1是数组类型 但是这样修改数组里面元素的值
var a int=1234;
array1[0]=&a;
array1是指针类型
这样想通过修改角标为0的地址值 然后达到修改值的目的 但是这样既不能修改地址,也不能修改值
正确的达到引用传递的目的应该是这种方式 *arrayPoint[0]=123; 这样是修改指针指向地址的值 不会修改指针的地址
由此可以大胆猜测 :
go语言想要达到引用传递的目的 是不是必须是指针作为入参,并且要通过*arrayPoint[0]=123 这种方式才能达到引用传递的目的?
我将在后续的学习过程当中继续验证这个问题。