上篇文章我们简易学了struct今天我们来继续深入的理解一下struct,为了更好的学些struct我们今天首选要先了解一下interface。
interface
首先在go的世界中有一个鸭子模型----走起来像鸭子,叫起来像鸭子那么他就是鸭子。接受了这个概念我们再来继续说interface:在interface的世界中有一个空的interface内部没有任何的行为只是声明了我是interface,那么按照鸭子模型理论go的世界中任何变量都天然的实现了这个空interface
在大家都接受了上面的理论之后我们来看看怎么定义一个interface
type A interface { show()string}
上栗中我们简单的定义了一个A接口和一个函数。我们对比一下struct的声明
1 关键字为interface
2 只声明了函数不实现
3 没有func关键字
下面我们看看怎么实现一个interface
type ASub struct { Name string}
func (asub ASub) show() string { return asub.Name}
//实例化var aInterface A aSub:=ASub{Name: "Jack",} aInterface = aSub aInterface.show()
上栗中我们直接给ASub添加两个个方法,这时候根据鸭子模型理论那么ASub就是A的子类啦
那么我们来看一下如何给我们自定的类实现自定义错误。在这个之前我们来看看go中的error是什么么?
type error interface { Error() string}
很明显它就是今天的讲解内容之一interface,那么根据鸭子模型理论我们怎么来实现自定义struct的error呢?答案是只需要实现Error()string方法
func (aSub *ASub) Error() string { return aSub.Name + "不能为空"}
我们只需要简单的实现即可,那么我们如何在fmt.Println(aSub)实现自定输出呢?
当然是实现String()string方法啦……
访问控制
在定义行为和成员属性时,我们有些需要内部使用不想在包外被别人访问该如何处理呢?
其实这个在go中有规定的:go规定所有的大写开头的都是公开默认被导出可包外访问的(自定的struct 全局变量 方法 属性都遵循这个规定)
到目前为止我们把go的语法基础基本都掌握啦,下面的章节就是一些理论和特性拔高的部分:Goroutines channel 以及基于共享的并发操作。希望到时候能够用简答的粒子和简短的文章给总结明白……