在go語言中沒有面向?qū)ο蟮母拍钆繁瘢强梢酝ㄟ^下面方式實現(xiàn)面向?qū)ο蟮奶卣?/p>
- 封裝狭归, 通過方法實現(xiàn)
- 繼承炕泳, 通過匿名字段實現(xiàn)
- 多態(tài)昭殉, 通過接口實現(xiàn)
方法
方法定義
// 定義方法
type Mystr string
func (temp *Mystr) Hello() {
fmt.Println("Mystr = ", *temp)
}
func main(){
var a Mystr
a.Hello() // 方法使用
}
匿名字段
匿名字段定義
type Person struct {
name string
id int
}
// 繼承
type Student struct {
Person
addr string
}
匿名字段初始化
func main() {
// 第一種方式初始化
var a Student
a.Person = new(Person) // 必須先分配空間棵癣,才能給父類賦值
a.name = "xiaoming"
// 第二種初始化
s := Student{Person{"xiaoming", 122}, "qwjh"}
// 第三種初始化辕翰,指定某個元素初始化
var d Student = Student{Person:Person{name: "xiaomi"},addr: "ni"}
}
接口
- 方法的集合
接口定義
// 定義接口類型接口
type Humer interface {
// 方法,只有聲明狈谊,沒有實現(xiàn)
Hello()
}
// 定義方法
type Mystr string
func (temp *Mystr) Hello() {
fmt.Println("Mystr = ", *temp)
}
func main() {
// 定義接口類型變量
var i Humer
var a Mystr = "lakalk"
i = a // 將類型a賦值給接口
i.Hello() // 調(diào)用函數(shù)喜命,Mystr = lakalk
}
- 接口存在繼承,被繼承的接口河劝,稱為子集壁榕, 繼承的接口,稱為超集
- 超集可以轉(zhuǎn)換為子集赎瞎,但子集不能轉(zhuǎn)換為超集
// 定義接口類型接口
type Humer interface {
// 方法牌里,只有聲明,沒有實現(xiàn)
Hello()
}
// 繼承Humer接口
type Personer interface {
// 匿名字段
Humer
}
// 定義方法
type Mystr string
func (temp *Mystr) Hello() {
fmt.Println("Mystr = ", *temp)
}
func main() {
// 定義接口類型變量
var i Humer
var j Personer
var a Mystr = "lakalk"
i = a // 將類型a賦值給接口
i = j // 將超集轉(zhuǎn)換為子集
i.Hello() // 調(diào)用函數(shù)务甥,Mystr = lakalk
}
空接口
- 可以保存任何的值
// 定義空接口
var i interface{}
// 一般空接口可用在函數(shù)接收不定參數(shù)
func xxx(arg ...interface) {
for _, i := range arg {
if value,ok := i.(int); ok == true {
fmt.Printf("整型%T, %v\n", i, value)
} else if value,ok := i.(string); ok == true {
fmt.Printf("字符串%T, %v\n", i, value)
}
}
}