Go 基础 | 字节青训营笔记01
vscode 配置GO
- 官网下载Go msi
- env 配置 cmd 输入
go envgo version确认是否安装成功 - 安装go 插件
- 创建一个go 目录
.零值
- 值类型 → [Bool: false] [Number: 0] [String: “”] ,初始值取决于元素或字段
- 引用类型 → 均nil ,包括pointer指针、function函数、interface接口、slice切片、channel管道、map映射
- 考虑安全性,通常需要为变量赋予一个默认值,例如
go复制代码package main
import "sync"
type Value struct {
mu sync.Mutex //互斥锁类型,保护共享资源的并发访问
val int
}
//递增操作的方法
func (v *Value)Incr(){
defer v.mu.Unlock() //解锁
v.mu.Lock() //上互斥锁,确保只有一个goroutine能进入临界区
v.val++
}
func main() {
var i Value //默认0值
i.Incr()
}
// 主要实现互斥锁(Mutex)实现并发安全的操作
// 使用了互斥锁,保证了对共享资源的安全访问,避免了并发访问导致的数据竞争和不一致性。
⚠️::= 是声明并且初始化变量,已经被分配了内存地址,故不是零值nil
ini复制代码var s1 []string
s2 := []string{} // 或者等同于 var s2 = []string{}
//其中,s1、s2输出都为 -> [],但一个是零值nil,一个是空字符串
fmt.Println(s1 == nil) // true
fmt.Println(s2 == nil) // false
2.nil
-
主要是用来表示引用类型的零值,是Golang的标识符
-
nil ≠ nil 问题原因 → interface
- inteface有两个属性Type and Value
ini复制代码var p *int // (T=*int,V=nil) var i interface{} // (T=nil,V=nil) fmt.Println(p == i) //(T=*int, V=nil) == (T=nil, V=nil) -> false- 可以有两种方式解决,可以分别将类型和值分别和 nil 比较或者使用反射包 reflect
3.空切片
-
空切片是没有分配任何底层数组内存 → 空切片的本质可以看作是一个指向底层数组为nil的切片结构。
-
应用场景:初始值、切片操作、避免空指针异常
- 切片没有合适的元素返回值则会返回空切片
- 切片操作没有合适返回值则会返回空切片
- 使用空切片,我们可以避免访问未分配底层数组的切片时出现空指针异常,简化代码逻辑
⚠️:nil和空切片
nil:描述一个不存在的 nil 切片。比如函数在发生异常的时候,返回的切片就是 nil 切片。nil 切片的指针指向 nil。
空切片:空切片一般会用来表示一个空的集合。比如数据库查询,一条结果也没有查到,那么就可以返回一个空切片。
对比总结:空切片指向的地址不是nil,指向的是一个底层数组内存地址,但是它没有分配任何内存空间,即底层元素包含0个元素。而nil切片指针指向的地址是nil,ptr指针不指向任何底层数组,这也是和空切片的本质区别
4.空结构
-
是没有任何字段的结构类型
-
主要应用场景:
- 使用 chan struct{} 代替 chan bool 在 goroutines之前传递信号。不用担心返回结果true或false傻傻分不清,只关心发生与未发生
- 防止unkeyed初始化结构,添加_ struct{}字段