1.结构体
在golang里,没有类的概念,但是如果非要实现像类那样的例子,那或许就是结构体了,结构体是一系列变量的集合,
定义
type s_name struct {
v_name1 v_type1
v_name2 v_type2
}
声明结构体类型的变量
var name = s_name{v_value1, v_value2}
//或者
var name = s_name{v_name1: v_value1, v_name2: v_value2}
可是这跟类比,还少类方法啊,的确,不过golang也能给结构体加上方法。
2.方法
golang里,方法就是带有接收者的函数,何为接收者,即是任意类型(结构体,指针,接口等)的实例。函数跟类型绑定,即成了方法
定义
type Person struct {
name string
age int
}
//此处Person类型的person是sayHello方法的接收者,以后person可以调用此方法。
func (person Person) sayHello {
fmt.Println("hello,goodmorning")
}
person.sayHello()
//结构体在定义的时候,并没有定义方法,但是通过上面的操作,就好像是该方法是结构体自己定义的一样。有点反客为主的意思。
把图内文字换一下就是
方法:你有方法嘛?结构体
结构体:没有
func (s Struct) Func {}
方法:那从现在起,你已经有了
当然方法不只是能绑定在结构体上,还能有很多类型。
3.接口
duck typing:假如,我认为黄色的,长的像鸭子的动物都算是鸭子,那么以后,只要是黄色的,长的像鸭子的东西,无论有没有生命,大小如何,他在我的范畴里都是鸭子。
duck typing 描述事物的外部行为而非内部结构,为多态的一种形式。是从使用者的角度来看的。如果我认为长得像鸭子的东西是鸭子,那么任何长的像鸭子的事物在我眼中就是鸭子
接口是一组方法签名的集合,体现的是泛型的思想。
接口是隐式实现的,只要实现了接口里的方法,就相当于实现了接口,即只要长的像鸭子,那么就是鸭子。
type if_name interface{
method1()
method2()
}
type S1 struct {}
func (s1 S1) method1() {}
func (s1 S1) method2() {}
s1实现了method1(),method2()方法,那么也就意味着S1实现了if_name这个接口,那么以后if_name就可以视为S1类型,反之亦然,如果多个类型都实现了两个方法,那么多个类型都可视为if_name类型,那么if_name就可以当做很多类型使用,这也许能称之为泛型吧。那么定义这样一个接口类型的数组,即可以装下各种实现了接口所有方法 的不同类型了。