php小编香蕉在这篇文章中将为大家介绍一个重要的概念:“稍后将新值分配给 go 中接口的底层对象”。这个概念在Go语言中非常常见,它允许我们在运行时动态地改变接口的底层对象,从而实现更灵活的编程。通过这种方式,我们可以在不改变接口定义的情况下,替换接口的具体实现,从而实现代码的扩展和灵活性。在接下来的文章中,我们将详细讨论这个概念的原理和用法。
我试图在下面的代码中为接口的底层结构分配新值。但它保留了旧的价值观。下面是示例代码。
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) }
shape
的类型在 assignradius
中事先未知。我知道这与指针有关。但想不通。shape
的类型在 assignradius
中事先未知。我知道这与指针有关。但想不通。
接口变量 s
s
包含形状值的副本。要像您尝试的那样修改它,它必须包含指向该形状的指针:🎜
var s shape c := circle{radius: 0, name: "my circle"} s = &c🎜并且在修改它们的函数中,您必须键入断言指针值:🎜
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 }
以上是稍后将新值分配给 go 中接口的底层对象的详细内容。更多信息请关注PHP中文网其他相关文章!