Go基础知识点(十二) | 青训营笔记

99 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第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是分开的,意味着实例的行为和数据存储是分开的,但是它们通过接收者建立关联关系.