Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。且传参和赋值(=)的操作本质是一样的。

拷贝的内容分为  非引用类型 和 引用类型 两种类型

非引用类型:int、string、struct、array  这样就不能修改原内容数据。

引用类型:指针、map、slice、chan ,这样就可以修改原内容数据。

实例:

slice

package mainimport ("fmt"
)func test(input []int) []int{// input: 0x40c110->{address, 4, 4}fmt.Printf("Slice inside address: %p\n", &input)// input: 0x40c110->{address, 4, 4},但对address的修改影响到了val:0x40c0e0->{address, 4, 4}input[0] = -1input = append(input, 5)// input: 0x40c110->{address, 5, 8},但val仍然为0x40c0e0->{address, 4, 4}fmt.Println(input, len(input), cap(input))return input
}func main() {// val:0x40c0e0->{address, 4, 4}val := []int{1, 2, 3, 4}fmt.Printf("Slice outside address: %p\n", &val)fmt.Println(val, len(val), cap(val))copyVal := test(val)fmt.Printf("Slice outside address: %p\n", &val)fmt.Println(val, len(val), cap(val))fmt.Printf("CopySlice address: %p\n", &copyVal)fmt.Println(copyVal, len(copyVal), cap(copyVal))
}

结果:

Slice outside address: 0x40c0e0
[1 2 3 4] 4 4
Slice inside address: 0x40c110
[-1 2 3 4 5] 5 8
Slice outside address: 0x40c0e0
[-1 2 3 4] 4 4
CopySlice address: 0x40c100
[-1 2 3 4 5] 5 8

结论:
传入的是slice三元组的值拷贝,返回的slice三元组值拷贝给外部变量

map

map的原理跟slice类似

package mainimport "fmt"func ChangeMap(input map[int]string) {input[2] = "changed"input[3] = "itsname"delete(input, 1)fmt.Printf("Inside input address: %p | %v\n", &input, input)
}func main() {tmpmap := make(map[int]string)tmpmap[1] = "myname"tmpmap[2] = "yourname"fmt.Printf("Before change input address: %p | %v\n", &tmpmap, tmpmap)ChangeMap(tmpmap)fmt.Printf("After change input address: %p | %v\n", &tmpmap, tmpmap)
}

结果:

Before change input address: 0x40e128 | map[2:yourname 1:myname]
Inside input address: 0x40e148 | map[2:changed 3:itsname]
After change input address: 0x40e128 | map[2:changed 3:itsname]

struct

struct跟slice和map不同,它是非引用类型

package mainimport "fmt"func main() {p:=Person{"张三"}fmt.Printf("Before change p address: %p | %v\n", &p, p)modify(p)fmt.Printf("After change p address: %p | %v\n", &p, p)
}type Person struct {Name string
}func modify(p Person) {p.Name = "李四"fmt.Printf("Inside change p address: %p | %v\n", &p, p)}

结果:

Before change p address: 0xc000010200 | {张三}
Inside change p address: 0xc000010220 | {李四}
After change p address: 0xc000010200 | {张三}

golang 函数 传入返回 slice/map/struct 本质相关推荐

  1. Go语言自学系列 | golang函数的返回值

    视频来源:B站<golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]> 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! ...

  2. golang中如何比较struct,slice,map是否相等以及几种对比方法的区别

    一.前言 对比两个struct或者map,slice是否相等是大家经常会有的需求,想必大家也都接触过很多对比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等. 这么多 ...

  3. golang 函数一 (定义、参数、返回值)

    对于GoLang函数的定义或者说理解: 函数是结构化编程中最小的模块单元,日常开发过程中,将复杂的算法过程分解为若干个小任务(代码块),使程序的结构性更清晰,程序可读性提升,易于后期维护和让别人读懂你 ...

  4. java map 多个值_java 一个函数EnumMap返回多个值

    在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过 ...

  5. 【Go ~ 0到1 】 第三天 6月27 slice,map 与 函数

    1. 切片 1.1 切片的定义 切片指向了底层的一个数组 1.2 切片的长度 切片的长度等于切片元素的个数 1.3 切片的容量 切片的容量是底层数组从切片的第一个元素到最后一个元素的数量 //默认情况 ...

  6. python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)

    python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...

  7. golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值...

    不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) {return } 通过函 ...

  8. python中map函数返回值类型_Python函数精解:map函数

    描述 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表. 语法 m ...

  9. Python进程池之pool.map()函数传入多参数

    一 定义与解释 对于python代码,多线程其实是个假的,因为每次计算的时候,实质上只有一个线程计算.使用多线程时,是几个线程之间切换计算,就像轮班工作一下,适合处理I/O密集型的任务. 对于pyth ...

最新文章

  1. 第一百零二节,JavaScript函数
  2. canvas画出简陋版随鼠标转动眼睛且会眨眼的可爱樱桃小丸子
  3. phpmyadmin的安装部署
  4. uva 10120——Gift?!
  5. k均值例子 数据挖掘_人工智能、数据挖掘、机器学习和深度学习的关系
  6. Java 异常种类及处理方法
  7. java瞎子_Java学习路线,及各方面知识点
  8. 使用 XML Schema 定义元素的基本知识--1
  9. 微软Windows7将捆绑杀软 众厂商面临生死抉择
  10. IntentService简介
  11. C++ ../ ./的区别
  12. c语言简单程序过程,怎样编写一个简单的C语言程序的全过程
  13. 如何同时将多张图片进行批量无损压缩、调整尺寸及调整大小
  14. VSCode远程控制服务器
  15. python36 +tkinter制作12306火车票查询系统
  16. XGBOOST与GBD区别笔记
  17. 从阿里云dms导出mysql无法导入_MySQL数据库怎么导入数据?怎么用DMS导入数据?...
  18. ArcGIS软件CAD数据通过转换建立GIS数据库
  19. Python判断一个词语是不是人名
  20. 如何解决SQL Server2008不允许保存修改的问题

热门文章

  1. 用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务
  2. NanoPi NEO Air使用十六:使用python做开发
  3. Yii2 定时任务创建(Console 任务)
  4. 用百度SDK获取地理位置和天气信息
  5. 【云快讯】之四十五《Google在云服务领域认输?不,我们的重点是大数据》
  6. C++ 容器vector的范例学习
  7. apache 修改最大连接数
  8. 在Java中连接字符串时是使用+号还是使用StringBuilder
  9. python之路day05--字典的增删改查,嵌套
  10. Hibernate5.x Idea搭建