首页 > 解决方案 > 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 中不推荐这样做,将摆脱它。

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

标签: gocasting

解决方案


您的第一段代码有效,因为您已经在分配之前将变量声明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))

推荐阅读