【Go】関数の引数にオプションを実装する
ひでまる
目次
Go の関数の引数にオプションを実装する方法が気になったので、忘備録としてここに記録します。
この記事はメモとして書いてるので、比較的短く読み終わります。
構造体とポインタを活用
言語の使用上、構造体とポインタをうまく組み合わせば実装可能です。
前提知識としてポインタに関する知識が必要なため、ポインタについて詳しくない方は予めこちらの記事を読んでからこの記事をお読みください。
package main
import "fmt"
type unkoOptions struct {
Text *string
}
func unko(message string, options *unkoOptions) {
// Optionのハンドル
text := "Ubuntu"
// 構造体unkoOptionsのTextに値が入っているか。入っていないか。
if options.Text != nil {
text = *options.Text
}
fmt.Printf("I'm %s %s\n", message, text)
}
実行結果
先の例のコードを実行すると、このような結果になります。
func main() {
text := "Arch Linux"
//オプションが空
unko("using", &unkoOptions{})
// Stdout: I'm using Ubuntu
//オプションの値が存在
unko("using", &unkoOptions{Text: &text})
// Stdout: I'm using Arch Linux
}
引数用の構造体を用意
引数に任意で値を入力をするとなると、言語の使用上、渡された中身の値がnil
でも問題ない構造体を用意するのが手っ取り早いです。
//構造体を定義
type unkoOptions struct {
Text *string
}
func unko(message string, options *unkoOptions) {
構造体の値を使う
これでオプション自体の実装は終了したので、次にオプションの中の値を使ってあげます。
こちらのコードは、options.Text
がnil
ではない即ち、値が存在しているか確かめて、存在していた場合はtext
に代入してあげてます。
なおoptions.Text
はポインタであるため先頭に*
を付けて値を参照してあげてます。
text := "Ubuntu"
//値があるかチェック
if options.Text != nil {
//あったらtextに代入
text = *options.Text
}
出力
あとは出力されるだけです。
&unkoOptions
に値があるか,ないか,で出力が変わります。
fmt.Printf("I'm %s %s\n", message, text)
これで関数の引数にオプションを実装する方法について解説は終わりです。
地味に増長なので、どうにかして減らしたいところですが、実装部分が Option だと分かりやすいためこのままでも良いのかもしれません。
ここまでご愛読いただきありがとうございました。
Other articles
スターレイルではコントローラーのサポートが狭く、コントローラーを接続してもスターレイル側で認識しないことがありますが、SteamPadは認識するため、SteamPadを使ってスターレイルをコントローラーで遊びたいと思います。
昨今、miHoYo がつくったゲームということで、崩壊スターレイルを始めました。 ここでタイトルに戻るのですが、私は普段原神はコントローラーでプレイしてます。 しかし、スターレイルではコントローラーが対応していhません。 そのため AntiMichroX で対応したいと思います。
昨今SSDの容量が圧迫し始めたので、Macを初期化したのでNeoVimのビルドの忘備録を書き残したいと思います