Golang学习——struct的一些事情

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

 


记录每天解决的小问题,积累起来去解决大问题。 

你可能感兴趣的:(Golang基础学习)