Go 文字列でのバイト アクセスについて
スライス表記 str[i] を使用して文字列内の文字にアクセスすると、バイト型の値が返されます囲碁で。これにより、Go がこの操作中にルーンからバイトへの変換を実行するかどうかという疑問が生じます。
Go でのバイト アクセス
特に、Go 文字列は UTF-8 を格納します。文字やルーン文字ではなく、テキストのエンコードされたバイト。したがって、文字列 (str[i]) にインデックスを付けると、対応するバイト値が直接取得されます。したがって、この操作中に変換は実行されません。
for ... range を使用したルーン反復
for ... range ループを使用して文字列を反復する場合、バイトではなくルーン (文字) を取得します。これは、Go がルーンのバイト オフセットを反復するようにループを最適化するためです。ループ内の最初の値はバイト インデックスを表し、2 番目の値は実際のルーンまたは文字です。このループにより、[]byte スライスへの変換が回避され、UTF-8 でエンコードされた文字を処理する際のパフォーマンスが向上します。
バイト反復で []byte に変換
あるいは、 []byte(str) 関数を使用して文字列を []byte スライスに変換することもできます。 Go は元の文字列のバイトを指すようにコピーを最適化するため、このアプローチではコピーは生成されません。この最適化にもかかわらず、この方法でバイトを反復処理することは、for ... range ループを使用してルーンを反復処理するよりも効率が低くなります。
結論
要約, Go 文字列には UTF-8 でエンコードされたバイトが格納され、str[i] を使用して要素にアクセスすると、変換せずにバイト値が取得されます。ルーン (文字) を反復処理する場合、文字列に対して for ... range ループを直接使用する方が、文字列を []byte スライスに変換するより効率的です。
以上がスライス表記を使用して文字列にアクセスする場合、Go はルーンをバイトに変換しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。