0

(Go 1.14.6 を使用しています。)

次のステートメントはすべて char を出力しますa

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

しかし

Println(string([]int{97} ) )

コンパイルエラーになる

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

その振る舞いは私を混乱させます。とstring(int)同じようstring(int32)に扱えるのに、どうして とはstring([]int)違う扱いをするのstring([]int32)ですか?

4

1 に答える 1

6

runeUnicode コード ポイントを表す は、 のエイリアスですint32。つまりは、ルーンのスライス ( a の文字のようなもの)を に変換するのと実質的string([]int32{})に同じです。これは便利です。string([]rune{})stringstring

intは or ではないint32のでrune、何に変換すべきかは論理的で[]intはありません。stringあいまいなので、言語仕様では許可されていません。

整数を に変換するstringと、単一のrune. 仕様: 変換:

文字列型との間の変換

  1. 符号付きまたは符号なしの整数値を文字列型に変換すると、整数の UTF-8 表現を含む文字列が生成されます。有効な Unicode コード ポイントの範囲外の値は に変換され"\uFFFD"ます。

多くの人は、変換結果が文字列としての (10 進数) 表現​​であると予想しているため、これは多くの人を混乱させます。Go の作成者はこれを認識しており、将来的に言語から削除するための措置を講じています。Go 1.15 では、go vetすでにそのような変換について警告しています。Go 1.15 リリース ノート: 獣医:

string(x) の新しい警告

vet ツールは、 or以外の整数型を持つフォームstring(x)の変換について警告するようになりました。Go での経験から、この形式の多くの変換では、 が整数 x の文字列表現に評価されると誤って想定されていることがわかっています。実際には、 の値の UTF-8 エンコーディングを含む文字列として評価されます。たとえば、文字列に評価されません。文字列、またはに評価されます。xrunebytestring(x)xstring(9786)"9786""\xe2\x98\xba""☺"

string(x)正しく使用しているコードはに書き換えることができますstring(rune(x))。または、場合によってはutf8.EncodeRune(buf, x)、適切なバイト スライスを使用して呼び出すbufことが正しい解決策になる場合があります。他のコードでは、おそらくstrconv.Itoaorを使用する必要がありますfmt.Sprint

を使用すると、この新しい獣医チェックがデフォルトで有効になりますgo test

Go の将来のリリースで変換を禁止することを検討しています。つまり、言語は、の型がまたはの場合string(x)に整数のみを許可するように変更されます。このような言語の変更には下位互換性がありません。この獣医チェックは、言語を変更するための最初の試行段階として使用しています。xxrunebyte

于 2020-08-17T09:43:58.767 に答える