Golang中的类型转换

时间:2019-10-16 23:27:15

标签: go casting

我是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中不推荐这样做,它将摆脱它。

我需要为地图创建自定义类型,因为我想在该类型上编写方法。

1 个答案:

答案 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))
相关问题