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

类型转换与类型转换

类型转换与类型转换

Go
陪伴而非守候 2022-05-05 17:32:07
在 Go 中,由于它是静态类型语言,我们可以看到很多类型转换,例如,var x float64var y =32x=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 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

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

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

或更简单地说:

bar := Bar(foo)

规范中的相关引用是:

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

  • ...

  • 忽略结构标签(见下文),x 的类型和 T 具有相同的基础类型。

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

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

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

  • *Foo并且*Bar是指针类型

  • *Foo并且*Bar不是定义的类型。

  • 基本类型FooBar具有相同的基础类型。


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

TA贡献1874条经验 获得超12个赞

Go 既不支持类型转换也不支持隐式类型转换,而许多静态支持语言(如 Java C/C++)同时支持两者。Go 只支持类型转换。



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

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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