こんにちは、kurumi-bioです。
第4回目のosパッケージ(標準ライブラリー)の学習です。
osパッケージはWindowsで使用できない関数があります。
その場合は、Linux(openSUSE)で出力した結果も併せて記載します。
環境
メイン
OSバージョン:Windows11 Home 22H2
Go言語のバージョン:go version go1.19.4 windows/amd64サブ
OSバージョン:openSUSE Leap 15.4
Go言語のバージョン:go version go1.20.1 linux/amd64
Expand関数
func Expand(s string, mapping func(string) string) string
Expand は、マッピング関数に基づいて文字列内の ${var} または $var を置き換えます。たとえば、os.ExpandEnv(s) は os.Expand(s, os.Getenv) と同等です。
<サンプルコード>ExecutableSample.go
package main import ( "fmt" "os" "strconv" ) func main() { m := func(s string) string { var i int i, e := strconv.Atoi(s) if e != nil { fmt.Fprintf(os.Stderr, "strconv.Atoi Error: %v \n", e) return "unknown" } if i < 3 { return "baby" } else if i < 12 { return "child" } else { return "adult" } } fmt.Println(os.Expand("$13 / ${13}", m)) }
<実行結果>
m := func(s string) string {*<途中省略>*}
の部分がマッピング関数です。
年齢(文字列)を受け取って、年齢に応じた区分を返すマッピング関数にしています。
fmt.Println(os.Expand("$13 / ${13}", m))
の部分でマッピング関数から戻ってきた値を出力しています。
${var} または $var
と記載されていたので両方とも試してみましたが、数字の場合{}で囲まないと一文字だけが引数となるので注意が必要です。
ExpandEnv関数
func ExpandEnv(s string) string
ExpandEnv は、現在の環境変数の値に従って、文字列内の ${var} または $var を置き換えます。未定義の変数への参照は、空の文字列に置き換えられます。
<サンプルコード>ExpandEnvSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.ExpandEnv("[$PROCESSOR_ARCHITECTURE] / [${PROCESSOR_ARCHITECTURE}]")) fmt.Println(os.ExpandEnv("[$OS] / [${OS}]")) fmt.Println(os.ExpandEnv("[$NON] / [${NON}]")) }
<実行結果>
文字列の場合は、{}で囲まなくても文字の切れ目までが引数となります。 存在しない環境変数を引数にすると空文字になります。
Getegid関数
func Getegid() int
Getegid は、呼び出し元の数値の実効グループ ID を返します。 Windows では -1 を返します。
<サンプルコード>GetegidSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getegid()) }
<実行結果>
(上)Windowsでは-1が返ってきました。
(下)Linuxでは、実効グループ IDが取得できました。
Getenv関数
func Getenv(key string) string
Getenv は、キーによって指定された環境変数の値を取得します。変数が存在しない場合は空になる値を返します。空の値と設定されていない値を区別するには、LookupEnv を使用します
<サンプルコード>GetenvSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getenv("OS")) }
<実行結果>
環境変数OSの値が取得できました。
<広告の下に続きます。>
Geteuid関数
func Geteuid() int
Geteuid は、呼び出し元の数値有効ユーザー ID を返します。 Windows では -1 を返します
<サンプルコード>GeteuidSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Geteuid()) }
<実行結果>
(上)Windowsでは-1が返ってきました。
(下)Linuxでは、ユーザIDが取得できました。
Getgid関数
func Getgid() int
Getgid は、呼び出し元の数値グループ ID を返します。 Windows では -1 を返します。
<サンプルコード>GetgidSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getgid()) }
<実行結果>
(上)Windowsでは-1が返ってきました。
(下)Linuxでは、グループ IDが取得できました。
Getgroups関数
func Getgroups() ([]int, error)
Getgroups は、呼び出し元が属するグループの数値 ID のリストを返します。 Windows では、syscall.EWINDOWS を返します。可能な代替手段については、os/user パッケージを参照してください。
<サンプルコード>GetgroupsSample.go
package main import ( "fmt" "os" ) func main() { i, e := os.Getgroups() if e != nil { fmt.Fprintf(os.Stderr, "os.Getgroups Error: %v \n", e) os.Exit(1) } for j, k := range i { fmt.Printf("i[%d]=%d\n", j, k) } }
<実行結果>
(上)Windowsではエラーになりました。
(下)Linuxでは、グループ IDが一つ取得できました。複数返ってこなかったのはグループの設定の仕方が悪いかと思います。
(下)Linuxでは、グループ IDが2つ取得できました。ユーザーとグループを再作成したら複数取得できるようになりました。
最後までご覧いただきありがとうございます