首頁 >後端開發 >Golang >重點介紹Golang方法的語法和使用

重點介紹Golang方法的語法和使用

PHPz
PHPz原創
2023-03-30 13:35:251080瀏覽

Golang作為一門比較年輕的語言,在方法中也有自己獨特的實作方式。本文將重點放在Golang方法的語法和使用。

一、方法定義

Golang中可以為任何型別定義方法,包括引用型別和非引用型別。方法定義格式如下:

func (t Type) methodName(parameterList) (returnList){
    //方法体
}

其中,t為接收者,Type表示接收者類型,methodName為方法名,parameterList和returnList分別表示方法參數和傳回值清單。

接收者可以是值類型或指標類型,方法定義時必須加上對應的*或&符號,例如:

func (p *Person) SetName(name string) {
    p.name = name
}

二、方法呼叫

Golang中方法的呼叫跟函數呼叫類似,只不過需要在呼叫時提供對應的接收者。例如:

package main

import "fmt"

type Person struct {
    name string
}

func (p *Person) SetName(name string) {
    p.name = name
}

func (p Person) GetName() string {
    return p.name
}

func main() {
    p := Person{name: "张三"}
    fmt.Println(p.GetName()) // 输出:张三
    p.SetName("李四")
    fmt.Println(p.GetName()) // 输出:李四
}

在上面的範例中,首先定義了一個叫做Person的結構體,包含了一個字串類型的name屬性。然後,定義了兩個方法:SetName和GetName,分別用於設定和取得name屬性的值。在main函數中,首先建立了一個Person類型的變數p,並呼叫了它的GetName方法,輸出了p的name屬性值「張三」。接著,呼叫了SetName方法,將值修改為“李四”,再呼叫GetName方法,輸出了修改後的name屬性值“李四”。

三、值與指標接收者

透過前面的程式碼範例可知,可以為值型別或指標型別定義方法,那麼這兩種方式有什麼差別呢?

注意:不同的接收者類型是不可以互相賦值的。

1.值接收者

方法定義時,如果接收者是值類型,那麼當方法被呼叫時會對接收者進行一次複製。因此,對複製後的實例所進行的操作對原實例是沒有影響的。例如:

package main

import "fmt"

type Person struct {
    name string
}

func (p Person) GetName() string {
    return p.name
}

func (p Person) SetName(name string) {
    p.name = name
}

func main() {
    p1 := Person{name: "张三"}
    p2 := p1
    p2.SetName("李四")
    fmt.Println(p1.GetName()) // 输出:张三
    fmt.Println(p2.GetName()) // 输出:李四
}

值類型接收者定義的方法Setname在實例化時會將原值複製一份,因此p1和p2其實是兩個不同的實例。所以當p2呼叫SetName方法修改屬性值時,對p1並沒有影響。

2.指標接收者

方法定義時,如果接收者是指標類型,那麼呼叫方法時實際上是對該指標所指向的物件進行操作。如果方法對該物件進行修改,那麼會直接影響原始物件。例如:

package main

import "fmt"

type Person struct {
    name string
}

func (p *Person) GetName() string {
    return p.name
}

func (p *Person) SetName(name string) {
    p.name = name
}

func main() {
    p1 := &Person{name: "张三"}
    p2 := p1
    p2.SetName("李四")
    fmt.Println(p1.GetName()) // 输出:李四
    fmt.Println(p2.GetName()) // 输出:李四
}

指標類型接收者定義的方法SetName會直接修改指向物件的屬性值,而p1和p2指向的是同一個對象,因此當其中一個呼叫SetName方法會修改屬性值時,對另一個對像也是有影響的。

四、結構體嵌入方法

Golang允許結構體嵌入,即一個結構體可以包含其他結構體類型的成員變量,這種方式也常被稱為組合。

在嵌入結構體時,可以在型別名稱前加上*或&,表示嵌入指標型別或值型別。例如:

type Person struct {
    name string
}

func (p *Person) GetName() string {
    return p.name
}

type Employee struct {
    *Person
    age int
}

func main() {
    emp := &Employee{Person: &Person{"张三"}, age: 28}
    fmt.Println(emp.GetName()) // 输出:张三
}

在這個範例中,首先定義了一個Person結構體類型,包含一個字串類型的name屬性和一個GetName的方法。然後,定義了一個Employee結構體類型,嵌入了Persion結構體類型,並且增加了一個整數類型的age屬性。最後實例化emp時,使用花括號初始化法,為其中的Persion屬性初始化一個該類型的物件。當呼叫emp的GetName方法時,其實是呼叫emp內部Persion屬性的GetName方法,從而輸出「張三」。

五、小結

Golang中的方法使用起來跟函數方法類似,但是具有更明確的函數作用域。透過指標類型接收者定義的方法可以直接修改物件的屬性值,從而增加了方法的靈活性,也避免了透過傳回值再重新賦值的麻煩。使用結構體嵌入時,可以避免冗餘的程式碼,使得程式更加簡潔。

以上是重點介紹Golang方法的語法和使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn