2013-04-13 76 views
4

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

在C我会用一个类型转换是这样的:

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

但在围棋,一种说法是行不通的:

c, err = rune.(i) 

建议?

回答

11

你只想要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 
+0

D'oh!这很好用:使用类型名称看起来像一个函数调用来投。不知何故,在整个教程中,我发现了很多关于类型断言的内容,但很少涉及到投射。 – Roboprog

+0

有趣的是,我用java的instanceof方式使用类型断言,但就像我说的,还没有穿过简单的演员表。谢谢您的帮助! – Roboprog

2

在走,你想要做一个转换。

Conversions

换算的形式为T(x)的表达式,其中T是一种类型和 x是可被转换为类型T的表达式。

Conversion = Type "(" Expression ")" . 

非恒定值x可以转换为键入任何这些 例T

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

要转换xint型,int32,或int64,要rune类型,int32类型的别名的Tx的类型和T都是整数类型。

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

+0

[tag:casting]标签将转换定义为“如果允许转换,则将对象类型显式转换为另一种类型的过程”。 “铸造”不会成为Go称为“转化”的语言不可知论词吗?我认为在问题上留下标签是有价值的,除非意识的差异比我意识到的要强。 (在这种情况下,我很乐意进行澄清。) –

+0

转换和转换是不同的。 Go做转换,而不是转换。堆栈溢出标记描述与权威很远。 – peterSO

+1

谷歌搜索,我仍然很难发现是否有差异。我发现很多东西,例如“Casting代表程序员请求做显式类型转换”。这就是我对铸造的看法,我认为这就是典型的程序员对它的看法。请澄清重要的区别,或者让我们添加标签,让人们更容易找到这个问题(以及您的有用答案),当(很可理解,就我而言)搜索“'[go] [cast ]'“或类似的。 –