go - 类型转换与类型转换
问题描述
在 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)
甚至这种映射也有可能以更安全的方式实现。
解决方案
问题中的不安全恶作剧类似于类型转换。这些恶作剧是不需要的。使用转换:
bar := *(*Bar)(&foo)
或更简单地说:
bar := Bar(foo)
规范中的相关引用是:
在以下任何一种情况下,非常量值 x 都可以转换为类型 T:
- ...
- 忽略结构标签(见下文),x 的类型和 T 具有相同的基础类型。
- 忽略结构标签(见下文),x 的类型和 T 是未定义类型的指针类型,它们的指针基类型具有相同的底层类型。
引用中的第一点适用于Bar(foo)
因为Foo
和Bar
具有相同的基础类型。
报价中的第二点适用于转换(*Bar)(&foo)
,因为:
*Foo
并且*Bar
是指针类型*Foo
并且*Bar
不是定义的类型。- 基本类型
Foo
和Bar
具有相同的基础类型。
推荐阅读
- linux-kernel - 使用 Ubuntu 21.10 构建时的 Buildroot 错误
- python - 按值和键对字典进行排序
- javascript - 尝试让我的不和谐机器人启动并运行时出现heroku 2错误
- python - 如何使用python替换特定字符后的字符串
- spring-boot - 应用程序上下文中的依赖关系形成一个循环
- scala - 我们如何加入 Spark 中的选项列?
- python - 如何提交、等待并获得 mechanize 的响应?
- node.js - 节点调度是否阻塞了事件循环?
- terraform - Terraform 远程状态 - 状态文件位置
- reactjs - React 说没有文件或目录,但文件在那里,如果我重命名文件,错误就会消失