kurumi-bioの雑記帳

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

初心者のGo言語 -26- <Unsetenv,UserCacheDir,UserConfigDir,UserHomeDir,WriteFile>

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

環境

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

Unsetenv関数

func Unsetenv(key string) error

関数の説明Unsetenv は、単一の環境変数の設定を解除します。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func main() {
    e := os.Setenv("TEST", "TEST")
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Setenv", e))
        os.Exit(1)
    }
    fmt.Printf("TEST=[%s]\n", os.Getenv("TEST"))

    e = os.Unsetenv("TEST")
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Setenv", e))
        os.Exit(1)
    }
    fmt.Printf("TEST=[%s]\n", os.Getenv("TEST"))
}

コードの説明 os.Setenv()関数を使って環境変数TESTに"TEST"という値を設定し、os.Getenv()関数を使って環境変数TESTの値を出力しています。 その後、os.Unsetenv()関数を使って環境変数TESTの値を解除し、os.Getenv()関数を使って環境変数TESTの値を出力しています。

◆実行結果(Windows)

実行結果の説明

  • 1行目:環境変数TESTの値が"TEST"になりました。
  • 2行目:os.Unsetenv()関数で値を解除したので、環境変数TESTの値が空になりました。

UserCacheDir関数

func UserCacheDir() (string, error)

関数の説明 UserCacheDir は、ユーザー固有のキャッシュ データに使用する既定のルート ディレクトリを返します。ユーザーは、このサブディレクトリ内に独自のアプリケーション固有のサブディレクトリを作成し、それを使用する必要があります。
Unix システムでは、 $XDG_CACHE_HOMEが空でない場合は 指定されている値を返し、空の場合は $HOME/.cache を返します。
Darwin では、$HOME/Library/Caches を返します。
Windows では、%LocalAppData% を返します。
Plan 9 では、$home/lib/cache を返します。
場所を特定できない場合 (たとえば、$HOME が定義されていない場合)、エラーが返されます。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func us() {
    e := os.Unsetenv("XDG_CACHE_HOME")
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Unsetenv", e))
        os.Exit(1)
    }
}

func se(path string) {
    e := os.Setenv("XDG_CACHE_HOME", path)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Setenv", e))
        os.Exit(1)
    }
}

func ucd() {
    s, e := os.UserCacheDir()
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.UserCacheDir", e))
        os.Exit(1)

    }
    fmt.Printf("UserCacheDir=[%s]\n", s)
}

func main() {
    us()
    ucd()

    se("~/go/nonDir")
    ucd()
}

コードの説明 os.Unsetenv関数で環境変数XDG_CACHE_HOMEの値を解除してos.UserCacheDir()関数で返される値を出力しています。 その後、os.Setenv関数で環境変数XDG_CACHE_HOMEに値を設定してから、os.UserCacheDir()関数で返される値を出力しています。

◆実行結果(Linux)

実行結果の説明

  • 1行目:環境変数XDG_CACHE_HOMEの値が空なので、"$HOME/.cache"が出力されました。
  • 2行目:環境変数XDG_CACHE_HOMEに設定した値の"~/go/nonDir"が出力されました。

広告の下に続きます。

UserConfigDir関数

func UserConfigDir() (string, error)

関数の説明 UserConfigDir は、ユーザー固有の構成データに使用する既定のルート ディレクトリを返します。ユーザーは、このサブディレクトリ内に独自のアプリケーション固有のサブディレクトリを作成し、それを使用する必要があります。
Unix システムでは、$XDG_CONFIG_HOMEが空でない場合は 指定されている値を返し、空の場合は $HOME/.config を返します。
Darwin では、$HOME/Library/Application Support を返します。
Windows では、%AppData% を返します。
Plan 9 では、$home/lib を返します。
場所を特定できない場合 (たとえば、$HOME が定義されていない場合)、エラーが返されます。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println(os.Getenv("AppData"))

    s, e := os.UserConfigDir()
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.UserConfigDir", e))
        os.Exit(1)
    }
    fmt.Println(s)
}

コードの説明 os.Getenv関数で環境変数AppDataの値を出力します。その後os.UserConfigDir関数で返される値を出力します。

◆実行結果(Windows)

実行結果の説明%AppData%と同じ値が返されることが確認できました。

UserHomeDir関数

func UserHomeDir() (string, error)

関数の説明 UserHomeDir は、現在のユーザーのホーム ディレクトリを返します。
macOS を含む Unix では、$HOME 環境変数を返します。
Windows では、%USERPROFILE% を返します。
Plan 9 では、$home 環境変数を返します。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func main() {
    s, e := os.UserHomeDir()
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.UserHomeDir", e))
        os.Exit(1)
    }
    fmt.Printf("UserHomeDir=[%s]\n", s)
}

コードの説明os.UserHomeDir関数から返ってきた値を出力します。

◆実行結果(Linux)

実行結果の説明環境変数HOMEの値が出力されました。

WriteFile関数

func WriteFile(name string, data []byte, perm FileMode) error

関数の説明 WriteFile は、指定されたファイルにデータを書き込み、必要に応じてファイルを作成します。ファイルが存在しない場合、WriteFile はパーミッション perm (umask の前) でファイルを作成します。それ以外の場合、WriteFile は、アクセス許可を変更せずに、書き込み前にファイルを切り捨てます。 Writefile を完了するには複数のシステム コールが必要なため、操作の途中で失敗すると、ファイルが部分的に書き込まれた状態のままになる可能性があります。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func pm(fileName string) {
    f, e := os.Open(fileName)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Open", e))
        os.Exit(1)
    }
    fi, se := f.Stat()
    if se != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Stat", se))
        os.Exit(1)
    }
    fmt.Printf("%v\n", fi.Mode().Perm())
}

func rf(fileName string) {
    s, e := os.ReadFile(fileName)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.ReadFile", e))
        os.Exit(1)
    }
    fmt.Printf("[%s]\n", s)
}

func main() {
    const fileName = "writeFileTest.txt"

    os.Remove(fileName)

    e := os.WriteFile(fileName, []byte("Write Test"), 0666)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.WriteFile", e))
        os.Exit(1)
    }
    rf(fileName)
    pm(fileName)

    e = os.WriteFile(fileName, []byte("Write Test2"), 0600)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.WriteFile", e))
        os.Exit(1)
    }
    rf(fileName)
    pm(fileName)
}

コードの説明 os.WriteFile関数で"writeFileTest.txt"ファイルを作成しています。1回目と2回目でファイルに書き込む内容とファイルのパーミッションを変えています。

◆実行結果(Linux)

実行結果の説明

  • 1行目:"Write Test"という内容でファイルを新規に作成しました。
  • 2行目:ファイルのパーミッションは指定した値でした。
  • 3行目:既存ファイルの内容が"Write Test2"に上書きされていました。
  • 3行目:ファイルのパーミッションは変更されませんでした。

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