Home > Backend Development > Golang > 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
Release: 2024-02-14 11:24:09
forward
805 people have browsed it

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

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
    }
Copy after login

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template