「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」。
Go语言学习查缺补漏ing Day3
本文收录于我的专栏:《让我们一起Golang》
一、结构体的比较问题
我们先来看一段关于结构体的比较的代码:
1 | go复制代码package main |
你觉得编译时会报错吗?
啊这,出大问题。它说包含map的结构体不能被比较。
是的,只有包含bool类型、数值型、字符串、指针、数组等类型的结构体才能比较,而包含slice、map、函数其中任一项的结构体均不能做比较。
还有几点值得注意的是:
- 结构体之间只能比较它们是否相等,而不能比较它们的大小。
- 只有所有属性都相等而属性顺序都一致的结构体才能进行比较。
二、通过指针变量访问成员变量的几种方式
先看这段代码:
1 | go复制代码package main |
你觉得哪里会报错?
哦!是(&s2).name有点问题…..
因为&是取地址符,*是指针解引用符。所以将指针解引用才能访问到成员变量。
你会好奇为什么指针不解引用也能获取成员变量吗?其实是进行解引用了,这就是我们GO语言的强大之处了,它能够自动进行解引用,但是遗憾的是,只能解引用乙级指针,如果是多级指针,就得靠你自己了。
三、类型别名和类型定义的区别
1 | go复制代码package main |
是不是一眼就看出来问题所在了?
不过他们放在一起,你能马上分别哪个是类型别名,哪个是类型定义吗?
1 | go复制代码type Int1 int |
是定义了基于int类型创建了一个新类型,而
1 | go复制代码type Int2 = int |
是将Int2作为int类型的别名。
所以将会报如下错误:
这是因为Go是强类型语言,所以我们需要将int强制转换Int1类型就可以通过编译了。
四、切片的一个注意事项
1 | go复制代码package main |
看一看运行结果:
1 | csharp复制代码[7 8 9] |
什么?!! 没有append进去?这是因为append可能会导致内存的重新分配,我们就不能再确定append之前的切片与之后的切片是不是引用的相同的内存空间。
所以说这个执行fun1来append之后的切片a与外面的切片a不是同一个,所以查看外面的a,可以发现外面切片的内容没有改变。
五、Golang字符串连接的几种方式
1 | go复制代码package main |
这里提到了四种连接字符串的方式,第一种利用+号直接连接,第二种利用 fmt.Sprintf(),第三种是利用strings.Join(),第四种是利用buffer.WriteString()来进行字符串连接。
本文转载自: 掘金