Rumah > pembangunan bahagian belakang > Golang > Kemudian memberikan nilai baharu kepada objek asas antara muka dalam go

Kemudian memberikan nilai baharu kepada objek asas antara muka dalam go

WBOY
Lepaskan: 2024-02-14 11:24:09
ke hadapan
807 orang telah melayarinya

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

editor php Banana akan memperkenalkan anda kepada konsep penting dalam artikel ini: "Kemudian memberikan nilai baharu kepada objek asas antara muka dalam go". Konsep ini sangat biasa dalam bahasa Go, dan ia membolehkan kami menukar objek asas antara muka secara dinamik pada masa jalan, sekali gus mencapai pengaturcaraan yang lebih fleksibel. Dengan cara ini, kita boleh menggantikan pelaksanaan khusus antara muka tanpa mengubah definisi antara muka, dengan itu mencapai pengembangan dan fleksibiliti kod. Dalam artikel berikut, kita akan membincangkan prinsip dan penggunaan konsep ini secara terperinci.

Kandungan soalan

Saya cuba memberikan nilai baharu kepada struktur asas antara muka dalam kod di bawah. Tetapi ia mengekalkan nilai lama. Di bawah adalah contoh kod.

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)
}
Salin selepas log masuk

Jenis bentuk tidak diketahui terlebih dahulu dalam assignradius. Saya tahu ini ada kaitan dengan petunjuk. Tetapi saya tidak dapat memikirkannya. shape 的类型在 assignradius 中事先未知。我知道这与指针有关。但想不通。

解决方法

接口变量 s

Penyelesaian

Pembolehubah antara muka s mengandungi salinan nilai bentuk. Untuk mengubah suainya seperti yang anda cuba lakukan, ia mesti mengandungi penunjuk kepada bentuk: 🎜
var s shape
c := circle{radius: 0, name: "my circle"}
s = &c
Salin selepas log masuk
🎜Dan dalam fungsi yang mengubah suainya, anda perlu menaip nilai penuding tegas: 🎜
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
    }
Salin selepas log masuk

Atas ialah kandungan terperinci Kemudian memberikan nilai baharu kepada objek asas antara muka dalam go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan