首頁  >  文章  >  後端開發  >  稍後將新值指派給 go 中介面的底層對象

稍後將新值指派給 go 中介面的底層對象

WBOY
WBOY轉載
2024-02-14 11:24:09778瀏覽

稍后将新值分配给 go 中接口的底层对象

php小編香蕉在這篇文章中將為大家介紹一個重要的概念:「稍後將新值分配給 go 中介面的底層物件」。這個概念在Go語言中非常常見,它允許我們在運行時動態地改變介面的底層對象,從而實現更靈活的程式設計。透過這種方式,我們可以在不改變介面定義的情況下,替換介面的具體實現,從而實現程式碼的擴展和靈活性。在接下來的文章中,我們將詳細討論這個概念的原理和用法。

問題內容

我試圖在下面的程式碼中為介面的底層結構分配新值。但它保留了舊的價值觀。下面是範例程式碼。

package main

import (
    "fmt"
    "math"
)

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
    Name   string
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

type Rectangle struct {
    Length float64
    Width  float64
    Name   string
}

func (r Rectangle) Area() float64 {
    return r.Length * r.Width
}

func assignRadius(s Shape, radius float64, name string) {
    switch s := s.(type) {
    case Circle:
        s.Radius = radius
        s.Name = name
    case Rectangle:
        s.Length = radius
        s.Name = name
    }
}

func main() {
    var s Shape
    c := Circle{Radius: 0, Name: "My Circle"}
    s = c
    fmt.Println(s.Area())
    fmt.Println(c.Radius)
    fmt.Println(c.Name)
    assignRadius(s, 10, "My New Circle")
    fmt.Println(c.Radius)
    fmt.Println(c.Name)
}

shape 的型別在 assignradius 中事先未知。我知道這與指針有關。但想不通。

解決方法

介面變數 s 包含形狀值的副本。要像您嘗試的那樣修改它,它必須包含指向該形狀的指標:

var s shape
c := circle{radius: 0, name: "my circle"}
s = &c

並且在修改它們的函數中,您必須鍵入斷言指標值:

func assignRadius(s Shape, radius float64, name string) {
    switch s := s.(type) {
    case *Circle:
        s.Radius = radius
        s.Name = name
    case *Rectangle:
        s.Length = radius
        s.Name = name
    }

以上是稍後將新值指派給 go 中介面的底層對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除