0%

3.方法、接口

方法

方法是go语言实现面向对象中封装的手段

1
2
3
type T int
func (t T) FuncName(){}
func (pt *T) FuncName2(){}
  • 指针的方法集包含原类型的方法集,但原类型的方法集不包含指针的方法集
  • nil 是允许被作为接收者,所以方法有必要做判空操作
  • 通过匿名结构体,实现继承的操作
  • 通过结构成员变量首字母控制可见性,实现属性的封装

接口

接口是go语言实现面向对象中抽象(多态)的手段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import "fmt"
type myInF interface{
SomeFunc() int
}//接口声明
type myInt int
func (i myInt) SomeFunc() int{
return int(i)
}//接口实现

type myString string
func (str myString) SomeFunc() int{
return len(str)
}

type myStruct struct{
myInt
}

func main(){
var inf myInF
var i myInt = 100
inf = i //接口与实际方法关联
fmt.Println(inf.SomeFunc())

var str myString = "100"
inf = str
fmt.Println(str.SomeFunc()) //多态

stu := myStruct{i} //与结构体相结合
inf = stu
fmt.Println(inf.SomeFunc())
}
  • 允许空接口inteface{},可以通过空接口实现泛型编程
  • 接口值由两个部分组成,类型与动态值,默认值为nil,但一个空指针与接口关联时,接口不为nil,因为有了具体类型

类型断言

格式:x.(T)

1
2
c := w.(*bytes.Buffer)  //若转换失败则崩溃
b,ok := w.(*bytes.Buffer) //若转换失败则返回nil,false

类型分支

格式:

1
2
3
4
switch x := x.(type) {
case int: //
case nil: //
}

类型分支,可用于处理特征多态,实现泛型编程,如fmt.Println()

对于不变部分的代码不要抽象,会增加代码维护成本和程序运行成本