質問: 上記のサイトを参考にしてIDを生成したいと考えているのですが、Goではどのように実装すれば良いのでしょうか。 考えてみましたが、`md5.Sum(ip)`は`[16]byte`型なので`[:30]`のようにスライスできません。 golangにもPHPの`substr`のような関数があれば良いのですが、見つかりませんでした。 どのように実装できるかご教授ください。
回答: * md5ハッシュは16バイト長であると規格で定められています(ただし1バイトを8ビットとします)。 + PHPの`md5()`はそれを16進表記に直し、32文字にしています(参考)。 + Goの`md5.Sum()`は]byte型のまま結果が得られます([参考)。 * Goで[]byte型を16進数の文字列に変換したい場合、`fmt.Sprintf`が使えると思います。`%x`や`%X`フォーマットが使えます。 + あるいは、`hex.EncodeToString` でも良さそうです(参考)。ただしarrayとsliceの違いにご注意ください(参考)。 * 部分文字列は、Unicodeのことを考えると簡単には実装できないことが分かります。そのためGoでは、string型、]byte型、[]rune型を上手く使い分けています。詳しくは ["Strings, bytes, runes and characters in Go - The Go Blog" を見て下さい。 + 入力される文字列が1バイト文字に限られているのであれば、string型の変数`s`に対して単に`s[i:j]`とすると部分文字列が得られます。 + そうでない場合は、一旦[]rune型にキャストして操作すると良いです。たとえば`string([]rune(s)[i:j])`といった具合です。 * 今回の場合に限れば、最初の、[]byte型のハッシュ値の時点で部分列をとる方が簡単です。