Hor*_*ing 9 types type-conversion go
当我定义一个自定义类型时,似乎底层类型的类型对我是否可以将其传递给函数或我需要转换它有所不同.
问题是:
为什么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) {
}
Run Code Online (Sandbox Code Playgroud)
在这里,当我运行这个函数调用nf
与Integer
它抱怨,虽然int
是基础类型.但是当我打电话mf
或ff
他们成功运行时.
icz*_*cza 16
Integer
和 int
int
你的新类型Integer
是2种不同的不同类型.在Integer
预期的位置,您必须传递类型的值Integer
.
如果您有Integer
值,则可以使用简单类型转换使其成为类型的值int
,因为基础类型Integer
为int
:
var i Integer = 5
nf(int(i))
Run Code Online (Sandbox Code Playgroud)
同时令人困惑和有趣的是,您可以在不转换的情况下传递无类型常量:
nf(5)
Run Code Online (Sandbox Code Playgroud)
在Go Playground尝试这些.
的值
x
是分配给可变型的T
("x
是分配给T
")在任何这些情况中:[...]
5
是一个无类型的常量,可以通过类型的值表示,int
因为无类型的常量5
具有默认类型 int
,因此它可以通过类型的值Integer
(具有相同的默认类型)来表示.
如果检查其他可分配性规则(未包括在上面的引号中),则它们都不匹配您尝试为Integer
类型参数传递值的情况int
,因此不允许这样做.
请参阅相关问题:Golang:创建常量类型并限制类型的值
RuneFunc
和 func(rune) rune
这种情况与前一种情况(Integer
和int
)之间的区别在于它int
是一种命名类型而func(rune) rune
不是.
并且有一个可赋值规则允许这样:
所以在这种情况下:
var f RuneFunc
ff(f)
Run Code Online (Sandbox Code Playgroud)
f
是一个命名的类型,但是参数类型ff()
就是func(rune) rune
它是无名的,所以转让是允许的.