Slide 1

Slide 1 text

The Go gopher was designed by Renée French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. Go 1.18で追加される strings/bytes.Cutと (*sync.Mutex).TryLockについて 2022年2月18日(金) 資料:https://tenn.in/cuttrylock 代打!! 1

Slide 2

Slide 2 text

上田拓也 Go ビギナーズ
 Go Conference
 @tenntenn tenntenn.dev Google Developer Expert (Go) 一般社団法人 Gophers Japan 代表理事 Experts Team 2

Slide 3

Slide 3 text

Goについての活動 ■ YouTuberやってます ● チャンネル登録よろしくお願いします! ● https://tenn.in/youtube ● tennten.goとかの動画をアップしてます ■ 登壇資料もアップしてます ● https://tenn.in/slides ● 今年だけで17枚以上あります ● 今回の資料もアップロードします 3

Slide 4

Slide 4 text

今日話すこと ■ strings.Cut関数とbytes.Cut関数 ● https://pkg.go.dev/strings@go1.18rc1#Cut ● https://pkg.go.dev/bytes@go1.18rc1#Cut ● https://go.dev/issues/46336 ■ (*sync.Mutex).TryLockメソッド ● https://pkg.go.dev/sync@go1.18rc1#Mutex.TryLock ● https://go.dev/issues/45435 ● https://go.dev/issues/6123 4

Slide 5

Slide 5 text

strings.Cut関数とbytes.Cut関数 5

Slide 6

Slide 6 text

"key=value"を分けたい ■ strings.SplitN関数を使えばできそう ● 正しく分割できたか確認する必要がある ● 第2引数が空文字の場合、最初の文字で分割される strings.SplitN("key=value", "=", 2) // [key value] strings.SplitN("key=value", ":", 2) // [keyvalue] strings.SplitN("key=value", "", 2) // [k eyvalue] 6

Slide 7

Slide 7 text

strings.Cut関数 ■ 文字列を2つに分ける関数 ● 第1引数の文字列を第2引数の文字列で2つに分割する ● 見つからない場合は第3戻り値がfalseになる ● 空文字の場合はafterにすべての文字列がくる ● []byte型向けのbytes.Cut関数も同様にある 参考:Go 1.18: Cut added to strings/bytes strings.Cut("key=value", "=") // key value true strings.Cut("key=value", ":") // key=value false strings.Cut("key=value", "") // key=value true 7

Slide 8

Slide 8 text

strings.Cut関数の実装 ■ 実装は非常にシンプル ● https://cs.opensource.google/go/go/+/refs/tags/go1.18rc1:src/strings/st rings.go;l=1181 func Cut(s, sep string) (before, after string, found bool) { if i := Index(s, sep); i >= 0 { return s[:i], s[i+len(sep):], true } return s, "", false } 8

Slide 9

Slide 9 text

(*sync.Mutex).TryLockメソッド 9

Slide 10

Slide 10 text

ロック var m sync.Mutex m.Lock() go func() { time.Sleep(3 * time.Second) m.Unlock() fmt.Println("unlock 1") }() m.Lock() m.Unlock() fmt.Println("unlock 2") Playgroundで動かす ゼロ値で使える ここでブロック 10 ■ sync.Mutex ● Lockメソッドを呼ぶとUnlockメソッドが呼ばれるまで Lockメソッドの呼び出しでブロックする

Slide 11

Slide 11 text

(*sync.Mutex).TryLockメソッド ■ ロックされていた場合にブロックしない ● ブロックされていたらfalseを返す var m sync.Mutex fmt.Println(m.TryLock()) // true go func() { time.Sleep(3 * time.Second) m.Unlock() fmt.Println("unlock 1") }() fmt.Println(m.TryLock()) // false 11