類
go語(yǔ)言中沒(méi)有類的概念,它通過(guò)結(jié)構(gòu)體來(lái)實(shí)現(xiàn)類的功能。
// user 類
type user struct {
name string
email string
}
// admin 類
type admin struct {
// 自定義類
person user
// 內(nèi)置類型
level string
}
類的實(shí)例化
// 1. 創(chuàng)建 user 變量,所有屬性初始化為其零值
var bill user
fmt.Println(bill) // { 0 false}
// 2. 創(chuàng)建 user 變量,并初始化屬性值
vix := user{
name: "vix",
email: "vix1009@163.com",
}
fmt.Println(vix) // {vix vix1009@163.com}
// 直接使用屬性值,屬性值的順序要與 struct 中定義的一致
vix2 := user{"vix", "vix1009@163.com"}
fmt.Println(vix2) // {vix vix1009@163.com}
// 3. 含有自定義類型的 struct 進(jìn)行初始化
vix := admin{
person: user{
name: "vix",
email: "vix1009@163.com",
},
level: "super",
}
fmt.Println("vix:",vix) //vix: {{vix vix1009@163.com} super}
方法
方法能給用戶定義的類型添加行為。方法本身也是函數(shù),只是在聲明是在關(guān)鍵字和方法名之間添加一個(gè)參數(shù)(接受者)。
普通的函數(shù)定義 func 方法名(參數(shù)) 返回值{}
自定義類型的方法定義 func (接收者) 方法名(參數(shù)) 返回值{}
type user struct {
name string
email string
}
// 普通的函數(shù)定義 "func 方法名(入?yún)? 返回值"
// 自定義類型的函數(shù)定義 "func (接收者) 方法名(入?yún)? 返回值"
// 值傳遞,拷貝一份 user
func (u user) notify() {
fmt.Println("pass-by-value", u.name, u.email)
u.email = "0@qq.com"
}
// 傳遞指針(即地址),內(nèi)部改變會(huì)影響外部
func (u *user) changeEmail(newEmail string) {
// 不需要 (*u).email
u.email = newEmail
}
func main() {
// 1. user類型的值可以用來(lái)調(diào)用使用值接收者聲明的方法
bill := user{"bill", "1@163.com"}
bill.notify() // {"bill", "1@163.com"}
fmt.Println("1", bill.email) // "1@163.com"
// 2. 指向 user 類型值的指針也可以用來(lái)調(diào)用使用值接收者聲明的方法
lisa := &user{"lisa", "2@163.com"}
// 等價(jià)于 (*lisa).notify()
// 注意:把 lisa 指針指向的 user 對(duì)象復(fù)制了一份,"再?gòu)?qiáng)調(diào)一次,notify 操作的是一個(gè)副本,只不過(guò)這次操作的是從 lisa 指針指向的值的副本。"
lisa.notify() // {"lisa", "2@163.com"}
fmt.Println("2", lisa.email) // "0@163.com"(錯(cuò)) 2@163.com(對(duì))
// 3.user 類型的值可以用來(lái)調(diào)用使用指針接收者聲明的方法
// 等價(jià)于 (&bill).changeEmail ("100@163.com"),注意 changeEmail 接收的是一個(gè)指針
bill.changeEmail("100@163.com")
fmt.Println("3", bill.email) // "100@163.com"
// 4.指向 user 類型值的指針可以用來(lái)調(diào)用使用指針接收者聲明的方法
lisa.changeEmail("200@163.com")
fmt.Println("4", lisa.email) // "200@163.com"
}
接口
接口是用來(lái)定義行為的類型。這些行為是通過(guò)方法由用戶定義的類型實(shí)現(xiàn)。
接口定義和實(shí)現(xiàn)
// notifier 是一個(gè)定義了通知類行為的接口
type notifier interface {
// 接口方法
notify()
}
# 實(shí)現(xiàn)
// notify 是使用值接收者實(shí)現(xiàn) notifier interface 接口的方法, 對(duì)于值接收者,sendNotification(&u) 和 sendNotification(u) 都可
// sendNotification(&u) 和 sendNotification(u) 都可
func (u user) notify() {
fmt.Println("notify", u)
}
// notify 是使用指針接收者實(shí)現(xiàn) notifier interface 接口的方法, 對(duì)于指針接收者,只能使用 sendNotification(&u)
// 只能使用 sendNotification(&u)
func (u *user) notify() {
fmt.Println("notify", *u)
}
持續(xù)更新~