存在確認
comma-okイディオムを使用します
「存在確認」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
存在しないキーはゼロ値を返す
存在しないキーを読み取ると、Goはエラーではなく、その値の型のゼロ値を返します。intでは0、stringでは空文字列です。
package main
import "fmt"
func main() {
m := map[string]int{"a": 5}
fmt.Println(m["missing"])
}曖昧さの問題
0という値が返された場合、そのキーが値0で存在するのか、それとも単に存在しないのかをどのように判断できるでしょうか。値だけからは判断できません。
カンマokイディオム
マップアクセスでは、2つの値、つまり値とブール値を返せます。キーが存在する場合、ブール値はtrueになります。これがカンマokイディオムです。
package main
import "fmt"
func main() {
m := map[string]int{"a": 0}
val, ok := m["a"]
fmt.Println(val, ok)
}存在しないキーの判別
これで違いを判別できます。キーが存在すれば、値がゼロ値であってもok = trueになります。
package main
import "fmt"
func main() {
m := map[string]int{"a": 0}
_, okA := m["a"]
_, okB := m["b"]
fmt.Println("a exists:", okA, "b exists:", okB)
}処理する前に確認する
よく使われるパターンは、ifの中でカンマokを使い、キーが存在する場合だけ処理することです。
package main
import "fmt"
func main() {
prices := map[string]int{"pen": 3}
if p, ok := prices["pen"]; ok {
fmt.Println("price is", p)
} else {
fmt.Println("not found")
}
}値を無視する
キーが存在するかどうかだけを確認したい場合は、値に対してブランク識別子_を使用します。
package main
import "fmt"
func main() {
seen := map[string]bool{"x": true}
_, exists := seen["x"]
fmt.Println("x seen:", exists)
}出現回数のカウント
カンマokはカウンターと組み合わせると便利です。ただし、okを使わなくても、存在しないキーは0から始まるためm[key]++は機能します。
package main
import "fmt"
func main() {
counts := map[string]int{}
for _, w := range []string{"a", "b", "a"} {
counts[w]++
}
fmt.Println(counts)
}安全なデフォルト値
カンマokとデフォルト値用の変数を使うと、キーが存在しない場合の代替値を指定できます。
package main
import "fmt"
func main() {
cfg := map[string]string{}
lang, ok := cfg["lang"]
if !ok {
lang = "en"
}
fmt.Println("lang:", lang)
}マップ以外のカンマok
2値を返す形式は、チャネルからの受信や型アサーションでも使われます。パターンは一貫しており、2つ目の値が成功したかどうかを示します。
package main
import "fmt"
func main() {
var i interface{} = "hello"
s, ok := i.(string)
fmt.Println(s, ok)
}集合のメンバー確認
boolまたは空の構造体を値に持つマップは、メンバーの所属を追跡するためによく使われます。カンマokを使うと、要素が集合に含まれているかを明確に確認できます。
package main
import "fmt"
func main() {
allowed := map[string]struct{}{"read": {}, "write": {}}
_, ok := allowed["delete"]
fmt.Println("delete allowed:", ok)
}ベストプラクティス
ゼロ値が正当な格納値になり得る場合は、必ずカンマokを使ってください。曖昧さがなくなり、意図も明確になります。
確認問題
val, ok := m["x"]を読み取り、val = 0, ok = trueを得ました。これは何を意味しますか。
まとめ
カンマokによる存在確認:
- 存在しないキーはゼロ値を返します
val, ok := m[key]のokがキーの存在を示します- ゼロ値が実際の値になり得る場合は使用してください
よくある質問
「存在確認」レッスンは無料ですか?
はい。「存在確認」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「存在確認」で何を学びますか?
comma-okイディオムを使用します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「存在確認」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。