首页 > 解决方案 > 类型转换与类型转换

问题描述

在 Go 中,由于它是静态类型语言,我们可以看到很多类型转换,例如,

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)

甚至这种映射也有可能以更安全的方式实现。

标签: gocastingtype-conversion

解决方案


问题中的不安全恶作剧类似于类型转换。这些恶作剧是不需要的。使用转换:

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

或更简单地说:

bar := Bar(foo)

规范中的相关引用是:

在以下任何一种情况下,非常量值 x 都可以转换为类型 T:

  • ...
  • 忽略结构标签(见下文),x 的类型和 T 具有相同的基础类型。
  • 忽略结构标签(见下文),x 的类型和 T 是未定义类型的指针类型,它们的指针基类型具有相同的底层类型。

引用中的第一点适用于Bar(foo)因为FooBar具有相同的基础类型。

报价中的第二点适用于转换(*Bar)(&foo),因为:

  • *Foo并且*Bar是指针类型
  • *Foo并且*Bar不是定义的类型。
  • 基本类型FooBar具有相同的基础类型。

推荐阅读