82

Goアプリケーションを作成する際によくあることですが、またはを使用する[]byteかどうかを選択できますstring。の明らかな可変性とは別に、[]byteどちらを使用するかをどのように決定しますか?

例としていくつかのユースケースがあります。

  1. 関数は新しいを返します[]byte。スライス容量が固定されているので、文字列を返さない理由は何ですか?
  2. []byteデフォルトほどうまく印刷されないので、ロギングの目的でstringキャストすることがよくあります。stringそれは常にあるべきでしたstringか?
  3. を付加[]byteすると、常に新しい基になる配列が作成されます。付加するデータが一定である場合、なぜこれはそうではないのstringですか?
4

3 に答える 3

45

私のアドバイスは、テキストを操作するときはデフォルトで文字列を使用することです。ただし、次のいずれかの条件が当てはまる場合は、代わりに[]byteを使用してください。

  • []バイトの可変性により、必要な割り当ての数が大幅に削減されます。

  • [] byteを使用するAPIを扱っているので、文字列への変換を避けるとコードが単純化されます。

于 2012-06-09T23:44:24.713 に答える
18

Goでは、他のどの非MLスタイルの言語よりも、タイプが意味と使用目的を伝えるために使用されていると感じました。したがって、使用するタイプを判断する最良の方法は、データが何であるかを自問することです。

文字列はテキストを表します。ただのテキスト。エンコーディングは心配する必要はなく、「文字」が実際にそうであるかどうかに関係なく、すべての操作は文字ごとに機能します。

配列は、バイナリデータまたはそのデータの特定のエンコーディングを表します。[]byteこれは、データが単なるバイトストリームまたはシングルバイト文字のストリームのいずれかであることを意味します。[]int16整数ストリームまたは2バイト文字のストリームを表します。

バイトを処理するほとんどすべてに文字列を処理する機能もあり、その逆もあるという事実を考えると、データを処理する必要があるかどうかを尋ねる代わりに、そのデータが何を表すかを尋ねることをお勧めします。そして、ボトルネックを見つけたら、物事を最適化します。

編集:この投稿は、型変換を使用して文字列を分割する理由を得た場所です。

于 2012-06-08T12:51:00.263 に答える
8
  1. 1つの違いは、返さ[]byteれたデータを別の/新しいデータ(新しいメモリ割り当てなし)を保持するために再利用できる可能性がある一方で、 stringできないことです。もう1つは、少なくともgcの実装でstringは、。よりも1ワード小さいエンティティであるということです[]byte。そのようなアイテムがたくさんあるときに、メモリを節約するために使用できます。

  2. ロギングのため[]byteにtoをキャストする必要はありません。stringのような典型的な「テキスト」動詞は%s、表現と表現に等しく%q機能します。他の方向では、同じことが例えばまたはに当てはまります。string[]byte%x% 02x

  3. 連結が実行される理由と、結果が後で何か/他の場所と再び結合されるかどうかによって異なります。その場合は、[]byteパフォーマンスが向上する可能性があります。

于 2012-05-31T11:18:12.650 に答える