サンプルコード
Go のサンプルコード一覧
Go で「○○するには」を解決するコードサンプル。28 件。
他の言語から探す
カードの実行確認済みは、この言語のコードを実際に実行して出力を確認したことを表す。静的確認は、実行環境を用意できず、構文と公式 API ドキュメントで確認したものである。
正規表現で部分文字列を取り出すには
FindStringSubmatch は一致全体を先頭に、以降へグループを並べたスライスを返す。一致しなければ nil が返るので、添字でアクセスする前に確認する。名前付きグループは SubexpIndex で添字に変換すると、パターンを直したときの取り違えを防げる。
静的確認
文字列が正規表現に一致するか調べるには
regexp.MustCompile はコンパイルに失敗するとパニックするので、リテラルで書いたパターンに使う。実行時に組み立てたパターンなら regexp.Compile を使い、error を受け取って処理する。バッククォート文字列にすると、バックスラッシュを二重に書かずに済む。
静的確認
正規表現で置換するには
ReplaceAllString は一致した箇所をすべて置き換える。置換文字列の中では $1 で後方参照できるが、$1x と続けて書くと「1x という名前のグループ」として読まれてしまうため、直後に文字が続くときは ${1} と中括弧で囲む。
静的確認
2つの日付の差を求めるには
Sub は time.Duration を返す。Duration が持つのは Hours / Minutes / Seconds までで Days は無いため、日数が欲しければ Hours() を 24 で割る。日付だけを比べたい場合も time.Time を使うので、時刻部分をゼロで揃えてから引く必要がある。
静的確認
文字列が含まれるか調べるには
strings.Contains が部分文字列の判定で、既定では大文字小文字を区別する。名前の似た ContainsAny は「第2引数の文字のいずれかが含まれるか」を見る別物なので、部分文字列の判定に使うと意図せず true になる。大文字小文字を無視した一致だけが要るなら EqualFold を使う。
実行確認済み
配列から重複を除くには
Go には出現順を保つ重複排除の標準関数が無いため、出現済みを map に記録しながら新しいスライスへ積み直す。slices.Compact は隣り合った重複しか潰さないので、単独で使う前に並べ替えが要る。
実行確認済み
配列を文字列に連結するには
strings.Join は []string しか受け取らないため、数値のスライスは strconv.Itoa などで先に []string へ変換する必要がある。容量を len で確保しておくと連結時の再確保を避けられる。
実行確認済み
文字列を分割するには
strings.Split は区切り文字列で分けたスライスを返し、要素数を絞りたいときは strings.SplitN に上限を渡す。区切りは正規表現ではなくただの文字列として扱われるため、記号をそのまま渡してよい。空白区切りは strings.Fields のほうが連続空白をまとめてくれる。
静的確認
配列を条件で絞り込むには
Go には条件で絞り込んだ新しいスライスを返す標準関数が無いので、append で積み直すのが基本形になる。make の第 3 引数に元の長さを渡しておくと、途中でのメモリ再確保を避けられる。
静的確認
ディレクトリ内のファイル一覧を取得するには
os.ReadDir は DirEntry のスライスをファイル名順に並べて返すため、追加のソートは要らない。DirEntry は IsDir() を持っており、判定のために別途 Stat を呼ぶ必要がない。
静的確認
ネストしたJSONから値を取り出すには
構造体へ流し込む前に既定値を入れておく。json.Unmarshal は JSON に present なフィールドだけを書き換え、欠けているフィールドには触れないため、これで既定値が残る。入れ子は構造体を入れ子にするか、ポインタにして nil で欠落を判定する。
静的確認
HTTPリクエストにヘッダーを付けるには
http.Get にはヘッダーを渡す口が無いため、http.NewRequest でリクエストを組み立ててから req.Header.Set で足す。Set は同名ヘッダーを置き換え、Add は同名のまま追加するので、1 つだけ持たせたいヘッダーには Set を使う。
静的確認
環境変数を設定するには
os.Setenv はこのプロセスの環境を書き換え、error を返すので本来は確認したほうがよい。exec.Cmd の Env を nil のままにすると親の環境がそのまま引き継がれるため、一部だけ変えたいときは os.Environ() に追記する。同じキーが重複した場合は後ろの値が優先される。
静的確認
.env ファイルを読み込むには
godotenv.Load は .env を読んで os.Setenv 相当の反映を行う。ファイルが無いと error を返すので、.env を任意扱いにするなら err をログに落とすだけにして処理を続ける。godotenv は既存の環境変数を上書きしない点も python-dotenv と同じである。
静的確認
日付文字列を日付型にするには
time.Parse のレイアウトは %Y のような書式記号ではなく、参照時刻 2006-01-02 15:04:05 を並べ替えて表す点が独特である。文字列にオフセットが無く、かつ time.Parse を使うと結果は UTC になるため、地域時刻として読みたいときは time.ParseInLocation に場所を渡す。書式不一致は error で返るので戻り値を必ず確認する。
静的確認
文字列の前後の空白を除去するには
strings.TrimSpace は Unicode の空白定義に従って前後の空白を落とす。strings.Trim / TrimLeft / TrimRight に渡す第2引数は cutset と呼ばれる「除去する文字の集合」で、文字列そのものとしては扱われない。接頭辞・接尾辞を外したいときは TrimPrefix / TrimSuffix を使う。
静的確認
HTTP POSTでJSONを送るには
json.Marshal した結果を bytes.NewReader で io.Reader に包んで渡す。client.Post の第2引数が Content-Type なので、ヘッダを別に組み立てる必要はない。既定の http.DefaultClient にはタイムアウトが無いため、応答しない相手で詰まらないよう http.Client を自分で組み立てている。
静的確認
ファイルが存在するか調べるには
os.Stat のエラーには権限不足なども含まれるため、err != nil をそのまま「存在しない」と読み替えてはいけない。存在しないことだけを判定するときは errors.Is(err, fs.ErrNotExist) を使う。
静的確認
オブジェクトをJSON文字列にするには
json.Marshal は 1 行、json.MarshalIndent は整形した []byte を返す。エクスポートされていない小文字始まりのフィールドは出力されないため、JSON 側のキー名は json タグで指定する。既定では < > & が HTML 用にエスケープされるので、そのまま出したいときは json.Encoder の SetEscapeHTML(false) を使う。
静的確認
日付を書式付きの文字列にするには
Go の書式は %Y のような指定子ではなく「2006-01-02 15:04:05」という参照時刻そのものを並べて表す。数字の組み合わせに意味があるため、覚えていないうちは time.RFC3339 などの定数を使うほうが安全である。
静的確認
環境変数を読むには
os.Getenv は未設定でも空文字を返すだけでエラーにならない。空文字と「未設定」を区別したいときは os.LookupEnv を使い、第 2 戻り値の ok で存在を判定する。
静的確認
ファイルを読み込むには
os.ReadFile はファイル全体を一括で読み込み []byte を返す。文字列として扱うときは string() で変換する。巨大なファイルでは bufio.Scanner による逐次読み込みを検討する。
静的確認
ファイルに書き込むには
os.WriteFile はファイルの作成・書き込み・クローズをまとめて行う。第3引数はファイル作成時のパーミッションで、既存ファイルを上書きする場合は使われない。
静的確認
HTTP GETリクエストを送るには
http.Get ではなく http.Client を組み立てているのは、既定のクライアントにタイムアウトが無く応答しない相手を無期限に待ってしまうためである。res.Body.Close() を defer するのは、閉じ忘れると接続が再利用されずリークするからである。
静的確認
配列をソートするには
sort.Ints や sort.Strings は基本型のスライスをその場で昇順に並べ替える。独自の基準や降順にするときは sort.Slice に比較関数を渡す。いずれも元のスライスを破壊的に変更する。
静的確認
現在時刻を取得するには
time.Now() はローカルタイムゾーンを保持した time.Time を返す。Go の書式指定は %Y ではなく「2006-01-02 15:04:05」という参照時刻を並べる独自方式なので、自前で組み立てるより time.RFC3339 などの定数を使うほうが間違えにくい。
静的確認
JSONをパースするには
json.Unmarshal には構造体のポインタを渡す。エクスポートされていない(小文字始まりの)フィールドは無視されるため、json タグで JSON 側のキー名と対応付ける。
静的確認
文字列を置換するには
strings.ReplaceAll は全置換で、回数を制限するときは strings.Replace に n を渡す。n に -1 を渡すと ReplaceAll と同じ動作になる。
静的確認