go语言中所有的传值方式都是传值操作。

今天遇到了以下代码:

func main(){
slice := make([]int ,,)
fmt.Println(slice)
change(s)
fmt.Println(slice)
} func change(s []int){
s = append(s,)
}

输出结果是:

    0

    0

当时感到有些疑惑,学c或c++时,传入的参数为指针(数组首地址)时,change内这种直接修改参数s方法时可以修改值的,那么为何在go中无效呢?

1.go语言中,所有的参数传递都是值传递。

什么意思?就是在函数传递值时,都会拷一个副本传递给函数进行操作,就算是引用类型或者指针也不例外。

例如:

func main(){
st := make([]int, 1, 1)
fmt.Printf("st 原始切片的地址为:%p\n", &st)
SliceTest(st)
} func SliceTest(s []int) {
fmt.Printf("st 传入后参数s的地址为:%p\n", &s)
s = append(s, )
}

在我的电脑上的输出为:

st 原始切片的地址为:0xc000004540
st 传入后参数s的地址为:0xc000004560

可以看到,go语言中仅仅拷贝了st的一个副本进入SliceTest函数中进行操作,并未操作st本身。

2.go语言的切片,实际上是指向一个底层的数组。

在进入SliceTest函数时,s和st指向的底层数组都一样。

但是,经过append的操作,s原本指向的底层数组不满足追加元素的条件,所以要开辟一个新的数组来进行追加操作。

于是,s会指向一个新的底层数组。

但是这些操作和原切片st完全无关,因为s仅仅是st的副本,它们的地址不一样,s指向了新的数组,st并未改变,所以就有了开篇那段代码的结果。

对go的传值理解进一步加深。

最新文章

  1. LinqToDB 源码分析——前言
  2. Matlab中^2和.^2的区别
  3. 【Java基础】并发
  4. ruby日记1
  5. iOS FMDB的使用
  6. Apache配置简单http认证
  7. Hibernate中的一级缓存、二级缓存和懒加载(转)
  8. 神奇的NOIP模拟赛 T3 LGTB 玩THD
  9. 1134 铺地毯【2011年NOIP全国联赛提高组】
  10. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.1.系统界面报错Gnome
  11. Python学习 之 OS模块
  12. 基于TCP协议的客户端
  13. while死循环问题-输入字符就会死循环
  14. 搭建本地 Registry - 每天5分钟玩转 Docker 容器技术(20)
  15. Oracle性能优化-读懂执行计划
  16. RabbitMQ中RPC的实现及其通信机制
  17. C# 截取两个字符串中间的子字符串
  18. jdk版本相关问题
  19. js 库
  20. Javascript Array和String的互转换。

热门文章

  1. java 集合遍历输出方式
  2. maven环境隔离
  3. P1110 变身
  4. 在后台管理系统中引入富文本编辑器 (vue-quill-editor)
  5. P1027 三角形的周长
  6. sci,ei,istp三大科技文献检索系统
  7. JQ表单选择器和CSS3表单选择器
  8. Iptables&Firewalld防火墙
  9. vagrant在windows下的安装和配置(二)
  10. UI自动化测试框架 ---TestCafe