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

如何在Go中强制转换为类型别名?

江佐
2023-03-14
问题内容

看到 这个操场片段

相关代码:

type somethingFuncy func(int) bool

func funcy(i int) bool {
    return i%2 == 0
}

var a interface{} = funcy

func main() {

    _ = a.(func(int) bool)  // Works

    fmt.Println("Awesome -- apparently, literally specifying the func signature works.")

    _ = a.(somethingFuncy)  // Panics

    fmt.Println("Darn -- doesn't get here. But somethingFuncy is the same signature as func(int) bool.")
}

通过显式声明类型,第一个类型转换起作用。但是,第二次引发恐慌。为什么?是否有一种干净的方法可以转换为更长的功能签名?


问题答案:

tl; dr

对于类型断言(您使用的类型),仅实际类型很重要。因此somethingFuncy,仅等于somethingFuncy和不等于func(int) bool

说明

首先,这与铸造无关。进行中没有强制转换。有类型断言和类型转换。

您正在处理类型断言,并假设与类型 转换 具有相同的条件。在阅读您的问题时,我犯了同样的错误,但实际上在行为上存在巨大差异。

假设您有两种类型,比如inttype MyInt int。这些都是可转换的,因为它们都共享相同的基础类型(转换规则之一),因此可以正常工作(播放):

var a int = 10
var b MyInt = MyInt(a)

现在,假设a不是类型int而是interface{}(play)类型:

var a interface{} = int(10)
var b MyInt = MyInt(a)

编译器会告诉您:

无法将类型接口{}转换为MyInt类型:需要类型断言

所以现在我们不再进行 转换 ,而是 断言 。我们需要这样做(播放):

var a interface{} = int(10)
var b MyInt = a.(MyInt)

现在,我们遇到的问题与您的问题相同。此断言由于以下错误而失败:

恐慌:接口转换:接口是int而不是main.MyInt

规范的类型断言部分说明了这种情况的原因:

对于接口类型和类型的表达式x T,主表达式x.(T) 断言x不是,nil并且其中存储的值x是类型T。该符号
x.(T)称为类型声明。 更确切地说,如果T不是接口类型,x.(T)则断言的动态类型x与type相同T

因此int必须与相同MyInt。类型标识规则声明(除其他规则外):

如果两个命名类型的类型名称源自同一TypeSpec,则它们是相同的。

作为intMyInt有不同的声明(TypeSpecs)他们不是平等的,断言失败。当对断言aint,断言起作用。因此,您正在做的事情是不可能的。

奖金:

实际检查在此代码中进行,该代码仅按预期检查两种类型是否相同。



 类似资料:
  • Go 语言是一种强类型语言,而且没有隐式转换。也就是说运算符左右的变量类型必须一致,若不一致就会报错。为了使用户更加的容易使用,所以 Go 语言提供了各个类型之间强制类型转换的内置方法。 1. 整型和浮点型互相转换 整型和浮点型变量之间的相互转换相对容易,只需使用强制类型转换标志 type(variable)就好了。需要注意的是,当高精度向低精度类型转换的时候,会失真。即浮点型向整型转换的时候会失

  • 强制类型转换 隐式类型转换:隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 显式类型转换:显式类型转换又称为强制类型转换,指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换可能会造成数据的精度丢失。 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则

  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 本文向大家介绍C#中的自动类型转换和强制类型转换,包括了C#中的自动类型转换和强制类型转换的使用技巧和注意事项,需要的朋友参考一下 前面已经认识了不同的数据类型,你们有没有尝试过让不同的数据类型进行运算呢? 运行结果是:1 我们把一个整型的变量赋值给了一个浮点型的变量,可以正常的输出,如果我们把一个浮点型的变量赋值给一个整型的变量呢? 这样就会报错。 为什么呢?因为我们之前说过,变量就像一个容器,

  • 问题内容: 让我们假设下表(例如,几个内部join语句的结果): 例如,您可以从以下语句中获取: 现在,如果我想将t1.column_1和t2.column_2总结如下 结果显示如下: 我的问题基本上是:有没有一种方法可以将NULL类型转换为0以便进行一些数学运算? 我曾尝试和,而是保持一个。 问题答案: 使用的列值转换到零。或者,COALESCE函数将执行相同的操作,除了(1)符合ANSI标准,

  • 从上面的标题来看,目前我遇到了一个问题,即无法从一个模型类转换到另一个模型类。我写的代码有问题吗?请随时向我询问更多信息。非常感谢。 我怀疑: 这种方法“selectTheOldFnException”有一些错误,那就是使用了hibernate,但我不确定这个理论。 REST控制器 使用HIBERNATE-MatchingEngine选择POJO。班 POJO班 例外代码