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 方法时候的内存地址图
执行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 这种方式才能达到引用传递的目的?
我将在后续的学习过程当中继续验证这个问题。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfbbji
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01