Приведение базового типа к производному типу в Golang - PullRequest
0 голосов
/ 28 января 2020

Я не совсем уверен, как задать этот вопрос - у меня есть тип, который я «извлек» из другого, используя стандартное ключевое слово типа 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 docs

Go версия go1.13.4 linux / amd64

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы не можете переопределить функции в 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 для нового типа.

0 голосов
/ 28 января 2020

Вы можете только напечатать assert , что находится в интерфейсе, поэтому у вас нет выбора, кроме как использовать gt.(*geom.Point), но вы можете преобразовать результат:

g = (*models.EWKBGeomPoint)(gt.(*geom.Point))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...