为什么golang中的符号是int32的别名而不是uint32?

32 go

runeGo中的类型定义

别名,int32并且int32在所有方面都等同于.按照惯例,它用于区分字符值和整数值.

如果目的是使用这种类型的代表字符值,为什么Go语言的作者没有使用uint32,而不是int32rune当它是负数时,他们如何期望在程序中处理一个值?另一个类似的类型byteuint8(而不是int8)的别名,这似乎是合理的.

che*_*eng 18

我用谷歌搜索并找到了这个:https://groups.google.com/forum/#!topic / golang -nuts/d3_GPK8bwBg

这已被问过好几次了.符文占用4个字节而不仅仅是一个,因为它应该存储unicode代码点而不仅仅是ASCII字符.与数组索引类似,数据类型已签名,因此您可以在对这些类型进行算术运算时轻松检测溢出或其他错误.

  • 克里斯托夫·哈克:"这已经被问了几次符占用4个字节,不只是一个,因为它应该是存储Unicode码点并不仅仅是ASCII字符,如数组索引,数据类型是有符号的,这样就可以很容易地检测溢出或其他.使用这些类型进行算术时出错." (3认同)
  • @TapanKarecha:uint16不适合所有的Unicode.它适合它的很大一部分,但Unicode以`0x10fffd`结束. (2认同)
  • 是的:当'a = 1`和'b = 2`([play](http://play.golang.org/p/lsdiZJiN7V)时,`uint`可能有难以调试的行为,如`ab> 1000` ).所以Go使用`int`它可以. (2认同)

Ry-*_*Ry- 6

它不会\xe2\x80\x99t 变为负值。目前 Unicode 中有 1,114,112 个代码点,0x7fffffff即使考虑到所有保留块,也远远低于 2,147,483,647 ( ) \xe2\x80\x93 。

\n

  • 我认为 chendesheng 的引述最能说明问题的根本原因:Go 使用大量有符号值,不仅用于符文,还用于数组索引、“读”/“写”字节计数等。这是因为“uint”,在任何语言中,除非你保护每一项算术不溢出(例如,如果 `var a, b uint = 1, 2`、`ab > 0` 和 `ab > 1000000`:http://play.golang.org/p /lsdiZJiN7V)。int 的行为更像日常生活中的数字,这是使用它们的令人信服的理由,并且没有同样令人信服的理由不使用它们。 (8认同)
  • 谢谢!尽管符文目前可以处理比 unicode 所需的范围大得多的范围,但问题在于负值*可以*分配给符文。如果它是无符号整数,则可以避免这种情况。但可能还有其他考虑因素使符文仍然是有符号类型,我想知道这些因素是什么。 (4认同)

Von*_*onC 5

Golang,Go:顺便问一下符文是什么?》提到:

最近的 Unicode 6.3 定义了超过 110,000 个符号。这需要每个代码点至少有 21 位表示,因此符文就像 int32 并且具有大量位。

但关于溢出或负值问题,请注意一些 unicode 函数(如unicode.IsGraphic)的实现包括:

我们转换为uint32以避免额外的阴性测试

代码:

const MaxLatin1 = '\u00FF' // maximum Latin-1 value.

// IsGraphic reports whether the rune is defined as a Graphic by Unicode.
// Such characters include letters, marks, numbers, punctuation, symbols, and
// spaces, from categories L, M, N, P, S, Zs.
func IsGraphic(r rune) bool {
    // We convert to uint32 to avoid the extra test for negative,
    // and in the index we convert to uint8 to avoid the range check.
    if uint32(r) <= MaxLatin1 {
        return properties[uint8(r)]&pg != 0
    }
    return In(r, GraphicRanges...)
}
Run Code Online (Sandbox Code Playgroud)

这可能是因为符文应该是常量(如“ Go符文类型解释”中提到的,其中符文可以是int32oruint32或 Evenfloat32或 ...:它的量值授权它存储在任何这些数字中类型)。