GO值类型与引用类型
值类型
值类型包括基本数据类型,int,float,bool,string,以及数组和结构体(struct)。
值类型变量声明后,不管是否已经赋值,编译器为其分配内存,此时该值存储于栈上。
值类型的默认值:
var a int //int类型默认值为 0
var b string //string类型默认值为 nil空
var c bool //bool类型默认值为false
var d [2]int //数组默认值为[0 0]
fmt.Println(&a) //默认已经分配内存地址,可以使用&来取内存地址
当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝,可以通过 &i 获取变量 i 的内存地址。此时如果修改某个变量的值,不会影响另一个。
//变量的赋值
var a =10 //定义变量a
b := a //将a的值赋值给b
b = 101 //修改b的值,此时不会影响a
fmt.Printf("a的值是%v,a的内存地址是%p\n",a,&a) //a的值是10,a的内存地址是0xc42000e228
fmt.Printf("b的值是%v,b的内存地址是%p\n",b,&b) //b的值是101,b的内存地址是0xc42000e250
//数组的赋值
var c =[3]int{1,2,3} //定义一个长度为3的int类型的数组
d := c //将数组c赋值给d
d[1] = 100 //修改数组d中索引为1的值为100
fmt.Printf("c的值是%v,c的内存地址是%p\n",c,&c) //c的值是[1 2 3],c的内存地址是0xc42000a180
fmt.Printf("d的值是%v,d的内存地址是%p\n",d,&d) //d的值是[1 100 3],d的内存地址是0xc42000a1a0
画图示例:

引用类型
引用类型包括指针,slice切片,map ,chan,interface。
变量直接存放的就是一个内存地址值,这个地址值指向的空间存的才是值。所以修改其中一个,另外一个也会修改(同一个内存地址)。
引用类型必须申请内存才可以使用,make()是给引用类型申请内存空间。
var a = []int{1,2,3,4,5}
b := a //此时a,b都指向了内存中的[1 2 3 4 5]的地址
b[1] = 10 //相当于修改同一个内存地址,所以a的值也会改变
c := make([]int,5,5) //切片的初始化
copy(c,a) //将切片acopy到c
c[1] = 20 //copy是值类型,所以a不会改变
fmt.Printf("a的值是%v,a的内存地址是%p\n",a,&a) //a的值是[1 10 3 4 5],a的内存地址是0xc42000a180
fmt.Printf("b的值是%v,b的内存地址是%p\n",b,&b) //b的值是[1 10 3 4 5],b的内存地址是0xc42000a1a0
fmt.Printf("c的值是%v,c的内存地址是%p\n",c,&c) //c的值是[1 20 3 4 5],c的内存地址是0xc42000a1c0
d := &a //将a的内存地址赋值给d,取值用*d
a[1] = 11
fmt.Printf("d的值是%v,d的内存地址是%p\n",*d,d) //d的值是[1 11 3 4 5],d的内存地址是0xc420084060
fmt.Printf("a的值是%v,a的内存地址是%p\n",a,&a) //a的值是[1 11 3 4 5],a的内存地址是0xc420084060
a,b,c底层数组是一样的,但是上层切片不同,所以内存地址不一样。

GO值类型与引用类型的更多相关文章
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱
为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...
- 图解C#的值类型,引用类型,栈,堆,ref,out
C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...
- c# 我所理解的 值类型 and 引用类型
一直以来对于值类型和引用类型都只是一个模糊的概念,趁最近有空深入理解了下. 先说说值类型,在msdn上是这样介绍值类型的. 意思就是值类型直接包含值. 变量引用的位置就是值所在内存中实际存储的位置,所 ...
- JAVA初学(1):值类型和引用类型的区别
JAVA值类型和引用类型的区别(转) [定义] 引用类型表示你操作的数据是同一个,也就 ...
- C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...
- .NET面试题解析(01)-值类型与引用类型
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...
- Emit学习(2) - IL - 值类型和引用类型(补)
上周末回家去享受生活了, 工作是为了更好的生活嘛, 所以我把生活, 工作分的比较开. 这几天不是很忙, 在学习工作技能的同时, 发点博文, 也算是做一个学习笔记 上篇中, 贴出的地址里面那位哥, 也有 ...
- Swift 值类型和引用类型
Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组:二,引用类型(reference types),引用类型的实例共享 ...
- C# 值类型和引用类型
一.基本概念 C#只有两种数据类型:值类型和引用类型 值类型在线程栈分配空间,引用类型在托管堆分配空间 值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱 以下是值类型和引用类型对照表 从上图可 ...
随机推荐
- react_app 项目开发 (3)_单页面设计_react-router4
(web) 利用 react-router4 实现 单页面 开发 SPA 应用 ---- (Single Page Web Application) 整个应用只有 一个完整的页面 单击链接不会刷新页面 ...
- CUDA相关问题
之前装了GPU驱动后,再装了CUDA 9.0,再装了cuDNN,并且对样例mnistCUDNN进行执行,显示“Test passed!"通过.但是倒忘了有没有测试CUDA是否安装成功.驱动也 ...
- OO第二次阶段性总结
前两次作业我都无效了……用了很久时间但还是没能弄明白多线程的写法,以后还是要学会即时的多问问会的同学吧…… 以及我的Mertrics在挣扎很久之后还是用不了……跪了 第七次作业 第七次作业能够完成的原 ...
- Jumpserver之安装在CentOS主机步骤
环境 系统CentOS7.5 IP:172.16.90.248 关闭防火墙设置selinux systemctl stop firewalld setenforce 0 sed -i "s/ ...
- angularjs知识点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- table-一列细分为多列(合并单元格)
这个是一个很常见的一个表格展示需求,其中最要的就两个属性 rowspan 和 colspan .他们分别就是合并行 与 合并列. 要做的效果是如图下面这个,联系电话就是合并了单元格.这个说法类似于ex ...
- .net开发COM组件之组件签名&注册
基于.net的COM组件开发时,若采用vs强命名方式,则完成后试图将组件注册到XP系统(确切的说是.net4.0以下版本的系统) REGASM c:\libcom\dotnet\myCom.dll / ...
- 存储过程中拼接sql并且参数化
ALTER PROCEDURE [dbo].[proc_test] ( ) = ' order by id desc ', @userid int, @stime datetime, @etime d ...
- python练习题-day20
1.json.pickle.shelve三个区别是什么? 首先,这三个模块都是序列化工具. 1. json是所有语言的序列化工具,优点跨语言.体积小.只能序列化一些基本的数据类型.int\str\li ...
- 解决nohup中不写入日志的问题
(一)问题描述: nohup 你的程序命令 如: nohup python manage.py runserver 0.0.0.0:6789 (此shell窗口1不要关,另外开一个shell窗口2 ...