gpt4 book ai didi

go - 自定义类型作为参数传递给函数

转载 作者:IT老高 更新时间:2023-10-28 13:10:01 24 4
gpt4 key购买 nike

当我定义一个自定义类型时,似乎底层类型的类型对我是否可以按原样将其传递给函数还是需要转换它产生影响。

问题是:为什么 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) {

}

在这里,当我使用 Integer 运行这个名为 nf 的函数时,它会提示,尽管 int 是底层类型。但是当我调用 mfff 时,它们会成功运行。

最佳答案

Integerint

int 和您的新类型 Integer 是两种不同的不同类型。在需要 Integer 的地方,您必须传递 Integer 类型的值。

如果你有一个 Integer 值,你可以使用简单的类型转换使其成为 int 类型的值,因为 Integer< 的底层类型int:

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

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

nf(5)

Go Playground 上试试这些.

原因在于 Spec: Assignability:

A value x is assignable to a variable of type T ("x is assignable to T") in any of these cases:

[...]

  • x is an untyped constant representable by a value of type T.

5 是一个无类型常量,它可以用 int 类型的值表示,因为无类型常量 5 有一个 default type int,因此它可以用 Integer 类型的值表示(具有相同的默认类型)。

如果您检查其他可分配性规则(未包含在上述引用中),它们都不匹配您尝试为 int< 类型的参数传递 Integer 值的情况,所以这是不允许的。

查看相关问题:Golang: Creating a Constant Type and Restricting the Type's Values

RuneFuncfunc(rune) rune

这种情况与前一种情况(Integerint)的区别在于int是一个named typefunc(rune) rune 不是。

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

所以在这种情况下:

var f RuneFunc
ff(f)

f 是一个命名类型,但是 ff() 的参数类型是 func(rune) rune 是未命名的,所以允许分配。

关于go - 自定义类型作为参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41501596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com