#Golang 初心者の学んだことまとめ
あたらしく学んだことをメモ程度に書いていこーと思います。(随時更新)
教材はudemyの
####package達
- time
- regex
- sort
- ioutil
###time
利用するpackageはtime
func main() {
t:=time.Now() //現在時刻get
fmt.Println(t)
fmt.Println(t.Format(time.RFC3339),t.Year(),t.Minute())
//RFC3339というフォーマットが一般的らしい...
//〇〇分後の時刻を表示
f2:=t.time.Add(1*time.Hour) //現在時刻(t)の1時間後の時間を表示
//〇〇分前の時刻を表示
f3:=t.time.Add(-5*time.Minute) //現在時刻の5分前を表示
}
###regex
利用するpackageはregexp
日本語で言う正規表現のこと
文字列のマッチングに使う。
スクレイピングとかに使うのかな...
func main(){
match,_:=regexp.MatchString("a([a-z])+e","apple") //aから始まってeで終わるならtrueを返す
fmt.Println(match) //output → true
r2:=regexp.MustCompile("^/(edit|save|test)/([a-zA-Z0-9]+)$")
// ^/とすることでその前の部分を抜き出さない
//editかsaveかtestが入るものをマッチさせる(urlとか)
// ([a-zA-Z0-9]+)$とすることでeditとかtestの後に英数字が入ってもokになる
rs:=r2.FindString("/test/aA0") //引っかかった場合のみprintできる
fmt.Println(rs) ///test/aA0がprintされる
//文字列の置き換え
tu:="Taaaaryu is me"
rep:=regexp.MustCompile("[A-Za-z]*ryu") //~~ryuとなっている物を抽出
ta:=rep.ReplaceAllString(tu,"me")
fmt.Println(ta) // me is me
}
###sort
利用するpackageはsort
func main(){
a := []int{1, 2, 3, 2, 5, 1}
s := []string{"nan", "Yuu", "hrh","Asa"}
k := []struct {
Name string
Age int
}{
{"Bob", 25},
{"Nancy", 34},
{"Ryuu", 15},
{"auei", 30},
{"Auei",2},
}
fmt.Println(a, s, k)
sort.Ints(a) //数字のソート
sort.Strings(s) //文字列のソート 大文字→小文字でソートされる
sort.Slice(k,func(i,j int)bool{return k[i].Name<k[j].Name})//structの名前でソートする NameをAgeに変えれば数字を元にソート
fmt.Println(a,s,k)
}
###context
サーバー系で使う??
goroutineとかで関数を実行しているときにある特定の条件(timeoutとか)でcancelしたいときに使う
func longProcess(ctx context.Context,ch chan string){
fmt.Println("run")
time.Sleep(2*time.Second)
fmt.Println("finish")
ch<-"result" //chanに文字列を入力
}
func main() {
mm:=make(chan string)
ctx:=context.Background() //contextの生成
//ctx:=context.TODO()でもいい(普通はbackgroundを使う,使い道が決まってなかったらこっち)
ctx,cancel:=context.WithTimeout(ctx,3*time.Second) //3秒を超えたらcancelを実行
defer cancel()
go longProcess(ctx,mm) //longProcessにctxの条件を加えて実行
for{
select {
case <-ctx.Done(): //cancelが実行されたら..
fmt.Println(ctx.Err())
return
case<-time.After(3*time.Second): //WithTimeoutと同じ
fmt.Println("timeout")
return
case <-mm: //chanが受信したら..
fmt.Println("success")
return
}
}
chanの詳細なことはこちらを参照
https://qiita.com/taigamikami/items/fc798cdd6a4eaf9a7d5e
contextについてはこの記事により素晴らしいことが書いてあるので是非!!
https://qiita.com/yoshinori_hisakawa/items/a6608b29059a945fbbbd
###ioutil
この記事も参考にさせていただきました...
https://qiita.com/_kyamasan/items/fc485536ae2cbfaabeb4
でもGo1.16の変更の一つとしてio/ioutilの非推奨化がされて代わりにioやosパッケージが推奨されるらしい
func main() {
a,err:=ioutil.ReadFile("main.go")
if err != nil{ //errに入力がされていたらprintする
log.Fatalln(err)
}
fmt.Println(string(a)) //aの中にはbyte配列が入ってるのでstringで直してあげる
r:=bytes.NewBuffer([]byte("abc")) //
b,_:=ioutil.ReadAll(r) //一括読み込み
fmt.Println(string(b)) //byte→stringに変換
}
こんな感じでつらつらと書き連ねてみましたが、間違っていることなどがあったら是非是非、教えてください!