Golong结构体与接口 | 青训营

53 阅读3分钟

参与第六届青训营伴学笔记活动

概述:

Go语言是一种新型的面向对象编程语言:它里面没有类和继承概念。但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。

结构体

定义结构体

Go语言中通过关键字type定义自定义类型,结构体定义需要使用type和struct关键字,格式如下

type 结构体名 struct {
成员变量1 类型1
成员变量2 类型2 
成员变量3 类型3 
... 
}

实例化结构体

结构体实例化时,会真正地分配内存。

Go语言实例化结构体主要有以下三种方式:

  1. 标准实例化
  2. new函数实例化
  3. 取地址实例化
type Book struct {
    title string
    author string
   	id int
}

func main () {
    // 标准实例化
    var book1 Book	
    // new函数实例化,实例化完成后会返回结构体地指针类型
    book2 := new(Book)
    // 取地址实例化返回的也是结构体指针类型
    book3 := &Book{}
}

初始化结构体

  1. 键值对格式初始化
  2. 列表格式初始化 使用这种方式初始化结构体必须化所有的成员变量。

结构体内嵌

Go语言的结构体内嵌是一种组合特性,使用结构体内嵌可构建一种面向对象编程思想中的继承关系。 结构体实例化后,可直接访问内嵌结构体的所有成员变量和方法。

结构体方法

方法和函数比较像,区别是函数属于包,通过包调用函数,而方法属于结构体,通过结构体变量调用。

对于结构体方法,接收者可以是结构体类型的值或指针。

指针类型接收者:当接收者类型为指针时,可以通过该方法改变该接收者的成员变量值,即使你使用了非指针类型的实例调用该函数,也可以改变实例对应的成员变量值。 值类型接收者:该方法操作对应接收者值得副本,即使你使用了指针类型的实例调用该函数,也无法改变成员变量的值。

接口与类型

接口的定义

在Go语言中,接口(interface)是一个自定义类型。接口类型是一种抽象的类型,它不会暴露出它所代表的内部属性的结构,而只会展示出它自己的方法,因此,不能将接口类型实例化。

Go语言接口是方法的集合,使用接口是实现模块化的重要方式。

接口的创建与实现

接口是用来定义行为类型的。这些被定义的行为不由接口直接实现,而是由用户自定义的类型实现,一个实现了这些方法的具体类型就叫做这个接口类型的实例。(接口中声明完方法后,结构体重写接口中所有的方法,即认为结构体实现了接口)

使用type和interface关键字即可创建一个接口,接口内部只需要声明存在什么方法,不需要实现这些方法。

type Animal interface {
	Name() string
	Speak() string
}

type Cat struct {
}

func (cat Cat) Name() string {
	return "Cat"
}

func (cat Cat) Speak() string {
	return "喵喵喵"
}

上面代码中创建了一个叫Animal的接口,结构体Cat实现了Animal接口的两个方法,因此我们就可以认为Cat是Animal接口的实例。