我是golang的新手。我创建了几个自定义类型,并对它们的行为差异感到困惑-我在理解上缺少一些东西。我搜索了一些Golang : Type conversion - Converting map[string]string to map[someStruct]string之类的堆栈溢出链接,但它们并没有完全解决这个问题。
我的第一个自定义类型是字符串,另一个是此自定义类型到int的映射。 下面的示例代码:
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]
我的困惑是为什么Go语言将变量dummyRuleConf自动识别为ruleConf类型?我希望演示函数抛出一个错误,提示输入期望的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的自定义类型匹配,但对于字符串却不匹配?
Fyi-我为字符串创建了一个自定义类型,因为它使我的代码更易于理解。我在其他SO帖子上读到,Go中不推荐这样做,它将摆脱它。
我需要为地图创建自定义类型,因为我想在该类型上编写方法。
答案 0 :(得分:0)
您的第一段代码是有效的,因为在分配之前您已经声明了变量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)
您还可以强制转换变量when used:
foo := "foo"
demoName(GlobalRuleName(foo))