いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-458 (flagパッケージ再入門)(05-TextVar)

関連記事

Goメモ-454 (flagパッケージ再入門)(01-FlagSet) - いろいろ備忘録日記

Goメモ-455 (flagパッケージ再入門)(02-Var) - いろいろ備忘録日記

Goメモ-456 (flagパッケージ再入門)(03-Duration) - いろいろ備忘録日記

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

最近、flaggy とかを利用していて、あまりflagパッケージを触らなくなってきているのですが

小さなツールをちゃちゃっとワンタイムで利用するときは、やっぱり使ったりします。

使っていないと忘れてしまいそうなので、ここに自分の備忘録として残しておこうと思います。

今回は、flag.TextVar()について。

flag.TextVar() は、Go 1.19 で追加された関数です。encoding.TextUnmarshaler を実装している型を指定出来ます。

encoding.TextUnmarshaler を実装しているものとして以下のものがあります。

  • time.Time
  • net.IP
  • net.URL

サンプル

package flags

import (
    "flag"
    "net"
    "time"

    "github.com/devlights/gomy/output"
)

// TextVar は、 flag.TextVar() のサンプルです.
//
// flag.TextVar() は、Go 1.19 で追加された関数です。
// encoding.TextUnmarshaler を実装している型を指定出来ます。
//
// encoding.TextUnmarshaler を実装しているものとして以下のものがあります。
//
//   - time.Time
//   - net.IP
//   - url.URL
//
// # REFERENCES
//   - https://pkg.go.dev/flag@go1.22.4#TextVar
func TextVar() error {
    var (
        fs = flag.NewFlagSet("", flag.ExitOnError)
        tm time.Time
        ip net.IP
    )

    fs.TextVar(&tm, "time", time.Unix(0, 0), "time")
    fs.TextVar(&ip, "ip", net.IPv4(127, 0, 0, 1), "ip addr")

    // 時刻表記の末尾の Z はUTCを表す
    fs.Parse([]string{"-time", "2024-01-02T03:04:05Z", "-ip", "192.168.149.111"})

    tz, _ := time.LoadLocation("Asia/Tokyo")
    output.Stdoutf("[time]", "UTC=%s\tJST=%s\n", tm, tm.In(tz))
    output.Stdoutl("[ip  ]", ip)

    return nil

    /*
      $ task
      task: [build] go build .
      task: [run] ./try-golang -onetime

      ENTER EXAMPLE NAME: flags_textvar

      [Name] "flags_textvar"
      [time]               UTC=2024-01-02 03:04:05 +0000 UTC  JST=2024-01-02 12:04:05 +0900 JST
      [ip  ]               192.168.149.111


      [Elapsed] 152.56µs
   */

}

参考情報

Goメモ-428 (flaggyメモ)(01) - いろいろ備忘録日記

Goメモ-429 (flaggyメモ)(02) - いろいろ備忘録日記

Goメモ-430 (flaggyメモ)(03) - いろいろ備忘録日記

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。