Home  >  Article  >  Backend Development  >  Later assigning the new value to the underlying object of the interface in go

Later assigning the new value to the underlying object of the interface in go

WBOY
WBOYforward
2024-02-14 11:24:09746browse

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

php Editor Banana will introduce you to an important concept in this article: "Later assigning new values ​​to the underlying objects of the interface in go". This concept is very common in the Go language, and it allows us to dynamically change the underlying objects of the interface at runtime, thus enabling more flexible programming. In this way, we can replace the specific implementation of the interface without changing the interface definition, thereby achieving code expansion and flexibility. In the following articles, we will discuss the principles and usage of this concept in detail.

Question content

I am trying to assign a new value to the underlying structure of an interface in the code below. But it retains the old values. Below is sample code.

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)
}
The type of

shape is not known a priori in assignradius. I know this has to do with pointers. But I can’t figure it out.

Workaround

Interface variable s Contains a copy of the shape value. To modify it like you are trying to do, it must contain a pointer to the shape:

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

And in the function that modifies them, you must type assert pointer values:

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
    }

The above is the detailed content of Later assigning the new value to the underlying object of the interface in go. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete