欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言中結(jié)構(gòu)體的高級技巧分享

 更新時間:2023年08月27日 16:17:13   作者:周小末天天開心  
這篇文章主要為大家分享一下Go語言中結(jié)構(gòu)體的高級技巧,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編一起了解一下

組合結(jié)構(gòu)體

Go語言中的結(jié)構(gòu)體也可以通過組合來實現(xiàn)復(fù)用的功能,具體實現(xiàn)方法如下:

type Person struct {
    Name string
    Age  int
}
type Student struct {
    P      Person // 組合了Person結(jié)構(gòu)體
    School string
}
func main() {
    s := Student{Person{"Tom", 18}, "High School"}
    fmt.Println(s.P.Name, s.P.Age, s.School) // 輸出 Tom 18 High School
}

這段代碼中定義了一個Person結(jié)構(gòu)體,包含Name和Age兩個字段,另外定義了一個Student結(jié)構(gòu)體,它組合了Person結(jié)構(gòu)體。在main函數(shù)中,我們通過構(gòu)造函數(shù)創(chuàng)建了一個Student實例s,并訪問了它的Name、Age和School字段,需要通過s.P來訪問Person結(jié)構(gòu)體中的字段。

通過組合其他結(jié)構(gòu)體,子結(jié)構(gòu)體可以復(fù)用父結(jié)構(gòu)體中的字段和方法,但是它不會繼承父結(jié)構(gòu)體的特性和行為。與繼承相比,組合更加靈活和簡單,但也需要開發(fā)者更多的手動操作。

需要注意的是,Go語言中沒有類的概念,因此結(jié)構(gòu)體不是類,它不能實現(xiàn)繼承和多態(tài)等面向?qū)ο蟮奶匦?,而是一種數(shù)據(jù)類型的定義方式。

嵌套結(jié)構(gòu)體

可以在結(jié)構(gòu)體中嵌套另一個結(jié)構(gòu)體,從而形成一個復(fù)合的結(jié)構(gòu)體類型。嵌套結(jié)構(gòu)體可以直接使用內(nèi)部結(jié)構(gòu)體的字段,也可以通過內(nèi)部結(jié)構(gòu)體名來訪問內(nèi)部結(jié)構(gòu)體的字段。

例如:

type Address struct {
    Province string
    City     string
}
type Person struct {
    Name    string
    Age     int
    Address Address
}
p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}}
fmt.Println(p.Name, p.Age, p.Address.Province, p.Address.City)

指針結(jié)構(gòu)體

結(jié)構(gòu)體變量通常會占用比較大的內(nèi)存空間,為了節(jié)省內(nèi)存,可以使用指針結(jié)構(gòu)體。指針結(jié)構(gòu)體可以通過&操作符獲取結(jié)構(gòu)體變量的地址,并通過*操作符訪問結(jié)構(gòu)體變量的值。

例如:

type Person struct {
    Name string
    Age  int
}
p := &Person{Name: "Tom", Age: 18}
fmt.Println((*p).Name, (*p).Age) // 輸出:Tom 18
fmt.Println(p.Name, p.Age)       // 輸出:Tom 18

匿名字段

可以將一個結(jié)構(gòu)體類型作為另一個結(jié)構(gòu)體類型的字段,這個字段就稱為匿名字段。匿名字段的類型可以是任意類型,可以是基本類型、結(jié)構(gòu)體類型、指針類型等。匿名字段可以直接訪問內(nèi)部結(jié)構(gòu)體的字段,也可以通過內(nèi)部結(jié)構(gòu)體名來訪問內(nèi)部結(jié)構(gòu)體的字段。

例如:

type Address struct {
    Province string
    City     string
}
type Person struct {
    Name string
    Age  int
    Address
}
p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}}
fmt.Println(p.Name, p.Age, p.Province, p.City)

面向?qū)ο?/h2>

Go語言雖然不是一種純面向?qū)ο缶幊陶Z言,但它提供了一些面向?qū)ο缶幊痰幕咎匦裕热绶庋b、繼承和多態(tài)等。

封裝

Go語言通過大寫字母開頭的字段或方法來實現(xiàn)封裝,這些字段或方法可以在包外部訪問。小寫字母開頭的字段或方法則只能在當(dāng)前包內(nèi)部訪問。

例如:

package main
import "fmt"
type Person struct {
    name string
    age int
}
func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}
func main() {
    p := &Person{"Tom", 18}
    p.SayHello()
}

在上面的代碼中,我們定義了一個名為Person的結(jié)構(gòu)體,它有兩個字段name和age,并且定義了一個方法SayHello,用于打印個人信息。在main函數(shù)中,我們創(chuàng)建了一個Person對象p,并調(diào)用它的SayHello方法,輸出了它的信息。

繼承

Go語言不支持傳統(tǒng)的繼承方式,但是可以通過結(jié)構(gòu)體組合的方式實現(xiàn)繼承。具體來說,我們可以在一個結(jié)構(gòu)體中包含另一個結(jié)構(gòu)體,并通過嵌套結(jié)構(gòu)體的方式來繼承其字段和方法。

例如:

package main
import "fmt"
type Person struct {
    name string
    age  int
}
func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}
type Student struct {
    Person
    score int
}
func main() {
    s := &Student{Person{"Tom", 18}, 90}
    s.SayHello()
    fmt.Println("My score is", s.score)
}

在上面的代碼中,我們定義了兩個結(jié)構(gòu)體Person和Student,Student結(jié)構(gòu)體包含了一個Person類型的字段,并且定義了一個自己的score字段。在main函數(shù)中,我們創(chuàng)建了一個Student對象s,并調(diào)用它的SayHello方法,輸出了它的信息,然后輸出了它的成績。

多態(tài)

Go語言不支持傳統(tǒng)的多態(tài)方式,但是可以通過接口實現(xiàn)多態(tài)。具體來說,我們可以定義一個接口,并讓不同的結(jié)構(gòu)體實現(xiàn)這個接口,從而實現(xiàn)多態(tài)。

例如:

package main
import "fmt"
type Animal interface {
    Say()
}
type Cat struct{}
func (c *Cat) Say() {
    fmt.Println("Meow!")
}
type Dog struct{}
func (d *Dog) Say() {
    fmt.Println("Woof!")
}
func main() {
    var a Animal
    a = &Cat{}
    a.Say()
    a = &Dog{}
    a.Say()
}

這段Go語言代碼定義了一個Animal接口和兩個實現(xiàn)了該接口的結(jié)構(gòu)體:Cat和Dog。Animal接口中只有一個Say()方法。Cat和Dog分別實現(xiàn)了Say()方法并輸出相應(yīng)的聲音。在main函數(shù)中,定義了一個a變量,類型為Animal接口。首先將a賦值為一個Cat結(jié)構(gòu)體的指針,然后調(diào)用a的Say()方法輸出"Meow!"。接著將a賦值為一個Dog結(jié)構(gòu)體的指針,再次調(diào)用a的Say()方法輸出"Woof!"。

到此這篇關(guān)于Go語言中結(jié)構(gòu)體的高級技巧分享的文章就介紹到這了,更多相關(guān)Go結(jié)構(gòu)體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang 中 omitempty的作用

    Golang 中 omitempty的作用

    這篇文章主要介紹了Golang 中 omitempty的作用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下
    2022-07-07
  • Go語言并發(fā)技術(shù)詳解

    Go語言并發(fā)技術(shù)詳解

    這篇文章主要介紹了Go語言并發(fā)技術(shù)詳解,本文講解了goroutine、channels、Buffered Channels、Range和Close等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 一文帶你掌握Golang中的值類型和引用類型

    一文帶你掌握Golang中的值類型和引用類型

    在?Golang?中,數(shù)據(jù)類型可以分為兩大類:值類型(Value?Types)和引用類型(Reference?Types),理解這兩種類型的區(qū)別對于理解?Golang?中的數(shù)據(jù)傳遞和內(nèi)存管理是很重要的,下面就跟隨小編一起深入了解一下它們吧
    2024-01-01
  • golang并發(fā)鎖使用詳解

    golang并發(fā)鎖使用詳解

    這篇文章主要介紹了golang并發(fā)鎖使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Go語言Grpc?Stream的實現(xiàn)

    Go語言Grpc?Stream的實現(xiàn)

    本文主要介紹了Go語言Grpc?Stream的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • GoLang channel使用介紹

    GoLang channel使用介紹

    Channel 和 goroutine 的結(jié)合是 Go 并發(fā)編程的大殺器。而 Channel 的實際應(yīng)用也經(jīng)常讓人眼前一亮,通過與 select,cancel,timer 等結(jié)合,它能實現(xiàn)各種各樣的功能。接下來,我們就要梳理一下 channel 的應(yīng)用
    2022-10-10
  • go同步原語Phaser和Barrier區(qū)別

    go同步原語Phaser和Barrier區(qū)別

    這篇文章主要為大家介紹了通過java講解go同步原語Phaser和Barrier區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go語言編譯原理之變量捕獲

    Go語言編譯原理之變量捕獲

    這篇文章主要為大家介紹了Go語言編譯原理之變量捕獲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go map定義的方式及修改技巧

    Go map定義的方式及修改技巧

    這篇文章主要給大家介紹了關(guān)于Go map定義的方式及修改技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Golang中使用Swagger生成API文檔的流程步驟

    Golang中使用Swagger生成API文檔的流程步驟

    Swagger 是一款強大的 API 文檔生成工具,可以幫助開發(fā)者輕松創(chuàng)建、管理和展示 RESTful API 文檔,在本文中,我們將介紹如何在 Golang 項目中使用 Swagger 來生成 API 文檔,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07

最新評論