2
1

More than 1 year has passed since last update.

初心者が使えそうだと思ったGoパッケージをまとめる

Posted at

はじめに

学習の一環としてGoの初心者がこれから個人開発をするにあたって使えそうだと思ったパッケージを逆引き的な感じでまとめました。
まだ途中なのでこれから開発が進むに連れてどんどん補充していく予定。

timeパッケージ

Goの時間に関係するパッケージ

時間を表示したい

time.NOW()
//現在時刻を返す関数
//>>2021-10-24 16:02:29.28855 +0900 JST m=+0.000072118

特定の時刻を作成、表示したい

t2 := time.Date(2020, 6, 10, 10, 10, 10, 0, time.Local)

//指定した時間を生成
fmt.Println(t2)
//>>2020-06-10 10:10:10 +0900 JST
fmt.Println(t2.Year())
//>>2020
fmt.Println(t2.YearDay())
//>>162
fmt.Println(t2.Month())
//>>June
fmt.Println(t2.Weekday())
//>>Wednesday
fmt.Println(t2.Day())
//>>10
fmt.Println(t2.Hour())
//>>10
fmt.Println(t2.Minute())
//>>10
fmt.Println(t2.Second())
//>>10
fmt.Println(t2.Nanosecond())
//>>0
fmt.Println(t2.Zone())
//>>JST 32400
//タイムゾーンを表示

時間を表現したい

//時刻の感覚を表現する
//time.Duration型を渡す
fmt.Println(time.Hour)
//>>1h0m0s
fmt.Printf("%T\n", time.Hour)
//>>time.Duration
fmt.Println(time.Minute)
//>>1m0s
fmt.Println(time.Second)
//>>1s
fmt.Println(time.Millisecond)
//>>1ms
fmt.Println(time.Microsecond)
//>>1µs
fmt.Println(time.Nanosecond)
//>>1ns

文字列を時間に変換したい

d, _ := time.ParseDuration("2h30m")
fmt.Println(d)
//文字列を変換できる、2h30m0sと表示

取得した時間に特定の時間を追加したい

t3 := time.Now()
t3 = t3.Add(2*time.Minute + 15*time.Second)
fmt.Println(t3)

2つの時間の差分を求めたい

t1 := time.Date(2020, 6, 10, 10, 10, 10, 0, time.Local)
t2 := time.Now()
t3 := t1.Sub(t2)
fmt.Println(t3)
//>>-12030h21m24.789621s

時間の比較をしたい

t1 := time.Date(2020, 6, 10, 10, 10, 10, 0, time.Local)
t2 := time.Now()
fmt.Println(t1.Before(t2))
//>>ture
fmt.Println(t1.After(t2))
//>>false

時間を止めたい

time.Sleep(5 * time.Second)
//この後に続くプログラムを5秒間停止させる

mathパッケージ

円周率を表示したい

fmt.Println(math.Pi)
//>>3.141592653589793

2の平方根を求めたい

fmt.Println(math.Sqrt2)
//>>1.4142135623730951

float32で表現可能な最大数を求めたい

fmt.Println(math.MaxFloat32)
//>>3.4028234663852886e+38

float32で表現可能な0ではない最小値を求めたい

fmt.Println(math.SmallestNonzeroFloat32)
//>>1.401298464324817e-45

float64で表現可能な最大数を求めたい

fmt.Println(math.MaxFloat64)
//>>1.7976931348623157e+308

float64で表現可能な0ではない最小値

fmt.Println(math.SmallestNonzeroFloat64)
//>>5e-324

int64で上記を再現

fmt.Println(math.MaxInt64)
//>>9223372036854775807
fmt.Println(math.MinInt64)
//>>-9223372036854775808

絶対値を取得したい

fmt.Println(math.Abs(100))
//>>100
fmt.Println(math.Abs(-100))
//>>100

累乗を求めたい

fmt.Println(math.Pow(0, 2))
//>>0
fmt.Println(math.Pow(2, 2))
//>>4

平方根、立方根を求めたい

fmt.Println(math.Sqrt(2))
//>>1.4142135623730951
fmt.Println(math.Cbrt(8))
//>>2

最大値、最小値を求めたい

fmt.Println(math.Max(1, 2))
//>>2
fmt.Println(math.Min(1, 2))
//>>1

小数点以下の切り捨て、切り上げをしたい

