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

标签 go

我不完全确定如何问这个问题 - 我有一个使用标准 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)转换错误:
interface conversion: geom.T is *geom.Point, not *models.EWKBGeomPoint

我不明白为什么会这样——我现在已经看到了多个允许这种行为的代码示例。在我看来,直觉上它应该可以工作,因为它们基本上是相同的类型,具有所有相同的基础变量和函数。

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

Link to go-geom docs

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新类型的功能。

关于go - 在 Golang 中将基类型转换为派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59942068/

相关文章:

linux - crontab 不会运行 go/golang 程序

go - Gin静态文件缓存

go - 存储通用函数

http - 戈朗 http : how to route requests to handlers

amazon-web-services - 无法将 dynamodb 结果解码为具有定义为类型接口(interface)的字段的结构

testing - 如何测试延迟的 Go 语句?

linux - 使用cgo挂接syscall “fork”

go - 如何使用 request.Context 而不是 CloseNotifier?

go - 使用模型数组中的选项渲染 SelectTag()

go - 如何在GoLang中获取MySQL表的描述