gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:28:05 26 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 value,您可以使用简单的类型转换使其成为 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 类型的值表示(具有相同的默认类型)。

如果您检查其他可分配性规则(未包含在上面的引用中),则没有一个与您尝试传递值 Integer 的情况匹配。对于 int 类型的参数,所以这是不允许的。

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

RuneFuncfunc(rune) rune

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

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

所以在这种情况下:

var f RuneFunc
ff(f)

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

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

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