golang变量常见问题总结

news/2024/10/11 13:22:59/

文章目录

      • 1. 值类型和引用类型都有哪些
      • 2. 值类型和引用类型的区别
      • 3. 变量是否等于nil
      • 4. 能否进行等值比较
      • 5. 能否不分配内存直接添加元素

1. 值类型和引用类型都有哪些

值类型:int,string,bool,float,数组,结构体;
引用类型:切片,channel,map,接口类型,函数,指针。

2. 值类型和引用类型的区别

  • 对于值类型来说:当我们将一个值类型的变量赋值给另一个变量时,这个值会被复制。如果后续我们改变其中一个变量的值,另一个变量的值则不会受到影响。同样,当我们传递一个值类型的变量到函数中时,函数会得到这个值的一个复制,而不是原始的值。
  • 对于引用类型:当我们将一个引用类型的变量赋值给另一个变量时,这个引用(也就是这个变量指向的内存地址)会被复制。所以,如果我们改变引用类型变量的值,所有引用这个地址的变量都会看到这个改变。同样,当我们传递一个引用类型的变量到函数中时,函数会得到真实值的一个引用,所以函数内对其做的任何改变,调用者都能看到。

3. 变量是否等于nil

对于引用类型的变量如果只是var定义变量并且没有分配内存赋值,那么就是nil。

s1 := make([]int, 10)
var s2 []int
fmt.Println(s1 == nil) // false
fmt.Println(s2 == nil) // true 
mp1 := make(map[int]int)
var mp2 map[int]int
fmt.Println(mp1 == nil) // false
fmt.Println(mp2 == nil) // true 
ch1 := make(chan int, 5)
var ch2 chan int
fmt.Println(ch1 == nil) // false
fmt.Println(ch2 == nil) // true 
var i interface{}
var j interface{}
j = 5
fmt.Println(i == nil) // true 
fmt.Println(j == nil) // false

4. 能否进行等值比较

结论:
函数类型、map 类型和切片只支持与 nil的比较,而不支持同类型两变量的比较,否则会编译报错。
channel类型,interface类型、数组类型支持两个相同变量比较。
struct比较特殊,一定情况下可以进行等值比较。
原因:

  1. 切片、map 和函数:只能与 nil 进行比较,它们之间无法进行相互比较。这是由于这些类型的数据结构是动态的,在进行比较时需要做复杂的深度比较,会非常耗时。例如,即使两个切片包含完全相同的元素,它们也可能在内存中的不同位置。
  2. channel:可以进行相互比较也可以与nil进行比较。这主要是因为比较的是channel的引用(即内存地址),而不是channel中的数据。如果两个channel引用相同,那么比较结果为true。
  3. 接口:接口类型既可以与nil进行比较,也可以进行相互比较。如果两个接口值具有相同的动态类型,并且动态值相等,那么两个接口值将被视为相等。
  4. 数组:如果两个数组类型定义相同(即长度和元素类型都相同),那么它们就可以进行比较。比较会按照元素顺序进行,一旦找到第一对不相等的元素,比较就会停止、还要注意,尽管可比较,但是比较大数组可能会非常耗费性能,因为必须检查每个元素是否相等。因此,通常建议仅在必要时对数组进行比较。
  5. 结构体:相同类型(属性类型相同且属性顺序相同)的结构体才能进行比较,并且只有结构体中的字段类型都是可以支持比较的类型是才可以进行等值比较。

5. 能否不分配内存直接添加元素

切片可以通过下面的操作使用,也可以make函数创建切片变量并初始化。

var s []int
s = append(s, 100)

map不能直接var定义完后使用,需要make函数初始化才能使用。
channel也不能不能直接var定义完后使用,需要make函数初始化才能使用。


http://www.ppmy.cn/news/1443478.html

相关文章

Zynq 7000 系列中的BootROM流程及BootROM Header简介

BootROM Code是在系统复位后执行的一段代码,用于配置PS(处理器系统)。本文将详细解释BootROM的启动过程及BootROM Header的格式。 1 BootROM流程 Zynq 7000在系统复位后进行配置。整个启动过程在图6-1中进行了说明,而BootROM的执…

XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台

XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台 摘要 随着信息技术的迅速发展,快速构建高质量、高可靠性的企业级应用成为了迫切需求。XBoot,作为一个基于Spring Boot 2.x的一站式前后端分离快速开发平台,通过整合微信…

word 第十四课

管理工作表数据 数据排序:Excel可以对整个数据表或选中的单元格区域中的数据按文本、数字或日期和时间等进行升序或降序排列。数据筛选:使用筛选可使数据表中仅显示满足条件的行,不符合条件的行将被隐藏。Excel提供了两种数据筛选方式&#…

OpenNJet产品体验丨从零部署一个炫酷的Web服务器

本文记录了使用OpenNJet从零部署一个Web服务器的心得体会。 OpenNJet官方网站:https://njet.org.cn/ 一、基本信息 产品名称 OpenNJet 体验版本 2.1.0 体验设备 VMware16Ubuntu18.04 体验时间 2024.4.23 体验耗时 1.5 h 二、产品信息 产品简介&#x…

瓦片编辑器成功移植到小熊猫C++ 2.25.1版本,解决_findnext移植问题

移植之后出现绿色屏幕闪退 查了版本回滚直到不闪退,发现是在读取自定义文件上出问题 然后在找读取自定义文件函数,发现是读取图片部分出问题 然后就卡住了 调试半天,不是数据溢出,于是就看 函数_findnext,网上搜 ———_findn…

Scala 重难点总结

目录 一. 难点总结1. 数据类型2. 函数与方法的区别3. object、class、case class、case object、package object4. 伴生对象和 apply() 到底有什么用5. 模式匹配 unapply(),case class 和 偏函数6. 隐式转换7. 泛型 二.参考文章 一. 难点总结 1. 数据类型 def test…

代码+视频,R语言绘制生存分析模型的时间依赖(相关)性roc曲线和时间依赖(相关)性cindex曲线

ROC曲线分析是用于评估一个因素预测能力的手段,是可以用于连续型变量分组的方法。在生存分析中,疾病状态和因素取值均会随时间发生变化。而标准的ROC曲线分析将个体的疾病状态和因素取值视作固定值,未将时间因素考虑在分析之中。在这种情况下…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序,然后通过这些小程序的实现来回顾复习我们之前学过的知识,然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…