LoginSignup
1
0

More than 3 years have passed since last update.

go langで超簡単な本の感想投稿機能を作成した

Last updated at Posted at 2019-11-17
番号を選んでください!
[1]レビューを書く
[2]レビューをみる
[3]アプリ終了

ターミナルでこんな表示が出てきて
1を押すと、本のtitle,genre,revieを書く。
2を押すと、保存した本のtitleなどがみれる仕様。

完成コード

package main
import (
    "fmt"
    "bufio"
    "os"
    "strconv"
    "log"
)

func input()(result string) {
    //scannerを使う
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Scan()
    result = scanner.Text()
    return result
}

type R1 struct {
    title string
    genre string
    review string
}



func write_review() map[string]string{

    fmt.Println("本のタイトルを入力")
    title := input()
    fmt.Println("本のジャンルを入力")
    genre := input()
    fmt.Println("本の感想を入力")
    review := input()

    r1 := map[string]string{
            "title":title,
            "genre":genre,
            "review":review,
        }


    return r1

}


func read_review(s []map[string]string) {
    for num := range s {
        fmt.Println(num,"titleは",s[num]["title"])
    }
    fmt.Println("みたい番号を取得")
    number := scan()

    if len(s) <= number { //打ち込んだnumがlength以上であれば
        log.Fatal("存在しない番号やんか、あかんで")
    }
    display:= s[number]

    fmt.Println("タイトルは ",display["title"],"\nジャンルは",display["genre"],"\n感想は",display["review"])
}


func scan()(conv_num int) { //打ち込んだ文字を取得しintに変換
    scanner := bufio.NewScanner(os.Stdin)
        scanner.Scan() //入力待ち
        num := scanner.Text()

        conv_num,_  = strconv.Atoi(num)
        return conv_num
}


func main() {
    var slice []map[string]string
    forbun_label: //labelをfor文に対して宣言
    //forの中にswitchを入れ子にしているのでlabelを宣言すべき

    for {

        fmt.Println("番号を選んでください!")
        fmt.Println("[1]レビューを書く\n[2]レビューをみる\n[3]アプリ終了")

        conv_num := scan()
        switch conv_num {
        case 1:
            fmt.Println("1を選んだね")
            slice = append(slice, write_review())
        case 2:
            fmt.Println("2を選んだね")
            read_review(slice)
        case 3:
            fmt.Println("3を選んだね")
            break forbun_label  //labelのbreak
        default:
            fmt.Println("もう一度選んでや")
      }
  }
}

これを作るに当たって使用した、概念は
slice,map,struct,for,label辺りでしょうか。

初心者の自分には難しかったですが、色々な概念を使用して作るので良いoutputになるのでは無いかと思います。

少し応用で、funcのreturnの指定や、mapをどう返すかなど考えるのが難しかったことを覚えています。

もっと良いコードがあるとは思いますが、goは記述量が多くなってしまいがちですね。

1
0
1

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