//math.Trunc 整数の正負を問わず小数点以下を単純に切り捨てる
fmt.Println(math.Trunc(3.14))
//>>3
fmt.Println(math.Trunc(-3.14))
//>>-3

//math.Floor 引数の数値より小さい最大の整数を返す
fmt.Println(math.Floor(3.5))
//>>3
fmt.Println(math.Floor(-3.5))
//>>-4

fmt.Println(math.Ceil(3.5))
//>>4
fmt.Println(math.Ceil(-3.5))
//>>-3

fmtパッケージ

fmtの標準表示をしたい(改行されないver)

fmt.Print("Hello")
//>>Hello

文字の表示をしたい(改行されるver)

fmt.Println("Hello", "World!!")
//>>Hello World!
//文字列は半角スペースで区切られる

文字列のフォーマットを指定したい

fmt.Printf("%s\n", "Hello")
//>>Hello
fmt.Printf("%#v\n", "Hello")
//>>"Hello"

書き込み先を指定した文字出力

//Fprint 書き込み先指定
fmt.Fprint(os.Stdout, "Hello")
//>>Helloと出力される

strconvパッケージ

bool値を文字列に変換したい

bt := true
fmt.Printf("%T\n", strconv.FormatBool(bt))
//>>string
fmt.Println(strconv.FormatBool(bt))
//>>true

整数を文字列にしたい

i := strconv.FormatInt(-100, 10)
fmt.Printf("%v, %T\n", i, i)
//>>-100, string

i2 := strconv.Itoa(100)
fmt.Printf("%v, %T\n", i2, i2)
//>>100, string

文字列を真偽値に変換したい

bt1, _ := strconv.ParseBool("true")
fmt.Printf("%v, %T\n", bt1, bt1)
//>>true, boolと出力

bt2, _ := strconv.ParseBool("1")
bt3, _ := strconv.ParseBool("t")
bt4, _ := strconv.ParseBool("f")
bt5, _ := strconv.ParseBool("TRUE")
bt6, _ := strconv.ParseBool("True")
fmt.Println(bt2, bt3, bt4, bt5, bt6)
//すべてtrueと出力

bf1, ok := strconv.ParseBool("false")
if ok != nil {
    fmt.Println("Convert Error")
}
//エラーハンドリングも行える

fmt.Printf("%v, %T\n", bf1, bf1)
false, boolと出力

bf2, _ := strconv.ParseBool("0")
bf3, _ := strconv.ParseBool("f")
bf4, _ := strconv.ParseBool("F")
bf5, _ := strconv.ParseBool("FALSE")
bf6, _ := strconv.ParseBool("False")
fmt.Println(bf2, bf3, bf4, bf5, bf6)
//すべてfalseと出力

文字列を整数型に変換したい

i3, _ := strconv.ParseInt("12345", 10, 0)
fmt.Printf("%v, %T\n", i3, i3)
//>>12345, int64

i4, _ := strconv.ParseInt("-1", 10, 0)
fmt.Printf("%v, %T\n", i4, i4)
//>>-1, int64

i10, _ := strconv.Atoi("123")
fmt.Println(i10)
//>>123

文字列を浮動小数点型に変換したい

fl1, _ := strconv.ParseFloat("3.14", 64)
//>>3.14
fl2, _ := strconv.ParseFloat(".2", 64)
//>>0.2
fl3, _ := strconv.ParseFloat("-2", 64)
//>>-2
fl4, _ := strconv.ParseFloat("1.2345e8", 64)
//>>1.2345e+08
fl5, _ := strconv.ParseFloat("1.2345E8", 64)
//>>1.2345e+08
fmt.Println(fl1, fl2, fl3, fl4, fl5)

stringsパッケージ

//文字列の操作に関連するパッケージ

文字列の連結をしたい

s1 := strings.Join([]string{"A", "B", "C"}, ",")
//カンマ区切り

s2 := strings.Join([]string{"A", "B", "C"}, "")
//直接連結
fmt.Println(s1, s2)
//>>A,B,C ABC

検索したい最初の文字が何番目にあるかを探し、index番号を返したい

i1 := strings.Index("ABCDE", "A")
i2 := strings.Index("ABCDE", "D")
fmt.Println(i1, i2)
//>>0 3

特定の文字が含まれる最後の文字のIndex番号を取得したい

i3 := strings.LastIndex("ABCDABCD", "BC")
fmt.Println(i3)
//>>5

