获得徽章 0
#青训营 x 字节后端训练营#
一. 零值、空值、空切片与空结构
1.零值
- 值类型 → [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**
```go
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**
- 可以有两种方式解决,可以分别将类型和值分别和nil比较或者使用反射包reflect
一. 零值、空值、空切片与空结构
1.零值
- 值类型 → [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**
```go
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**
- 可以有两种方式解决,可以分别将类型和值分别和nil比较或者使用反射包reflect
展开
评论
1