0Pricing
Go Academy · レッスン

存在確認

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. mapの内部構造
  2. 存在確認
  3. 集合としてのmap
  4. 反復処理と順序
← Go Academyに戻る