kurumi-bioの雑記帳

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

初心者のGo言語 -40- <LookupGroup,LookupGroupId,Current,Lookup,LookupId,GroupIds>

こんにちは、kurumi-bioです。
第1回目のuserパッケージ(標準ライブラリー)の学習です。

前回の記事

kurumi-bio.hatenablog.com

APIリファレンス(過去記事の一覧)

kurumi-bio.hatenablog.com

環境

  • Windows
    OSバージョン:Windows11 Home 22H2
    Go言語のバージョン:go version go1.20.3 windows/amd64
  • Linux
    OSバージョン:openSUSE Leap 15.4
    Go言語のバージョン:go version go1.20.3 linux/amd64

LookupGroup関数

func LookupGroup(name string) (*Group, error)

関数の説明 LookupGroup はグループを名前で検索します。グループが見つからない場合、返されるエラーのタイプは UnknownGroupError です。

package main

import (
    "fmt"
    "os"
    "os/user"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "usage: LookupGroup グループ名")
        os.Exit(1)
    }
    g, e := user.LookupGroup(os.Args[1])
    if e != nil {
        fmt.Fprintf(os.Stderr, "LookupGroup Error:%v\n", e)
        os.Exit(2)
    }
    fmt.Printf("Name=[%s]\n", g.Name)
    fmt.Printf("Gid=[%s]\n", g.Gid)
}

コードの説明 実行時の引数で渡された"グループの名前"をuser.LookupGroup関数で検索し、その結果を出力します。

◆実行結果(Windows)

◆実行結果(Linux)

実行結果の説明 Windowsは、"Administrators"、"Power Users"、"Guests"のグループ名を検索し、 Linuxは、"root"と"Users"のグループ名を検索して、それぞれのGidが出力されました。

◆実行結果(Linux)

実行結果の説明 存在しないグループ名を検索すると group: unknown group <グループ名>(未知のグループ)と出力されました。

LookupGroupId関数

func LookupGroupId(gid string) (*Group, error)

関数の説明 LookupGroupId は、groupid によってグループを検索します。グループが見つからない場合、返されるエラーのタイプは UnknownGroupIdError です。

◆テストコード

package main

import (
    "fmt"
    "os"
    "os/user"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "usage: LookupGroupId グループID")
        os.Exit(1)
    }
    g, e := user.LookupGroupId(os.Args[1])
    if e != nil {
        fmt.Fprintf(os.Stderr, "LookupGroupId Error:%v\n", e)
        os.Exit(2)
    }
    fmt.Printf("Name=[%s]\n", g.Name)
    fmt.Printf("Gid=[%s]\n", g.Gid)
}

コードの説明 実行時の引数で渡された"グループのID"をuser.LookupGroupId関数で検索し、その結果を出力します。

◆実行結果(Windows)

◆実行結果(Linux)

実行結果の説明 user.LookupGroup関数で出力されたグループIDを検索し、それぞれグループ名が出力されました。

◆実行結果(Linux)

実行結果の説明 存在しないグループIDを検索するとgroup: unknown groupid <グループId>(未知のグループId)と出力されました。

GroupIds関数

func (u *User) GroupIds() ([]string, error)

関数の説明 GroupIds は、ユーザーがメンバーであるグループ ID のリストを返します。

Current関数

func Current() (*User, error)

関数の説明 Current は現在のユーザーを返します。 最初の呼び出しでは、現在のユーザー情報がキャッシュされます。後続の呼び出しではキャッシュされた値が返され、現在のユーザーへの変更は反映されません。

◆テストコード

package main

import (
    "fmt"
    "os"
    "os/user"
)

func getGroupName(gid string) string {
    n, e := user.LookupGroupId(gid)
    if e != nil {
        fmt.Fprintf(os.Stderr, "LookupGroupId Error[%s]:%v\n", gid, e)
        return ""
    }
    return n.Name
}

func main() {
    u, e := user.Current()
    if e != nil {
        fmt.Fprintf(os.Stderr, "Current Error:%v\n", e)
        os.Exit(1)
    }
    fmt.Printf("Gid=[%s]:[%s]\n", u.Gid, getGroupName(u.Gid))
    fmt.Printf("HomeDir=[%s]\n", u.HomeDir)
    fmt.Printf("Name=[%s]\n", u.Name)
    fmt.Printf("Uid=[%s]\n", u.Uid)
    fmt.Printf("Username=[%s]\n", u.Username)
    l, e2 := u.GroupIds()
    if e2 != nil {
        fmt.Fprintf(os.Stderr, "GroupIds Error:%v\n", e2)
        os.Exit(2)
    }
    for c, s := range l {
        fmt.Printf("GroupId[%d]=[%s]:[%s]\n", c, s, getGroupName(s))
    }
}

