Go类型零值及初始化

前言

Go作为一门强类型语言,入门就是要了解类型,有了类型,就可以声明变量、func,实现功能。对于类型而言,首要就是了解其零值。

零值

零值是变量没有做初始化时系统默认设置的值。

基础类型的零值

基础类型 零值
bool false
uint/uint8/uint16/uint32/uint64 0
int/int8/int16/int32/int64 0
float32/float64 0
complex64/complex128 0(就是0+0i)
uintptr 0
byte 0(对应空字符’’)
rune 0
string “”

组合类型的零值

组合类型 零值
interface nil
slice nil
array 定长的指定类型的零值的集合
map nil
chan nil
struct 内部属性所有零值的集合
func nil
所有类型的指针类型 nil

初始化

一个变量的使用决定了如何声明及初始化。

本文主要说下常见的几种类型的初始化及使用注意点。

slice

slice的零值为nil,nil的slice的len与cap均为0。

nil的slice只能使用append、len、cap等操作,若要直接对具体位置的子元素进行修改则需要使用进行初始化(零值append后也可以修改,不过需判断len是否满足位置条件)。

初始化有两种方式,手动与make构造,主要分别用以固定数据与可变数据。

手动构造

直接构造指定长度的slice,优点是如果是确定且不会变更的数据更简单快捷,缺点是变更的数据需要手动写入一定长度数量的零值,代码可读性变差。

    slice := []int{1,2,3,4}
    var slice = []int{1,2,3,4}

//或者
    var slice []int
    slice = []int{1,2,3,4}

make构造

make的优势是可以指定slice的长度与容量,对于不确定的数据,代码可读性,非常好,对于固定的数据反而不适宜使用。

slice := make([]typ,len,cap)
//typ为子元素类型,len为长度,cap为最大容量

对于二维及多维slice,在操作时需要注意,每一维的零值均是slice,如若要设置/修改指定维的子元素,则需要确认上层至指定维均独立完成初始化。

var matrix [][]int
matrix = make([][]int,len,cap)
for i:=0; i<len; i++ {
    matrix[i]=make([]int,len2)
}
matrix[i][j] = target // i

注意:因slice是引用类型,初始化子元素时不可直接使用已完成初始化的子slice。

var matrix [][]int
matrix = make([][]int,len,cap)
child := make([]int,len2)
for i:=0; i<len; i++ {
    matrix[i] = child
}
matrix[i][j] = target // i

以上操作会造成每一同级维的数据均发生修改。

map

对nil的map进行读取与删除操作不会发生panic,若要设置/修改数据则必须使用初始化。

读取时为确认数据是否存在,使用带ok的模式读取。

if data,ok := m[key];ok {

}

初始化也有两种方式,手动与make构造,主要分别用以固定数据与可变数据。

手动构造map

    m := map[string]int{"key":1}
    var m = map[string]int{"key":1}

//或者
    var m map[string]int
    m = m map[string]int{"key":1}

make map

var m map[string]int
m = make(map[string]int,len)

chan

对nil的chan可以进行receive操作(但会造成阻塞),不能进行send及close,否则会造成panic。

chan只能通过make构造。

var ch chan int
ch = make(chan int,cap)

对于非nil的chan receive时为确认数据是否存在,使用带ok的模式读取。

if r, ok := <-ch; ok {

}

注意:chan close后并不会变为nil,close后可以直接从chan中receive到数据(chan中有缓存数据则receive缓存,没有则是receive管道数据类型的零值)。

指针类型的初始化

指针类型的初始化,可以先初始化其非指针类型,再取地址。

var t *typ

t = &typ

总结

本文主要总结了常见的基础类型及组合的零值及使用过程中相关初始化的问题。

公众号

鄙人刚刚开通了公众号,专注于分享Go开发相关内容,望大家感兴趣的支持一下,在此特别感谢。

你可能感兴趣的:(golang)