登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-17 17:09:30 399浏览 收藏

大家好,我们又见面了啊~本文《稍后将新值分配给 go 中接口的底层对象》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我试图在下面的代码中为接口的底层结构分配新值。但它保留了旧的价值观。下面是示例代码。

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 中事先未知。我知道这与指针有关。但想不通。


正确答案


接口变量 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 中接口的底层对象》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>