首頁 > 後端開發 > Golang > 為什麼 fmt.Println 為指標呼叫 Car.String() 而不是值?

為什麼 fmt.Println 為指標呼叫 Car.String() 而不是值?

Linda Hamilton
發布: 2024-12-07 06:42:14
原創
399 人瀏覽過

Why Does fmt.Println Invoke Car.String() for Pointers but Not Values?

使用fmt.Println 呼叫String() 列印物件

在處理fmt.Println 和Stringer 介面時,了解類型轉換過程至關重要。

在提供的程式碼中,處理指標時會呼叫 Car.String(),但在使用值時則不然。這是因為 fmt.Println 將指標和值強制轉換為 interface{} 類型。

fmt 然後執行類型切換以決定如何列印該值。對於實作 fmt.Stringer 的值(使用傳回字串的 String 方法),它會列印該方法的結果。但是,對於在指標類型上定義了 String 方法的值,類型切換會失敗。

解決方案:

要解決此問題,請在Car 類型上實現String或傳遞一個指向fmt.Println 的指針,如下所示:

type Car struct {
    year int
    make string
}

func (c Car) String() string {
    return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year)
}

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    fmt.Println(&myCar) // Passing the pointer explicitly
}
登入後複製

或者,您可以使用自訂類型斷言手動調用String,但不建議此方法:

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    if v, ok := myCar.(fmt.Stringer); ok {
        fmt.Println(v.String()) // Manually invoking String
    }
}
登入後複製

透過解決 fmt.Println 的類型轉換行為,您可以有效控制物件的格式化方式,無論其值或指標性質如何。

以上是為什麼 fmt.Println 為指標呼叫 Car.String() 而不是值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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