60.笔记go语言——Go语言的传参和传引用
来源:互联网 发布:推广优化软件 编辑:程序博客网 时间:2024/05/22 17:18
60.笔记go语言——Go语言的传参和传引用
go 参数传递:函数参数全部是传值:即使传递的是指针,传递的也是指针的拷贝;闭包引用外部变量是引用
Go语言的函数调用参数全部是传值的, 包括 slice/map/chan 在内所有类型, 没有传引用的说法.
slice不是传引用
代码如下:
packagemain
import(
"fmt"
)
funcmain(){
a:=[]int{1,2,3}
fmt.Println(a)
modifySlice(a)
fmt.Println(a)
}
funcmodifySlice(data[]int){
data=nil
}
执行:
[1 2 3]
[1 2 3]
说明a在调用modifySlice前后并没有任何变化, 因此a必然是传值的!
传指针
代码:
packagemain
import(
"fmt"
)
funcmain(){
a:=new(int)
fmt.Println(a)
modify(a)
fmt.Println(a)
}
funcmodify(a*int){
a=nil
}
执行如下:
0xc0420381d0
0xc0420381d0
函数参数传传指针也是传值的,并不是传引用!
所有类型的函数参数都是传值的!
包括slice/map/chan等基础类型和自定义的类型都是传值的.
但是因为slice和map/chan底层结构的差异, 又导致了它们传值的影响并不完全等同.
Go语言有传引用的说法吗?
Go语言其实也是有传引用的地方的, 但是不是函数的参数, 而是闭包对外部环境是通过引用访问的.
代码如下:
packagemain
import(
"fmt"
)
funcmain(){
a:=new(int)
fmt.Println(a)
func(){
a=nil
}()
fmt.Println(a)
}
执行如下:
0xc0420381d0
<nil>
因为闭包是通过引用的方式使用外部环境的a变量, 因此可以直接修改a的值.
小结
函数参数传值, 闭包传引用!
slice含values/count/capacity 等信息, 是按值传递
按值传递的 slice 只能修改values指向的数据, 其他都不能修改
slice是结构体和指针的混合体
引用类型和传引用是两个概念
- 60.笔记go语言——Go语言的传参和传引用
- Go语言的传参和传引用[转]
- Go语言的传参和传引用
- Go语言的传参和传引用
- 61.笔记go语言——Go语言的nil值和nil
- 56.笔记go语言——go的函数类型
- 43.笔记go语言圣经——go语言特性
- 45.笔记go语言圣经——go语言变量
- 50.笔记go语言——go语言函数细节
- 51.笔记go语言——go语言数据结构
- 59.笔记go语言——go语言中的反射
- Go语言二维数组的传参
- 31.笔记go语言——go doc命令
- 42.笔记go语言圣经——go起源
- 46.笔记go语言圣经——go运行时
- 48.笔记go语言圣经——go图形化
- 55.笔记go语言——go类型
- Go语言学习笔记2——数组和Slice
- 死锁
- linux任务计划几个小命令
- 如何搭建自己的shadowsocks
- 59.笔记go语言——go语言中的反射
- Android中的回调
- 60.笔记go语言——Go语言的传参和传引用
- 接口
- 61.笔记go语言——Go语言的nil值和nil
- matlab极值与积分
- linux必学的命令
- 7-2 列车调度
- Android HttpUrlconnection数据请求
- 基于ueditor-1.1.1图片上传到项目外配置
- LeetCode63 Unique Paths II