Go类型零值及初始化

前言

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

零值

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

基础类型的零值

基础类型零值
boolfalse
uint/uint8/uint16/uint32/uint640
int/int8/int16/int32/int640
float32/float640
complex64/complex1280(就是0+0i)
uintptr0
byte0(对应空字符’’)
rune0
string“”

组合类型的零值

组合类型零值
interfacenil
slicenil
array定长的指定类型的零值的集合
mapnil
channil
struct内部属性所有零值的集合
funcnil
所有类型的指针类型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<len,j<len2,target为指定值

注意:因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<len,j<len2,target为指定值

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

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开发相关内容,望大家感兴趣的支持一下,在此特别感谢。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值