一、Golang繼承
1、Golang中沒有傳統的面向對象語言中的class類,而是通過struct結構體來實現。通過在子結構體中嵌入父結構體來實現繼承。
2、在Golang中,繼承使用了內嵌(embedding)的方式,子類嵌入一個父類的結構體就可以獲得父類的所有屬性和方法了。
3、在Golang中,繼承是單一繼承,一個類只能繼承一個父類.
type Person struct {
Name string
Age int
}
type Student struct {
Person
Grade int
}
通過以上代碼示例,Student結構體內嵌了Person結構體,可以使用Student.Name和Student.Age訪問Person的屬性。
二、Golang繼承重寫方法
1、在Golang中,如果子類想要覆蓋父類的方法,只需要在子類中定義一個同名的方法即可。
type Person struct {
Name string
Age int
}
func (p *Person) Print() {
fmt.Println("Name:", p.Name, "Age:", p.Age)
}
type Student struct {
Person
Grade int
}
func (s *Student) Print() {
fmt.Println("Name:", s.Name, "Age:", s.Age, "Grade:", s.Grade)
}
func main() {
p := &Person{Name: "Tom", Age: 18}
s := &Student{Person: *p, Grade: 6}
p.Print() //輸出:Name: Tom Age: 18
s.Print() //輸出:Name: Tom Age: 18 Grade: 6
}
2、以上示例中,Person和Student都有一個Print()方法,重寫之後可以分別輸出不同的信息。
三、Golang繼承的好處
1、繼承可以避免代碼的重複編寫,提高代碼的可重用性。
2、通過繼承可以方便地擴展子類的功能,同時保留父類的特性。
3、通過重載方法可以提供更靈活的代碼。
四、Golang繼承JSON序列化
1、在Golang中,基於嵌套的結構體可以很方便地進行JSON序列化和反序列化。
2、通過使用struct tag,我們可以自定義JSON屬性名。
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
type Student struct {
Person
Grade int `json:"grade"`
}
func main() {
s := &Student{Name: "Tom", Age: 18, Grade: 6}
b, err := json.Marshal(s)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
}
3、以上代碼示例中,通過struct tag將Person的Name和Age重新定義為了name和age,在序列化之後的JSON字元串中也顯示為name和age。
五、Golang繼承和介面多態
1、Golang中通過介面可以實現多態的效果。
type Animal interface {
Speak() string
}
type Cat struct {
}
func (c *Cat) Speak() string {
return "Meow"
}
type Dog struct {
}
func (d *Dog) Speak() string {
return "Woof"
}
func main() {
animals := []Animal{&Cat{}, &Dog{}}
for _, animal := range animals {
fmt.Println(animal.Speak())
}
}
2、以上代碼示例中,Cat和Dog都實現了Animal介面的Speak()方法,使用多態的方式調用Speak()方法。
六、Golang繼承介面
1、在Golang中,介面也可以通過嵌入其他介面來實現繼承。
type Animal interface {
Speak() string
}
type Cat interface {
Animal
Eater
}
type Eater interface {
Eat() string
}
type BlackCat struct {
}
func (c *BlackCat) Speak() string {
return "Meow"
}
func (c *BlackCat) Eat() string {
return "Fish"
}
func main() {
blackCat := &BlackCat{}
fmt.Println(blackCat.Speak())
fmt.Println(blackCat.Eat())
}
2、通過以上示例可以看出,通過嵌入Eater介面,Cat介面繼承了Eater介面的所有方法。
七、Golang繼承和實現
1、Golang中通過嵌套struct結構體可以實現繼承,通過介面可以實現實現。
2、繼承是一種代碼復用的方式,實現是一種規範的定義。
八、Golang繼承指針和非指針區別
1、在Golang中,嵌入的結構體可以使用指針和非指針方式。
type Person struct {
Name string
}
func (p *Person) Print() {
fmt.Println(p.Name)
}
type Student struct {
Person
}
func main() {
student := Student{Person: Person{Name: "Tom"}}
student.Print() //輸出:Tom
}
type Person struct {
Name string
}
func (p Person) Print() {
fmt.Println(p.Name)
}
type Student struct {
Person
}
func main() {
student := Student{Person: Person{Name: "Tom"}}
student.Print() //輸出:Tom
}
2、以上兩個示例的輸出結果是一樣的,但是使用指針方式可以讓函數更加高效,特別是在結構體比較大的情況下,避免了值拷貝的時候發生的內存浪費和效率下降。
九、Go繼承和實現
1、相比傳統的面向對象語言,Golang中的繼承和實現更加簡潔和直觀。
2、通過嵌入結構體實現繼承,通過介面實現實現,同時避免了其他語言中繼承和實現可能帶來的一些問題。
十、Golang繼承集成OAuth2.0
1、在Golang中,使用第三方庫golang.org/x/oauth2可以很方便地實現OAuth2.0。
func main() {
conf := &oauth2.Config{
ClientID: "YOUR_CLIENT_ID",
ClientSecret: "YOUR_CLIENT_SECRET",
RedirectURL: "YOUR_REDIRECT_URL",
Scopes: []string{"SCOPE1", "SCOPE2"},
Endpoint: oauth2.Endpoint{
AuthURL: "AUTH_URL",
TokenURL: "TOKEN_URL",
},
}
url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)
fmt.Printf("Visit the URL for the auth dialog: %v", url)
}
2、通過以上示例,我們可以看到在Golang中實現OAuth2.0可以非常簡單易用。
本文從繼承的定義、實現、繼承的好處等方面對Golang繼承做了詳細的闡述,並針對Golang繼承重寫方法、JSON序列化、介面多態、繼承介面、指針和非指針區別、集成OAuth2.0等方面進行了深入的講解,希望對讀者有所幫助。
原創文章,作者:IYATA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/315921.html