DAy 3 Go 基础 | 青训营笔记

78 阅读3分钟

Go 基础 | 字节青训营笔记01

vscode 配置GO

  • 官网下载Go msi
  • env 配置 cmd 输入 go env go 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{}字段