Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字符串(int)、字符串(int32)和字符串([]int32)都有效,但字符串([]int)无效-什么';这里的理由是什么?_String_Go_Slice_Rune - Fatal编程技术网

String 字符串(int)、字符串(int32)和字符串([]int32)都有效,但字符串([]int)无效-什么';这里的理由是什么?

String 字符串(int)、字符串(int32)和字符串([]int32)都有效,但字符串([]int)无效-什么';这里的理由是什么?,string,go,slice,rune,String,Go,Slice,Rune,(我正在使用Go 1.14.6。) 以下语句都将输出chara Println(string(int(97) ) ) Println(string(int32(97) ) ) Println(string([]int32{97} ) ) 但是 将导致编译错误 cannot convert []int literal (type []int) to type string 我对这种行为感到困惑。如果它处理的string(int)与string(int32)相同,为什么它处理string([]i

(我正在使用Go 1.14.6。)

以下语句都将输出char
a

Println(string(int(97) ) )
Println(string(int32(97) ) )
Println(string([]int32{97} ) )
但是

将导致编译错误

cannot convert []int literal (type []int) to type string

我对这种行为感到困惑。如果它处理的
string(int)
string(int32)
相同,为什么它处理
string([]int)
string([]int32)
不同?

rune
表示unicode码点的是
int32
的别名。因此有效地
string([]int32{})
string([]rune{})
相同,后者将一段符文(类似
string
的字符)转换为
string
。这是有用的

int
既不是
int32
也不是
rune
,因此将
[]int
转换为
string
不符合逻辑,不明确,因此语言规范不允许这样做

将整数转换为
字符串
会产生一个带有单个
符文的字符串值

与字符串类型的转换

  • 将有符号或无符号整数值转换为字符串类型将生成一个包含整数UTF-8表示形式的字符串。超出有效Unicode代码点范围的值将转换为
    “\uFFFD”
  • 这让许多人感到困惑,因为许多人希望转换结果是字符串形式的(十进制)表示。Go的作者已经认识到了这一点,并已采取措施在将来将其从语言中删除。在Go 1.15中,
    Go vet
    已经对这种转换发出警告

    字符串(x)的新警告 vet工具现在警告有关
    string(x)
    格式的转换,其中
    x
    的整数类型不是
    rune
    byte
    。Go的经验表明,这种形式的许多转换错误地假定
    string(x)
    的计算结果是整数x的字符串表示形式。它实际上计算为一个字符串,包含
    x
    值的UTF-8编码。例如,
    string(9786)
    不会计算为字符串
    “9786”
    ;其计算结果为字符串
    “\xe2\x98\xba”
    ,或
    ”☺"

    正确使用string(x)的代码可以重写为string(rune(x))。或者,在某些情况下,使用合适的字节片buf调用utf8.EncodeRune(buf,x)可能是正确的解决方案。其他代码最有可能使用strconv.Itoafmt.Sprint

    使用
    go test
    时,默认情况下启用此新的vet检查

    我们正在考虑在Go的未来版本中禁止转换。也就是说,该语言将更改为仅允许
    字符串(x)当
    x
    的类型为
    rune
    byte
    时,对于整数
    x
    。这样的语言更改不会向后兼容。我们使用此vet检查作为更改语言的第一个尝试步骤


    “如果它处理字符串(int)的方式与处理字符串(int32)的方式相同”-不,它不会。
    go-vet
    string(int)
    上打印一条警告,感谢您提到
    go-vet
    ,这对我来说是新的(新手:)。感谢您的详细解释。我发现必须通过语言规范有点令人沮丧。如果行为更明显,会更容易。:)并感谢认识go 1.15。我几周前刚安装了1.14.6。每种语言都有一些奇怪之处,特别是在类型转换方面。go i的好处是有一个明确的规范定义语言行为。我建议您熟悉它。默认情况下,
    go-build
    go-run
    (如
    gcc-Wall
    )是否可以启用
    go-vet
    ?@pynexj不确定
    go-build
    go-run
    ,但默认情况下
    go-test
    自动运行
    vet
    cannot convert []int literal (type []int) to type string