LoginSignup
0
0

More than 1 year has passed since last update.

Go 学んだことその1

Last updated at Posted at 2021-08-13

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に変換
}

こんな感じでつらつらと書き連ねてみましたが、間違っていることなどがあったら是非是非、教えてください!

0
0
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
0
0