这是我参与「第五届青训营 」笔记创作活动的第14天.
go结构体的嵌套:
go语言没有面向对象编程思想,也没有继承关系,但是可以通过结构体嵌套来实现这种效果.
type Dog struct {
name string
age int
colour string
}
type Person struct {
dog Dog
name string
age int
}
dog := Dog{
name: "huahua",
age: 6,
colour: "black",
}
per := Person{
dog: dog,
name: "zhangsan",
age: 12,
}
go方法:
go语言没有面向对象的特性,也没有类对象的概念,但是,可以使用结构体来模拟这些特性,我们都知道面向对象里面有类方法等概念,我们也可以声明一些方法,属于某个结构体.
go语言方法的语法:
go中的方法是一种特殊的函数,定义于struct之上(与struct关联,绑定),被称为struct的接受者,通俗的讲,方法就是有接收者的函数.
语法格式如下:
type mytype struct {
func(recv mytype)my_method(para) return_type{}
func(recv *mytype)my_method(para) return_type{}
}
mytype:定义一个结构体
recv:接受该方法的结构体
my_method:方法名称
para:参数列表
return_type:返回值类型
从语法格式可以看出,一个方法和一个函数非常类似,多了一个接受类型.
import "fmt"
type Person struct {
name string
}
func (per Person) eat() {
fmt.Println(per.name)
}
func (per Person) sleep() {
fmt.Println("sleep")
}
type Cus struct {
name string
}
func (cus Cus) login(name string, pwd string) bool {
fmt.Println("cus.name:", cus.name)
if name == "tom" && pwd == "123" {
return true
}
return false
}
func main() {
per := Person{
name: "tom",
}
per.eat()
per.sleep()
cus := Cus{
name: "tom",
}
bl := cus.login("tom", "123")
fmt.Println(bl)
}
go语言方法的注意事项:
1.方法的接收者并不一定是结构体类型,type定义的类型别名,slice,map,channel,func类型等都可以;
2.struct结合它的方法就等价于面向对象中的类,只不过struct可以和它的方法分开,并非一定要属于同一个文件,但必须属于同一个包;
3.方法有两种接收类型,(T type)和(T *type),它们之间有区别;
4.方法就是函数,所以go中没有方法重载的说法,也就是说同一个类型中所有的方法名都必须唯一;
5.如果接收者是一个指针类型,则会自动解除引用;
6.方法和type是分开的,意味着实例的行为和数据存储是分开的,但是它们通过接收者建立关联关系.