はじめに
学習の一環として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