Golang преобразование типа против преобразования типа - PullRequest
0 голосов
/ 15 января 2020

В Go, из-за его статического c языка типов, мы можем видеть множество преобразований типов, например,

var x float64
var y =32
x=float64(32)

Даже если Go поддерживает приведение типов, насколько я знаю он используется очень редко. Может кто-нибудь объяснить, почему и в каких случаях можно использовать приведение типов. Ниже приведен один пример, использующий приведение типов.

type Common struct {
        Gender int
        From   string
        To     string
    }

    type Foo struct {
        Id    string
        Name  string
        Extra Common
    }

    type Bar struct {
        Id    string
        Name  string
        Extra Common
    }
    foo:=Foo{
        Id:"123",
        Name:"damitha",
        Extra: struct {
            Gender int
            From   string
            To     string
        }{Gender:1 , From:"xx", To:"yy" },
    }
    bar:=*(*Bar)(unsafe.Pointer(&foo))
    fmt.Printf("%+v\n",bar)

Даже такое сопоставление также можно достичь более безопасными способами.

Ответы [ 2 ]

4 голосов
/ 15 января 2020

Небезопасные махинации, о которых идет речь, похожи на приведение типов. Эти махинации не нужны. Используйте преобразование:

bar := *(*Bar)(&foo)

или более просто:

bar := Bar(foo)

Соответствующая цитата из спецификации :

A Непостоянное значение x может быть преобразовано в тип T в любом из следующих случаев:

  • ...
  • игнорирование структурных тегов (см. ниже), тип x и T имеют идентичные базовые значения типы.
  • игнорируя теги struct (см. ниже), тип x и T являются типами указателей, которые не являются определенными типами, и их базовые типы указателей имеют идентичные базовые типы.

Первый пункт в цитате относится к Bar(foo), поскольку Foo и Bar имеют идентичные базовые типы.

Второй пункт в цитате относится к преобразованию (*Bar)(&foo), потому что:

  • *Foo и *Bar являются типами указателей
  • *Foo и *Bar не определены типы.
  • Базовые типы Foo и Bar имеют тот же базовый тип.
0 голосов
/ 15 января 2020

Golang не поддерживает ни приведение типов, ни неявное преобразование типов, в то время как многие типы c поддерживают такие языки, как java c / c ++, поддерживающие оба. Go поддержка только для преобразования типов

...