Closed1

Slice と nil と並行的に安全な雑談

以下の記事について。

https://zenn.dev/unm/articles/6f88814d71ee49

これの元ネタである "6.2.2. Prefer var args to []T parameters" の意味は複数のパラメータがあるときに同じ型なら []T で slice に纏めるとか横着するんじゃなくて first T, rest []T などと引数を分けて利用者に「意図」が分かるようにすべき,というものだ。

Slice の特定要素にアクセスするためには(nil も含めて)必ずサイズチェックが必要となり更にそれを検証するためのテストも必要で,どうしても煩雑なコードになる。煩雑さを避けるために引数を分けるというのは(それに意味があるなら)合理的な話である。

ただし len() 組み込み関数であれ for-range 構文であれ slice が nil でもそれ自体の結果ががヌルポになることはない。以下のコードは何も吐き出さないが panic にもならない

package main

import "fmt"

func f(elms []int) {
    for i, v := range elms {
        fmt.Println(i, v)
    }
}

func main() {
    f(nil)
}

最初に紹介した記事のリピート・パターンは以下の条件下で有利である。

  1. 順次アクセスである
  2. リソースへのアクセスが「並行的に安全(concurrency safe)」であることを保証する必要がある

Map や slice を goroutine 間で 「並行的に安全」に取り扱おうとすると,どうしても面倒くさくなる。 Channel を使ってリソースをひとつの goroutine 内に閉じ込める戦略は正しい。ただし,どうしても遅くなるんだよなぁ。

このスクラップは1ヶ月前にクローズされました
ログインするとコメントできます