i4 := strings.IndexAny("ABCDABCD", "BC")
i5 := strings.LastIndexAny("ABCDABCD", "BC")
fmt.Println(i4, i5)
//>>1 6

検索対象の文字列が指定した文字列で始まるか/終わるか確認したい

b1 := strings.HasPrefix("ABC", "A")
//始まるか
b2 := strings.HasSuffix("ABC", "C")
//終わるか
fmt.Println(b1, b2)
//>>true true

指定した文字列が含まれているか?

b3 := strings.Contains("ABC", "B")
//指定した文字列が含まれているか
b4 := strings.ContainsAny("ABCDE", "BD")
//指定した文字列が一語でも該当していたら
fmt.Println(b3, b4)
//>>true true

第一引数の文字数の中で第二引数の文字が何個含まれているか確認したい

b6 := strings.Count("ABCABC", "B")
b7 := strings.Count("ABCABC", "")
fmt.Println(b6, b7)

文字列を指定した回数分繰り返して結合したい

s3 := strings.Repeat("ABC", 4)
//>>ABCABCABCABC
s4 := strings.Repeat("ABC", 0)
//>>何も表示されない
fmt.Println(s3, s4)

特定の文字列の指定した文字を別の文字に指定した回数分変更したい

s5 := strings.Replace("AAAAAA", "A", "B", 1)
//>>AはBに1回分置換される

s6 := strings.Replace("AAAAAA", "A", "B", -1)
//>>AはBすべて置換される。(-1を引数に指定すると該当する文字列すべてを置換する)
fmt.Println(s5, s6)
//>>BAAAAA BBBBBB

文字列を分割したい

s7 := strings.Split("A,B,C,D,E", ",")
fmt.Println(s7)
//>>[A B C D E]
//セパレータを取り除いて分割

s8 := strings.SplitAfter("A,B,C,D,E", ",")
fmt.Println(s8)
//>>[A, B, C, D, E]
//セパレータを取り除かず分割

s9 := strings.SplitN("A,B,C,D,E", ",", 2)
fmt.Println(s9)
//>>[A B,C,D,E]
//分割する数を引数で指定、2つに分かれている

s10 := strings.SplitAfterN("A,B,C,D,E", ",", 4)
fmt.Println(s10)
//[A, B, C, D,E]

文字列を大文字から小文字、小文字から大文字に変換したい

s11 := strings.ToLower("ABC")
fmt.Println(s11)
//>>abc
s12 := strings.ToLower("E")
fmt.Println(s12)
//>>e

s13 := strings.ToUpper("abc")
fmt.Println(s13)
//>>ABC
s14 := strings.ToUpper("e")
fmt.Println(s14)
//>>E

文字列の前後のスペースを取り除きたい

s13 := strings.TrimSpace("     --    abc    --    ")
fmt.Println(s13)
//>>--    abc    --
//前後の空白は取り除かれる
s14 := strings.TrimSpace("       abc       ")
fmt.Println(s14)
//abc
//全角もとりのぞくことができる

文字列からスペースで区切られたフィールドを取り出したい

s18 := strings.Fields("a b c")
fmt.Println(s18)
//>>[a b c]

fmt.Println(s18[1])
//>>b
//インデックス番号でも取り出せる

regexpパッケージ

正規表現をサポートする機能をもつパッケージ

特定の文字列が正規表現にマッチするか?(基本形)

match, _ := regexp.MatchString("A", "ABC")
//第一引数が正規表現、第二引数が検索対象の文字列
fmt.Println(match)
//>>true

//上記は簡易的な形。実行の度に正規表現のコンパイルを行うため大量の実行には向かない。予め正規表現をコンパイルしておく必要がある
//エラー時は第二引数でエラーを返す
re1, _ := regexp.Compile("A")
match = re1.MatchString("ABC")
fmt.Println(match)
//>>true

//上記と違いこちらはエラー時直接runtimeエラーを吐く
re2 := regexp.MustCompile("A")
match = re2.MatchString("ABC")
fmt.Println(match)
//>>true

特定の文字列が正規表現にマッチするか?(フラグ一覧)

/*
フラグ一覧
    i 大文字小文字を区別しない
    m マルチラインモード(^と&が文頭、文末に加えて行頭、行末にマッチ)
    s .が\nにマッチ
    U 最小マッチへの変換
*/

re1 := regexp.MustCompile(`(?i)abc`)
match := re1.MatchString("ABC")
//フラグiをつけているので大文字にも該当する

fmt.Println(match)
//>>true

特定の文字列が正規表現にマッチするか?(パターン一覧)

/*
パターン一覧
    ^ 文頭(mフラグが有効な場合は行頭にも)
    $ 文末(mフラグが有効な場合は行末にも)
    \A 文頭
    \z 文末
    \b ASCIIによるワード協会
    \B 非ASCIIによるワード協会
*/
re1 := regexp.MustCompile(`^ABC$`)
match := re1.MatchString("ABC")
fmt.Println(match)
//>>true

match = re1.MatchString("   ABC   ")
fmt.Println(match)
//>>false
//文頭、文末にスペースが存在するためエラー

特定の文字列が正規表現にマッチするか?(繰り返しパターン一覧)

/*
繰り返しのパターン一覧
    x* 0回以上繰り返すx(最大マッチ)
        x+ 1回以上繰り返すx(最小マッチ)
    x? 0回以上1回以下繰り返すx
    x{n,m} n回以上,m回以下繰り返すx (最大マッチ)
        x{n, } n回以上繰り返すx (最大マッチ)
    x{n} n回繰り返すx(最大マッチ)
    x*? 0回以上繰り返すx(最小マッチ)
    x+? 1回以上繰り返すx(最小マッチ)
    x?? 0回以上1回以下繰り返すx(最小マッチ)
        x{n,m}? n回以上,m回以下繰り返すx (最小マッチ)
    x{n, }? n回以上繰り返すx (最小マッチ)
        x{n}? n回繰り返すx(最小マッチ)
*/

re1 := regexp.MustCompile("a+b*")
//aを1回以上、bを0回以上繰り返す正規表現

fmt.Println(re1.MatchString("ab"))
//>>true
fmt.Println(re1.MatchString("a"))
//>>true
fmt.Println(re1.MatchString("ab"))
//>>true
fmt.Println(re1.MatchString("aaaabbbbbb"))
//>>true
fmt.Println(re1.MatchString("b"))
//>>false

re1 := regexp.MustCompile(`[XYZ]`)
//[]内の文字のどれかが該当していたらtrue
fmt.Println(re1.MatchString("Y"))
//>>true

re2 := regexp.MustCompile(`^[0-9A-Za-z]{3}$`)
//[]内の文字が{}内の回数文マッチしていたらtrue
fmt.Println(re2.MatchString("ABC"))
//>>true
fmt.Println(re2.MatchString("abcdefg"))
//>>false
re3 := regexp.MustCompile(`[^0-9A-Za-z_]`)
//[]内の文字がマッチしていなかったらtrue
fmt.Println(re3.MatchString("ABC"))
//>>false
fmt.Println(re3.MatchString("あ"))
//>>true

特定の文字列が正規表現にマッチするか?(グループ一覧)

/*
    (正規表現) グループ (順序によるキャプチャ)
    (?:正規表現) グループ (キャプチャされない)
    (?:P<name>正規表現) 名前付きグループ
*/

re2 := regexp.MustCompile((`(abc|ABC)(xyz|XYZ)`))
//abc or ABCのグループとxyz or XYZのグループの2つで正規表現のチェックを行う
fmt.Println(re2.MatchString("abcxyz"))
//>>true
fmt.Println(re2.MatchString("ABCXYZ"))
//>>true
fmt.Println(re2.MatchString("ABCxyz"))
//>>true
fmt.Println(re2.MatchString("ABCabc"))
//>>false

正規表現にマッチした文字列を取得したい

re := regexp.MustCompile((`(abc|ABC)(xyz|XYZ)`))

fs1 := re.FindString("AAAAABCXYZZZZ")
//正規表現にマッチした文字列の取得
fmt.Println(fs1)
//>>ABCXYZ

fs2 := re.FindAllString("ABCXYZABCXYZ", -1)
//マッチした複数の文字列を出力する。第二引数では取得する回数を指定できる。-1だとマッチした回数だけ取得を行う。
fmt.Println(fs2)
//>>[ABCXYZ ABCXYZ]

正規表現にマッチした文字列を指定した文字列に置換したい

re1 := regexp.MustCompile(`\s+`)
fmt.Println(re1.ReplaceAllString("AAA BBB CCC", ","))
//>>AAA,BBB,CCC

