kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

初心者のGo言語 -17- <Expand,ExpandEnv,Getegid,Getenv,Geteuid,Getgid,Getgroups>

こんにちは、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つ取得できました。ユーザーとグループを再作成したら複数取得できるようになりました。

最後までご覧いただきありがとうございます