当我定义一个自定义类型时,似乎底层类型的类型对我是否可以将其传递给函数或我需要转换它有所不同。
问题是:
为什么RuneFunc
和StringMap
有效,有效Integer
?
https://play.golang.org/p/buKNkrg5y-
package main
type RuneFunc func(rune) rune
type Integer int
type StringMap map[string]string
func main() {
//m := make(StringMap)
//mf(m)
var i Integer = 5
nf(i)
//var f func(rune) rune
//ff(f)
}
func mf(i map[string]string) {
}
func ff(i func(rune)rune) {
}
func nf(i int) {
}
在这里,当我使用nf
运行这个名为Integer
的函数时,它抱怨虽然int
是基础类型。但是,当我致电mf
或ff
时,它们会成功运行。
答案 0 :(得分:15)
Integer
和int
int
您的新类型Integer
是两种不同的不同类型。如果需要Integer
,则必须传递Integer
类型的值。
如果您有Integer
值,则可以使用简单类型转换将其设为int
类型的值,因为Integer
的基础类型为int
:
var i Integer = 5
nf(int(i))
同时令人困惑和有趣的是,你可以在没有转换的情况下传递无类型常量:
nf(5)
在Go Playground上尝试这些。
值
x
可分配到T
类型的variable(“x
可分配给T
”)在任何这些情况下:[...]
x
是一种无类型的constant,可以使用T
类型的值表示。
5
是一个无类型常量,可由int
类型的值表示,因为无类型常量5
具有default type int
,因此它是可由类型Integer
(具有相同的默认类型)的值表示。
如果您检查其他可分配性规则(未包含在上面的引用中),则它们都不会与您尝试为Integer
类型的参数传递值int
的情况相匹配,因此不允许。
请参阅相关问题:Golang: Creating a Constant Type and Restricting the Type's Values
RuneFunc
和func(rune) rune
此案例与前一个案例(Integer
和int
)之间的区别在于int
是named type而func(rune) rune
不是。{/ p>
并且有一个可分配性规则允许这样做:
x
的类型V
和T
具有相同的underlying types,且V
或T
中至少有一个不是{{} 3}}。
所以在这种情况下:
var f RuneFunc
ff(f)
f
是一种命名类型,但参数类型ff()
为func(rune) rune
,未命名,因此允许分配。
答案 1 :(得分:2)
Go有一个严格的类型系统。仅仅因为你的类型只是int的别名并不意味着你可以自由地交换这两个,你仍然需要进行类型转换。以下是您的主要版本的工作版本,以下是游戏场地的代码:https://play.golang.org/p/BDTXnnG9Lg