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

Kemudian memberikan nilai baharu kepada objek asas antara muka dalam go

WBOY
WBOYke hadapan
2024-02-14 11:24:09778semak imbas

稍后将新值分配给 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)
}

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
🎜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
    }

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam