为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中将基类型转换为派生类型

在 Golang 中将基类型转换为派生类型

Go
眼眸繁星 2022-05-10 15:53:47
我不完全确定如何问这个问题 - 我有一个使用标准 golang type 关键字从另一个“派生”的类型: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我不明白为什么会这样——我现在已经看到了多个允许这种行为的代码示例。在我看来,直觉上它应该可以工作,因为它们基本上是相同的类型,具有所有相同的基础变量和函数。如何将此类型转换为目标类型?
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

你不能在 Go 中覆盖函数。

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

type EWKBGeomPoint geom.Point

ThenEWKBGeomPoint是一个新类型,包含 的相同成员字段geom.Point,但没有任何方法。

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

type EWKBGeomPoint struct {
   geom.Point}

然后,EWKBGeomPoint是一种嵌入 a 的新类型geom.Point。的所有成员变量和函数geom.Point也为EWKBGeomPoint.

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

g = (*models.EWKBGeomPoint)(gt.(*geom.Point))

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

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

但是,无论哪种情况,您都没有覆盖该Scan函数,而是Scan为新类型定义了一个函数。


查看完整回答
反对 回复 2022-05-10
?
Qyouu

TA贡献1786条经验 获得超11个赞

你只能输入 assert what's in interface,所以你别无选择,只能使用gt.(*geom.Point),但你可以转换结果:

g = (*models.EWKBGeomPoint)(gt.(*geom.Point))


查看完整回答
反对 回复 2022-05-10
  • 2 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号