類
go語言中沒有類的概念,它通過結(jié)構(gòu)體來實現(xiàn)類的功能。
// user 類
type user struct {
name string
email string
}
// admin 類
type admin struct {
// 自定義類
person user
// 內(nèi)置類型
level string
}
類的實例化
// 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 進行初始化
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)鍵字和方法名之間添加一個參數(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)部改變會影響外部
func (u *user) changeEmail(newEmail string) {
// 不需要 (*u).email
u.email = newEmail
}
func main() {
// 1. user類型的值可以用來調(diào)用使用值接收者聲明的方法
bill := user{"bill", "1@163.com"}
bill.notify() // {"bill", "1@163.com"}
fmt.Println("1", bill.email) // "1@163.com"
// 2. 指向 user 類型值的指針也可以用來調(diào)用使用值接收者聲明的方法
lisa := &user{"lisa", "2@163.com"}
// 等價于 (*lisa).notify()
// 注意:把 lisa 指針指向的 user 對象復(fù)制了一份,"再強調(diào)一次,notify 操作的是一個副本,只不過這次操作的是從 lisa 指針指向的值的副本。"
lisa.notify() // {"lisa", "2@163.com"}
fmt.Println("2", lisa.email) // "0@163.com"(錯) 2@163.com(對)
// 3.user 類型的值可以用來調(diào)用使用指針接收者聲明的方法
// 等價于 (&bill).changeEmail ("100@163.com"),注意 changeEmail 接收的是一個指針
bill.changeEmail("100@163.com")
fmt.Println("3", bill.email) // "100@163.com"
// 4.指向 user 類型值的指針可以用來調(diào)用使用指針接收者聲明的方法
lisa.changeEmail("200@163.com")
fmt.Println("4", lisa.email) // "200@163.com"
}
接口
接口是用來定義行為的類型。這些行為是通過方法由用戶定義的類型實現(xiàn)。
接口定義和實現(xiàn)
// notifier 是一個定義了通知類行為的接口
type notifier interface {
// 接口方法
notify()
}
# 實現(xiàn)
// notify 是使用值接收者實現(xiàn) notifier interface 接口的方法, 對于值接收者,sendNotification(&u) 和 sendNotification(u) 都可
// sendNotification(&u) 和 sendNotification(u) 都可
func (u user) notify() {
fmt.Println("notify", u)
}
// notify 是使用指針接收者實現(xiàn) notifier interface 接口的方法, 對于指針接收者,只能使用 sendNotification(&u)
// 只能使用 sendNotification(&u)
func (u *user) notify() {
fmt.Println("notify", *u)
}
持續(xù)更新~