【问题标题】:Cast/convert int to rune in Go在 Go 中将 int 转换为 rune
【发布时间】:2013-04-05 16:25:31
【问题描述】:

假设我有一个表示有效 unicode 代码点的 int64 变量(或其他整数大小),并且我想在 Go 中将其转换为符文,我该怎么办?

在 C 语言中,我会使用类似的类型转换:

c = (char) i;  // 7 bit ascii only

但在 Go 中,类型断言不起作用:

c, err = rune.( i)

建议?

【问题讨论】:

标签: casting go type-conversion rune


【解决方案1】:

你只想要rune(i)。演员通过type(x)完成。

类型断言是不同的。当您需要从不太具体的类型(如interface{})转换为更具体的类型时,您可以使用类型断言。此外,在编译时检查强制转换,类型断言发生在运行时。

以下是您如何使用类型断言:

var (
    x interface{}
    y int
    z string
)
x = 3

// x is now essentially boxed. Its type is interface{}, but it contains an int.
// This is somewhat analogous to the Object type in other languages
// (though not exactly).

y = x.(int)    // succeeds
z = x.(string) // compiles, but fails at runtime 

【讨论】:

  • 天啊!这很好用:在看起来像是要转换的函数调用中使用类型名称。不知何故,在阅读教程的过程中,我发现了很多关于类型断言的内容,但关于强制转换的内容却很少。
  • 有趣的是,我使用了类似于 java 的 instanceof 的类型断言,但就像我说的,还没有遇到过简单的转换。感谢您的帮助!
【解决方案2】:

在 Go 中,您想要进行转换。

Conversions

转换是T(x) 形式的表达式,其中T 是一个类型,并且 x 是一个表达式,可以转换为T 类型。

Conversion = Type "(" Expression ")" .

非常量值x 可以转换为类型T 案例:

  • x 可分配给 T
  • x 的类型和T 具有相同的底层类型。
  • x 的类型和 T 是未命名的指针类型,它们的指针基类型具有相同的基础类型。
  • x 的类型和T 都是整数或浮点类型。
  • x 的类型和T 都是复杂类型。
  • x 是整数或具有 []byte[]rune 类型,T 是字符串类型。
  • x 是一个字符串,T[]byte[]rune

您希望将 x(类型为 intint32int64)转换为类型为 runeT(类型为 int32 的别名)。 x的类型和T都是整数类型。

因此,T(x) 是允许的,写作rune(x),例如,c = rune(i)

【讨论】:

  • casting 标签将强制转换定义为“如果允许转换,则将对象类型显式转换为另一种类型的过程”。对于 Go 所谓的“转换”来说,“强制转换”不是与语言无关的词吗?我认为在问题上留下标签是有价值的,除非意义上的差异比我意识到的要大。 (在这种情况下,我希望得到澄清。)
  • 转换和强制转换是不同的。 Go 进行转换,而不是强制转换。 Stack Overflow 标签描述远非权威。
  • 谷歌搜索,我仍然很难发现是否有区别。我发现很多东西,例如“强制转换表示程序员要求进行显式类型转换”。这就是我对铸造的看法,我认为这就是典型的程序员的看法。请澄清重要区别,或者让我们重新添加标签,以便人们在搜索“[go] [casting]”或类似内容时(就我而言可以理解)更容易找到这个问题(以及您的有用答案) .
  • 谢谢,达山。我用错了词,因为我累了,不记得我真正想要的东西的名字(如果我记得,一开始可能不会有问题,因为这很明显)。也就是说,“强制转换”可能是试图这样做的“PDB”在第一次进行类型转换时会使用的术语——它有助于搜索,即使它是“错误的”。
  • “PDB”? “可怜的残疾 Brogrammer”?
猜你喜欢
  • 2011-12-22
  • 2016-02-17
  • 2016-12-09
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
相关资源
最近更新 更多