Golang中的struct还是有点意思的,相比于C++中的类型要好用很多。
Golang的数据成员放到一个struct中,又为该struct配上相应的方法,这就形成了封装数据成员和方法的class。
相比于C++,Golang没有继承,而是支持嵌套,以组合的形式完成相同的功能,这就使Golang的逻辑非常清晰。
遇到的问题
最近在写程序时碰到了一个小问题,让我困惑了一下。这里只是想判断fileMeta是否为空,便使用==nil来判断,但是发现struct不能和nil比较,原因是不能将nil转换为struct。
其实这个问题应该放在nil相关的问题中,但是思来想去还是放在struct里吧。(nil这个东西真的是,,一言难尽)
struct也不能赋值为nil,如 var s Student = nil ,会报错告诉我们不能这样分配。而struct指针是可以的,如var s *Student = nil
在琢磨这个问题的时候也找了不少资料,又对golang的struct有了新的认识,或者说是补充一些漏洞。
一、关于空结构体
空结构体是没有field的结构体类型,没有成员,如下所示。
var s Student{} type S Student {}
空struct的宽度为0,占据零字节空间。所以嵌套的空结构体还是占据零空间。
1. 空struct可以作为方法接收者来使用,如下。
type S struct{} func (s *S) addr() { fmt.Printf("%p\n", s) } func main() { var a, b S a.addr() // 0x1beeb0 b.addr() // 0x1beeb0 }
2. 空struct用于channel通知信号,不占用内存(是吗??),不能写入数据只能通过关闭进行输出,如进行同步。
ch := make(chan struct{})
3. 空struct作为array或map的值,不占用内存
var x [100]int var y [100]struct{} fmt.Println(unsafe.Sizeof(x)) //800 fmt.Println(unsafe.Sizeof(y)) //0
二、判断是否为空结构体
上面我遇到的问题最后是用过引入一个方法解决的。
func (f FileMeta) IsEmpty() bool { return reflect.DeepEqual(f, FileMeta{}) }
不能使用if判断,就干脆做一个方法自己去判断。 if IsEmpty() 来得到判断结果。
参考资料:
1. https://studygolang.com/articles/04106
2. https://studygolang.com/topics/7850?fr=sidebar
记录每天解决的小问题,积累起来去解决大问题。