Runner in the High

技術のことをかくこころみ

Golang

makeのlengthとcapacityを間違えると予想外のアロケーションが発生することがある&bytes.Bufferの処理速度について

izumisy.work 上記の記事をstackoverflowで質問したら回答がついた。 stackoverflow.com 結論から言うと自分はmakeの使い方を間違えていて、makeの第3引数にあたるcapacityを省略してスライスを作成するとそこには空データが埋まってしまうとのこと。 なので…

リテラル値でmakeしたらヒープに乗らなくてアロケーションの回数は少なくなるんじゃないか?という実験

リテラルなんだからコンパイルする時点で確保するデータサイズが決定でき、結果ランタイム時にアロケーションが発生しなくなるのではないかという仮説。 テストコード package app import ( "bytes" "testing" ) const ALLOC_SIZE = 64 * 1024 func Benchmar…

io.Readerで先頭Nバイトを読み捨てる

package main import ( "io" "io/ioutil" "strings" "os" ) func main() { a := strings.NewReader("123456789") r := io.LimitReader(a, 5) t := io.TeeReader(r, ioutil.Discard) io.ReadAll(t) io.Copy(os.Stdout, a) // 6789 }

ioutil.Discardとio.CopyNでアロケーションコストを抑えてデータサイズを判定する

ioutil パッケージに Discard という /dev/null 的な io.Writer が用意されている。 最近これを使うタイミングがあったのでメモ。以下のようなコードがあるとする。 package main import ( "fmt" "io" "io/ioutil" "strings" ) func main() { a := strings.N…

net/mailパッケージだけでもメールアドレスのバリデーションはできる

stackoverflow.com こんな感じで使える。 package main import ( "fmt" "net/mail" ) func main() { addr, err := mail.ParseAddress("izumisy.test@example.com") if err != nil { panic(err) } fmt.Println(addr.Address) // izumisy.test@example.com } …

deferで参照している変数のポインタを更新しても参照は変わらないっぽい

こういうやつ type Closer struct{ Value string } func (c *Closer) Close(id string) { fmt.Printf("Closed(%s): %p\n", id, c) } func newCloser(c *Closer) { n := &Closer{Value: "aaa"} fmt.Printf("New: %p\n", n) c = n } func main() { c := &Close…

GoのAccept Interfaceはなにが嬉しいのか

たまーに考えることがあったが、せっかくなのでアウトプットしておく。 まず前提としてGo以外のインターフェイスを持つ言語、例えばJavaではインターフェイスを満たしていることを明示するためにimplementsキーワードなどで実装を明示してやる必要がある。つ…

GolangでUnmarshallerインターフェースを実装した構造体をフィールドの型として使うと便利

例えばこんな構造体が定義されているとして type User struct { Name string `json:"name"` Status int `json:"status"` } この構造体をJSONからUnmarshalしてマッピングする際に、以下のような要件があるとする statusの取りうる範囲は1,2だけ、かつそれぞ…

Golangではinterfaceはどのパッケージに属するのか

Golangを使い始めてinterfaceでDIPっぽいことをしようとするとたしかに湧きがちな疑問のひとつ。結論から言うと、interfaceはそれを使う側のパッケージに所属させるのがセオリーらしい。なるほど。 Go interfaces generally belong in the package that uses…