传递的自定义类型用作参数

时间:2017-01-06 08:16:15

标签: go types type-conversion

当我定义一个自定义类型时,似乎底层类型的类型对我是否可以将其传递给函数或我需要转换它有所不同。

问题是: 为什么RuneFuncStringMap有效,有效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是基础类型。但是,当我致电mfff时,它们会成功运行。

2 个答案:

答案 0 :(得分:15)

Integerint

int您的新类型Integer是两种不同的不同类型。如果需要Integer,则必须传递Integer类型的值。

如果您有Integer值,则可以使用简单类型转换将其设为int类型的值,因为Integer的基础类型为int

var i Integer = 5
nf(int(i))

同时令人困惑和有趣的是,你可以在没有转换的情况下传递无类型常量:

nf(5)

Go Playground上尝试这些。

原因在于Spec: Assignability:

  

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

RuneFuncfunc(rune) rune

此案例与前一个案例(Integerint)之间的区别在于intnamed typefunc(rune) rune不是。{/ p>

并且有一个可分配性规则允许这样做:

  
      
  • x的类型VT具有相同的underlying types,且VT中至少有一个不是{{} 3}}。
  •   

所以在这种情况下:

var f RuneFunc
ff(f)

f是一种命名类型,但参数类型ff()func(rune) rune,未命名,因此允许分配。

答案 1 :(得分:2)

Go有一个严格的类型系统。仅仅因为你的类型只是int的别名并不意味着你可以自由地交换这两个,你仍然需要进行类型转换。以下是您的主要版本的工作版本,以下是游戏场地的代码:https://play.golang.org/p/BDTXnnG9Lg