登录
首页 >  Golang >  Go问答

将父类转换为子类:在 Golang 中的类型转换

来源:stackoverflow

时间:2024-03-10 23:24:25 161浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《将父类转换为子类:在 Golang 中的类型转换》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我不完全确定如何问这个问题 - 我有一个使用标准 golang 类型关键字从另一个类型“派生”的类型:

type ewkbgeompoint geom.point

我想本质上“覆盖”geom.point scan() 和 value() 函数,所以我有以下函数:

func (g *ewkbgeompoint) scan(input interface{}) error {
    gt, err := ewkbhex.decode(string(input.([]byte)))
    if err != nil {
        return err
    }
    g = gt.(*geom.point) // error here

    return nil
}

但是,当我运行它时,它出现接口转换错误:

interface conversion: geom.T is *geom.Point, not *models.EWKBGeomPoint

我不明白为什么会出现这种情况 - 我现在已经看到多个允许这种行为的代码示例。而且,在我看来,它应该可以工作,因为它们基本上是相同的类型,具有相同的底层变量和函数。

如何将此类型转换为目标类型?

链接到 go-geom 文档

go版本是go1.13.4 linux/amd64


解决方案


您无法覆盖 go 中的函数。

如果您定义一个新类型,例如:

type ewkbgeompoint geom.point

那么ewkbgeompoint是一个新类型,包含与geom.point相同的成员字段,但没有它的方法。

如果通过嵌入定义新类型:

type ewkbgeompoint struct {
   geom.point
}

然后,ewkbgeompoint 是嵌入 geom.point 的新类型。 geom.point 的所有成员变量和函数也都是为 ewkbgeompoint 定义的。

如果你使用你的声明,你可以转换结果:

g = (*models.ewkbgeompoint)(gt.(*geom.point))

如果使用类型嵌入,则可以将其分配给嵌入点:

g.point = *gt.(*geom.point)

但是,无论哪种情况,您都没有重写 scan 函数,而是为新类型定义了 scan 函数。

您只能 type assert 界面中的内容,因此您别无选择,只能使用 gt .(*geom.point),但你可能会得到convert结果:

g = (*models.ewkbgeompoint)(gt.(*geom.point))

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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