re2 := regexp.MustCompile(`、|。`)
fmt.Println(re2.ReplaceAllString("おはようございます、今日も一日頑張りましょう。", ""))
//>>おはようございます今日も一日頑張りましょう

正規表現にマッチした文字列を軸に分割したい

re1 := regexp.MustCompile((`(abc|ABC)(xyz|XYZ)`))
fmt.Println(re1.Split("ASHLJRTABCXYZGGOUHABCXYZ", -1))
//>>[ASHLJRT GGOUH ]

re2 := regexp.MustCompile(`\s+`)
fmt.Println(re2.Split("aaa   bbb    ccc", -1))
//>>[aaa bbb ccc]

cryptパッケージ

###ハッシュ値の生成したい
    //------------------------------
    /* SHA-1 */
    s1 := sha1.New()
    io.WriteString(s1, "ABCDE")
    fmt.Printf("%x\n", s1.Sum(nil))
    // => "7be07aaf460d593a323d0db33da05b64bfdcb3a5"
    //------------------------------
    /* SHA-256 */
    s256 := sha256.New()
    io.WriteString(s256, "ABCDE")
    fmt.Printf("%x\n", s256.Sum(nil))
    // => "f0393febe8baaa55e32f7be2a7cc180bf34e52137d99e056c817a9c07b8f239a"
    //------------------------------
    /* SHA-512 */
    s512 := sha512.New()
    io.WriteString(s512, "ABCDE")
    fmt.Printf("%x\n", s512.Sum(nil))
    // => "9989a8fcbc29044b5883a0a36c146fe7415b1439e995b4d806e

jsonパッケージ

jsonに関連するパッケージ

変数の内容をjsonに変換したい

bs, er := json.Marshal(変数)

jsonを構造体に変換したい

u1 := new(User)

if err := jsonUnmarshal(bs, &u1); er != nil {
  fmt.Println(err)
}
//userを新規でnewし既存のjsonデータを引数として送ることで元データの内容に変換できる

sortパッケージ

文字や数値の並べ替えに関連するパッケージ

文字、数字の並べ替えをしたい

i := []int{5, 3, 2, 4, 5, 6, 4, 8, 9, 8, 7, 10}
s := []string{"a", "z", "j"}

fmt.Println(i, s)
//>>[5 3 2 4 5 6 4 8 9 8 7 10] [a z j]

sort.Ints(i)
//整数型の並べ替え
sort.Strings(s)
//文字列型の並べ替え

fmt.Println(i, s)
//>>[2 3 4 4 5 5 6 7 8 8 9 10] [a j z]
//Entryという構造体を定義
type Entry struct {
    Name  string
    Value int
}

func main() {
     //Entryに代入
    el := []Entry{
        {"A", 20},
        {"F", 40},
        {"i", 30},
        {"b", 10},
        {"t", 15},
        {"y", 30},
        {"c", 30},
        {"w", 30},
    }
    fmt.Println(el)
     //>>[{A 20} {F 40} {i 30} {b 10} {t 15} {y 30} {c 30} {w 30}]

     //Slice Nameを昇順に整列させる。安定ソートを保証しない。
    sort.Slice(el, func(i, j int) bool { return el[i].Name < el[j].Name })
    fmt.Println(el)
     //>>[{A 20} {F 40} {b 10} {c 30} {i 30} {t 15} {w 30} {y 30}]

     //Slice Nameを昇順に整列させる。安定ソートを保証する。
        sort.SliceStable(el, func(i, j int) bool { return el[i].Name < el[j].Name })
     fmt.Println(el)
     //>>[{A 20} {F 40} {b 10} {c 30} {i 30} {t 15} {w 30} {y 30}]

}

net/urlパッケージ

urlに関連するパッケージ

URLをURL型にparseしたい

u, _ := url.Parse("http://example.com/search?a=1&b=2#top")
fmt.Println(u.Scheme)
//>>http

fmt.Println(u.Host)
//>>example.com

fmt.Println(u.Path)
//>>/search

fmt.Println(u.RawQuery)
//>>a=1&b=2

fmt.Println(u.Fragment)
//>>top

fmt.Println(u.Query())
map[a:[1] b:[2]]

URLを生成したい

url := &url.URL{}
url.Scheme = "https:"
url.Host = "google.com"
q := url.Query()
q.Set("q", "Golang")

url.RawQuery = q.Encode()
fmt.Println(url)
//>>https:://google.com?q=Golang
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1