33

Go を独学するために、いくつかの入力を受け取り、いくつかの処理を行い、クライアントに出力 (元の入力を含む) を送信する単純なサーバーを構築しています。

入力の長さは、約 5 から 13 文字 + エンドライン、およびクライアントが送信するその他のガフまでさまざまです。

入力はバイト配列に読み込まれ、処理のために文字列に変換されます。この文字列に別の文字列が追加され、全体がバイト配列に変換されてクライアントに送り返されます。

問題は、入力が一連の NUL 文字でパディングされていることです。それらを取り除く方法がわかりません。

そのため、配列をループして、ヌル文字になったら、長さ (n) に注意し、その長さの新しいバイト配列を作成し、最初の n 文字を新しいバイト配列にコピーして使用することができます。それが最善の方法ですか、それとも簡単にする方法はありますか?

いくつかの簡素化されたコード:

data := make([]byte, 16)
c.Read(data)

s := strings.Replace(string(data[:]), "an", "", -1)
s = strings.Replace(s, "\r", "", -1)
s += "some other string"
response := []byte(s)
c.Write(response)
c.close()

また、ここで明らかに愚かなことを他に行っている場合は、知っておくとよいでしょう。

4

4 に答える 4

68

パッケージ「バイト」では、func Trim(s []byte, cutset string) []byteあなたの友達です:

Trim は、cutset に含まれる先頭および末尾の UTF-8 でエンコードされた Unicode コード ポイントをすべてスライスして、s のサブスライスを返します。

// Remove any NULL characters from 'b'
b = bytes.Trim(b, "\x00")
于 2013-03-15T11:43:26.593 に答える
6

あなたのアプローチは基本的に正しいように聞こえます。いくつかのコメント:

  1. で最初の nul バイトのインデックスが見つかったら、dataコピーする必要はありません。スライスを切り捨てるだけですdata[:idx]

  2. bytes.Indexは、そのインデックスを見つけることができるはずです。

  3. またbytes.Replace、文字列に変換する必要はありません。

于 2013-03-15T11:38:38.003 に答える