首頁 > 後端開發 > Golang > 在 Go 中呼叫方法時介面指標如何表現?

在 Go 中呼叫方法時介面指標如何表現?

Mary-Kate Olsen
發布: 2024-12-11 07:12:10
原創
279 人瀏覽過

How Do Interface Pointers Behave When Calling Methods in Go?

>

>在GO

>

中呼叫指標上的呼叫方法,如果您使用的是GORP函式庫(實作SQLEXECUTOR您可能會發現自己在嘗試時會遇到問題將指標上的方法呼叫到介面值。出現這種困惑是因為GO並不嚴格遵循「透過參考呼叫」的概念。在GO中,介面用於表示一組具有常見方法的物件。當您為介面指派一個值時,實際上並不是儲存對該物件的引用,而是指向物件值的指標。這意味著,如果您在介面值上呼叫方法,則實際上是在基礎物件上呼叫它。

請考慮此範例:

package main

import (
    "fmt"
)

type Person struct {
    Name string
}

func (p *Person) Greet() {
    fmt.Println("Hello, my name is", p.Name)
}

func main() {
    // Create a person object
    p := Person{Name: "John"}

    // Create an interface value that points to the person object
    var person interface{} = p

    // Call the Greet method on the interface value
    person.Greet() // Output: Hello, my name is John
}
登入後複製

在此範例中,我們建立了一個人物件並將其指派給人介面值。然後,當我們呼叫人類介面值的問候方法時,它正確地呼叫了基礎人物物件的問候方法。這是因為介面值實際上指向人物物件。

在指向介面值時,情況可能會更加令人困惑。在GO中,通常不必使用指標來介面值。可能需要的唯一情況是您需要修改介面值本身時。例如,如果您想要變更介面值指向的對象,則需要使用指標指向介面值。

>

>以下是一個範例:

package main

import (
    "fmt"
)

type Person struct {
    Name string
}

func (p *Person) Greet() {
    fmt.Println("Hello, my name is", p.Name)
}

func main() {
    // Create a person object
    p := Person{Name: "John"}

    // Create a pointer to the person object
    pPtr := &p

    // Create an interface value that points to the person object
    var person interface{} = pPtr

    // Change the object that the interface value is pointing to
    person = &Person{Name: "Jane"}

    // Call the Greet method on the interface value
    person.Greet() // Output: Hello, my name is Jane
}
登入後複製

在此範例中,我們建立了一個指向人對象的指針,並將其分配給人界面值。然後,當我們更改人員介面值指向的物件時,在新物件上呼叫了迎接方法。這是因為我們正在修改介面值本身,而不是基礎物件。 通常,您不需要使用指示器來介面GO程式碼中的值。但是,如果您確實需要使用它們,重要的是要記住,它們的行為從指針到常規價值觀有所不同。

以上是在 Go 中呼叫方法時介面指標如何表現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板