コードの説明 現在のユーザー(ログインユーザー)の情報を出力します。
ユーザーが複数のグループに所属している可能性があるので、GroupIds関数でグループIDのリストを取得して出力しています。

◆実行結果(Windows)

◆実行結果(Linux)

実行結果の説明 ユーザー情報が出力されました。
Windowsは、ユーザー名にホスト名が含まれていました。
また、二つのグループに所属していて、片方はグループ名が"なし"になっていました。
プロパティを表示すると所属するグループは"Users"のみでした。謎です。

Lookup関数

func Lookup(username string) (*User, error)

関数の説明 ルックアップはユーザー名でユーザーを検索します。ユーザーが見つからない場合、返されるエラーのタイプは UnknownUserError です。

◆テストコード

package main

import (
    "fmt"
    "os"
    "os/user"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "usage: Lookup ユーザー名")
        os.Exit(1)
    }
    u, e := user.Lookup(os.Args[1])
    if e != nil {
        fmt.Fprintf(os.Stderr, "Lookup Error:%v\n", e)
        os.Exit(2)
    }
    fmt.Printf("Gid=[%s]\n", u.Gid)
    fmt.Printf("HomeDir=[%s]\n", u.HomeDir)
    fmt.Printf("Name=[%s]\n", u.Name)
    fmt.Printf("Uid=[%s]\n", u.Uid)
    fmt.Printf("Username=[%s]\n", u.Username)
    l, e2 := u.GroupIds()
    if e2 != nil {
        fmt.Fprintf(os.Stderr, "GroupIds Error:%v\n", e2)
        os.Exit(3)
    }
    for c, s := range l {
        fmt.Printf("GroupId[%d]=[%s]\n", c, s)
    }
}

コードの説明 実行時の引数で渡された"ユーザーの名前"をuser.Lookup関数で検索し、その結果を出力します。

◆実行結果(Windows)

◆実行結果(Linux)

実行結果の説明 起動時の引数で指定したユーザー名の情報が出力されました。
Windowsでは、ホスト名を省いてユーザー名のみでも結果が出力されました。

◆実行結果(Linux)

実行結果の説明 存在しないユーザー名を検索するとgroup: unknown user <ユーザー名>(未知のユーザー名)と出力されました。

LookupId関数

func LookupId(uid string) (*User, error)

関数の説明 LookupId はユーザー ID によってユーザーを検索します。ユーザーが見つからない場合、返されるエラーのタイプは UnknownUserIdError です。

◆テストコード

package main

import (
    "fmt"
    "os"
    "os/user"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "usage: LookupId ユーザーID")
        os.Exit(1)
    }
    u, e := user.LookupId(os.Args[1])
    if e != nil {
        fmt.Fprintf(os.Stderr, "LookupId Error:%v\n", e)
        os.Exit(2)
    }
    fmt.Printf("Gid=[%s]\n", u.Gid)
    fmt.Printf("HomeDir=[%s]\n", u.HomeDir)
    fmt.Printf("Name=[%s]\n", u.Name)
    fmt.Printf("Uid=[%s]\n", u.Uid)
    fmt.Printf("Username=[%s]\n", u.Username)
    l, e2 := u.GroupIds()
    if e2 != nil {
        fmt.Fprintf(os.Stderr, "GroupIds Error:%v\n", e2)
        os.Exit(3)
    }
    for c, s := range l {
        fmt.Printf("GroupId[%d]=[%s]\n", c, s)
    }
}

コードの説明 実行時の引数で渡された"ユーザーID"をuser.LookupId関数で検索し、その結果を出力します。

◆実行結果(Windows)

◆実行結果(Linux)

実行結果の説明 指定したユーザーIDの情報が出力されました。

◆実行結果(Linux)

実行結果の説明 存在しないユーザーIDを検索するとgroup: unknown userid <ユーザーID>(未知のユーザーid)と出力されました。

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