当前位置: 首页 > 面试题库 >

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

秦涵涤
2023-03-14
问题内容

当我定义一个自定义类型时,基础类型的类型似乎对我是否可以按原样将其传递给函数还是需要对其进行转换有所不同。

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

}

在这里,当我运行此函数时nfInteger它会抱怨,尽管它int是基础类型。但是当我打电话mfff他们成功运行时。


问题答案:

Integerint

int您的新类型Integer是2种不同的不同类型。在Integer预期的地方,您必须传递type的值Integer

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

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

同时可能令人困惑和有趣的是,您可以不经过转换就传递未类型的常量:

nf(5)

在Go Playground上尝试一下。

原因是在规范中:可分配性:

在以下任何一种情况下,值x都可以 分配 给类型的变量T(“
x可以分配给T”):

[…]

  • x是可由type值表示的无类型常量T

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

如果您检查其他可分配性规则(上面的报价中未包括),则它们都不与尝试为Integer类型的参数传递值的情况匹配int,因此不允许这样做。

请参阅相关问题:Golang:创建常量类型并限制类型的值

RuneFuncfunc(rune) rune

此案例与上一个案例(Integerint)之间的区别在于,它int是命名类型,func(rune) rune不是。

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

* x的类型,V并且T具有相同的基础类型,并且至少是VT不是命名类型。

因此,在这种情况下:

var f RuneFunc
ff(f)

f是一个命名的类型,但是参数类型ff()就是func(rune) rune它是无名的,所以转让是允许的。



 类似资料:
  • 使用,并希望将常量/参数传递给自定义映射器 我的目的地具有 Map 类型的字段

  • 问题内容: 如何接受自定义类型查询参数? 上面的行在启动服务器时给出错误 问题答案: 查看有关注入的可接受类型的文档。(这同样适用于所有其他注释) 是原始类型 有一个接受单个String参数的构造函数 有一个名为或的静态方法,该方法接受单个String参数(例如,参见) 已注册ParamConverterProvider JAX-RS扩展SPI的实现,该扩展返回一个ParamConverter实例

  • 问题内容: 我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 我要完成的是等效于此Java代码 我要完成的方法签名正确吗? 更具体地说,将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其作为returningClass值传递,但是出现编译 错误“无法将表达式的类型’()’转换为’String’类型” CastDAO.invokeService(“test”, wi

  • 问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码:

  • 我正在尝试通过:如果流文件; 在我的主()中,到一个名为“FIFO”的类的构造函数:FIFO(文件); 在FIFO(FIFO.h)的头文件中,我有: 在FIFO.cc,我有: 我一直喜欢(还有更多,我只是粘贴其中一个): 在文件包括从/usr/lib/gcc/x86_64-redhat linux/4.4.7/…/…/…/…/包含/c /4.4.7/bits/localefwd.h: 43,从/u

  • 所以我试着做下面这样的事情 并且定义为 当尝试编译代码时,clang给出错误。我发现这是因为你不能从lambda推断出类型。 所以这实际上是正确的,因为我实际上希望的参数类型是从的参数推导出的类型。 所以我的问题是,有没有可能排除参数的推导,而只是使用的推导类型?