Home >Backend Development >Golang >Later assigning the new value to the underlying object of the interface in 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.
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.
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!