值类型与引用类型

不管是Java还是golang中,都有值类型和引用类型的概念。在使用两者时,发现这两种语言之间还是有差异的。

值类型

值类型:这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址。 值拷贝

引用类型

引用类型:引用类型拥有更复杂的存储结构:(1)通过make创建并分配内存 (2)初始化一系列属性:指针、长度、哈希分布、数据队列等。一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个元素所在的位置,这个内存地址被称之为指针,这个指针实际上也被存在另外的某一个变量中。

区别

值类型和引用类型两者之间的主要区别:拷贝操作和函数传参。

数组array和切片slice的实例

1)如下代码片段定义了一个数组a,它是值类型,复制给b是值拷贝copy,当b发生变化后a并不会发生任何变化,程序的执行结果如下所示:

//由 main 函数作为程序入口点启动
func main() {a :=[5]int{1,2,3,4,5}    //数组Array类型,带有具体的长度b := a   //值拷贝,等价于a :=[5]int{1,2,3,4,5}, b :=[5]int{1,2,3,4,5}b[2] = 6 //b :=[5]int{1,2,3,4,5},b[2]=8, b = [5]int{1,2,6,4,5}fmt.Println(a, b)
}

程序运行结果:
[1 2 3 4 5] [1 2 6 4 5]

2)切片则不然,由于切片是引用类型,其拷贝(赋值)属于址拷贝,所以其中一个元素的值发生变化,拷贝的另一方也会发生改变。
//由 main 函数作为程序入口点启动

func main() {a :=[]int{1,2,3,4,5}  //切片Slice类型,不带长度b := a                //址拷贝b[2] = 6              fmt.Println(a, b)
}

分析:
切片的底层数据结构其实是一个指针,切片a和b本质上指向同一个底层数组。
程序运行结果:
[1 2 6 4 5] [1 2 6 4 5]

golang中的struct类型

Golang中没有class关键字来定义类,对于事物的抽象以struct来定义,因此一个struct变量可以被看做一个类实例。但是这有别于java,因为struct在方法中传参时是值类型而非引用类型,所以当我们需要在方法内改变这个对象的字段值时,应该使用的是struct变量的指针,而非struct变量。例如:

type Student struct{Name string
}func (s * Student) Set(name string){s.Name = name
}
func (s Student) Get()string{return s.Name
}

原文链接:https://blog.csdn.net/zerro99/article/details/11525757

由上可知:

  • 如果方法内部会修改当前对象的字段或改变其值,需要用指针。
  • 由于值传递是(内存)复制,因此,如果对象比较大,应该使用指针(地址),避免内存拷贝(值类型等变量指向内存中的值,如果有值类型变量存放大量元素,或造成内存的大量拷贝)。

注意:不见得使用指针就一定好过传值,因为按照 Go 的内存管理策略,涉及指针和引用的对象会被分配到 GC Heap 上。如果对象很 “小”,显然要比在栈上进行值拷贝 “耗费” 更多。

与Java差异

另外与java不同的一点,数组Array在golang里并不被当做引用类型传递,而是值类型传递。按照Golang的说法,Golang中所有的基本类型都属于值类型,但是有几个类型比较特殊,表现出引用类型的特征,分别是slice、map、channel、interface,除赋值以外它们都可以当做引用类型来使用。因此当我们这样做时,可以直接使用变量本身而不用指针:

type MyMap map[string]stringfunc (s  MyMap) Set(name,value string){s[name] = value
}func (s MyMap) Get(name string)string{return s[name]
}

上面的例子由于MyMap是一个map,而map是引用类型,因此在方法中作为参数使用时可以直接使用MyMap来改变其值,而不用使用MyMap的指针,其实map本身是一个字典的指针。

golang中的值类型和引用类型相关推荐

  1. .NET中的值类型与引用类型

    .NET中的值类型与引用类型 这是一个常见面试题,值类型(Value Type)和引用类型(Reference Type)有什么区别?他们性能方面有什么区别? TL;DR(先看结论) 值类型 引用类型 ...

  2. 述说C#中的值类型和引用类型的千丝万缕

    关于值类型和引用类型方面的博客和文章可以说是汗牛充栋了,今天无意中又复读了一下这方面的知识,感觉还是有许多新感悟的,就此时间分享一下: CLR支持两种类型:值类型和引用类型,看起来FCL的大多数类型是 ...

  3. C#中的值类型和引用类型

    文章目录 1 C#中的值类型 1.1 值类型示例程序 1.2 值类型(基本数据类型)的变量使用特点 2 C#中的引用类型 2.1 引用类型数据程序示例 2.2 引用数据类型的变量使用特点 3 变量类型 ...

  4. Windows Phone 开发起步之旅之二 C#中的值类型和引用类型

    今天和大家分享下本人也说不清楚的一个C#基础知识,我说不清楚,所以我才想把它总结一下,以帮助我自己理解这个知识上的盲点,顺便也和同我一样不是很清楚的人一起学习下.  一说起来C#中的数据类型有哪些,大 ...

  5. .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型

    C#中有谈到两种类型,值类型和引用类型(其实是CLR支持两种类型). 值类型包括:简单类型(int ,double,long,bool,char等,string除外),struct,enum 引用类型 ...

  6. Java 基础 —— Java 中的值类型与引用类型

    一.值类型与引用类型 在 Java 中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如 int.double 等),而引用类型是指除了基本的变量类型之外的所有类型(如通过 class 定 ...

  7. python中的引用类型_Python中的值类型与引用类型

    其实各个标准资料中没有说明Python有值类型和引用类型的分类,这个分类一般是C++和Java中的.但是语言是相通的,所以Python肯定也有类似的.实际上Python 的变量是没有类型的,这与以往看 ...

  8. C#中的值类型(value type)与引用类型(reference type)的区别

    ylbtech- .NET-Basic:C#中的值类型与引用类型的区别 C#中的值类型(value type)与引用类型(reference type)的区别 1.A,相关概念返回顶部 C#中有两种数 ...

  9. string:值类型?引用类型?[转]

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上下两章, ...

最新文章

  1. 网闸与防火墙的区别是什么
  2. Extjs 动态生成表格
  3. maven 关联源码插件_繁琐的任务简单化,Maven的插件机制
  4. Android之用Intent.FLAG_ACTIVITY_CLEAR_TOP解决界面重复拉起问题
  5. 女孩看男孩VS男孩看女孩
  6. mysql链式复制_MySQL主从服务器链式复制配置(ubuntu)
  7. 神经网络中的Softmax激活函数
  8. 自定义双向线性插值滤子(卷积核)code
  9. 珍大户《认知世界的经济学》学习笔记 -- 第21课 利率的计算 更新时间2021年07月27日22:14:34
  10. 我看大学培训机构--大学生到底要不要参加培训机构 一个参加培训的大学生的真实感受
  11. CNCC——多模态会议
  12. Zabbix设置主动模式与被动模式
  13. css 中划线,原价样式
  14. 仿新浪微博发布时 @ 及 #某话题# 的效果
  15. Scratch五子棋
  16. 方法功能增强 - 继承、装饰者模式、动态代理
  17. android接入华为推送
  18. 20190401工作计划
  19. 数据分析报告1:某电商店铺印度销售情况分析
  20. Windows 12 UI界面抢先看

热门文章

  1. BDB (Berkeley DB)数据库简介(转载)
  2. ESP UART 介绍
  3. linux /etc/security/login.cfg,AIX用户管理
  4. Debian虚拟机安装常用软件
  5. 深度学习 3d人脸 重建_深度学习实时3D人脸跟踪
  6. 交易日九点到九点半的挂单撤单以及价格的一点心得
  7. List Set Map
  8. 计算网格中直线经过的格子
  9. Anroid 逆向工具
  10. tf SavedModel 转换为 可使用 tfjs 加载 的形式