go - golang中的类型转换
问题描述
我是golang的新手。我创建了几个自定义类型,但对它们的行为差异感到困惑——我的理解中遗漏了一些东西。我搜索了一些堆栈溢出链接,例如Golang:类型转换 - 将 map[string]string 转换为 map[someStruct]string,但它们并没有完全解决这个问题。
我的第一个自定义类型是一个字符串,另一个是这个自定义类型到整数的映射。下面的示例代码:
package main
import (
"fmt"
)
type GlobalRuleName string
type RuleConf map[GlobalRuleName]int
func demo(ruleConf RuleConf) {
fmt.Printf("ruleConf is %+v", ruleConf)
}
func main() {
var dummyRuleName GlobalRuleName
dummyRuleName = "dummy"
dummyRuleConf := make(map[GlobalRuleName]int)
dummyRuleConf[dummyRuleName] = 23
demo(dummyRuleConf)
}
这与输出运行良好
ruleConf is map[dummy:23]
我的困惑是为什么变量 dummyRuleConf 被 Go 自动识别为类型 ruleConf?我希望演示函数会抛出一个错误,说 type expected ruleConf。
这不适用于字符串。例如:如果我声明一个接受 GlobalRuleName 的函数并将其传递给一个字符串,则会出错。下面的示例代码:
func demoName(name GlobalRuleName) {
fmt.Printf("name is %+v", name)
}
and then within main
foo := "foo"
demoName(foo)
./prog.go:30:10: cannot use foo (type string) as type GlobalRuleName in argument to demoName
完整的去游乐场链接: https: //play.golang.org/p/WWO1H5MgLyJ
为什么它能够理解 dummyRuleConf 映射声明匹配 ruleConf 的自定义类型,但不匹配字符串?
仅供参考 - 我为字符串创建了一个自定义类型,因为它使我的代码更容易理解。我在其他 SO 帖子上读到,在 Go 中不推荐这样做,将摆脱它。
我需要为地图创建自定义类型,因为我想在该类型上编写方法。
解决方案
您的第一段代码有效,因为您已经在分配之前将变量声明dummyRuleName
为类型。GlobalRuleName
这样编译器就知道dummyRuleName
可以用作RuleConf
.
Go 是强类型语言。不同类型的变量之间没有自动类型转换。即使底层类型相同,您也需要显式键入变量以使它们可以相互分配。例如,
var foo GlobalRuleName
foo = "foo" // because "foo" string literal is not a defined type
demoName(foo)
或者
foo := GlobalRuleName("foo")
demoName(foo)
您还可以在使用时强制转换变量:
foo := "foo"
demoName(GlobalRuleName(foo))
推荐阅读
- sorting - Hbase 时间序列数据格式:使用复合键与使用带时间戳的版本控制
- sciruby - 如何在 IRuby + Jupyter 中输入字符串?
- c++ - 在 C++ 中使用虚拟关键字 VS 简单重新定义
- php - Bd Postgres 与 Laravel 的连接?
- python - 如何使用 spark/pyspark 从字符串中的每个元素创建新列
- ios - 解析:未声明的类型 'PFFile' (POD 1.17.2)
- android - DataService,两个RecyclerView,第二个上看不到项目列表
- python - 移动 tkinter 对象会留下幽灵痕迹
- c# - MongoDB AggregateArgs 丢失
- ruby-on-rails - 活动记录 - 从 has_and_belongs_to_many 和 has_many 获取相关记录