Go 勉強記録 まとめ

Go言語プログラミングエッセンス (エンジニア選書)

GitHub - shouta0715/golang-essence

基礎編

2023-09-30

2023-10-01

map型は参照渡し。for文で回したときは順分保証なし


2023-10-12

フォーマット指定子 説明
%v 変数の自然な形式 fmt.Printf("%v", 42) → 42
%+v フィールド名付きでのstruct表示
%#v Goの構文での変数の形式 fmt.Printf("%#v", "test") → "test"
%T 型の名前 fmt.Printf("%T", 42) → int
%d 整数 fmt.Printf("%d", 42) → 42
%b 2進数 fmt.Printf("%b", 5) → 101
%o 8進数 fmt.Printf("%o", 8) → 10
%x 16進数(小文字) fmt.Printf("%x", 255) → ff
%X 16進数(大文字) fmt.Printf("%X", 255) → FF
%f 浮動小数点数(小数点以下6桁) fmt.Printf("%f", 3.14) → 3.140000
%F %fと同様 fmt.Printf("%F", 3.14) → 3.140000
%e 指数表記(小文字) fmt.Printf("%e", 10000.0) → 1.000000e+04
%E 指数表記(大文字) fmt.Printf("%E", 10000.0) → 1.000000E+04
%g 最短の%eか%f fmt.Printf("%g", 3.14) → 3.14
%G %gと同様だが大文字を使用 fmt.Printf("%G", 3.14) → 3.14
%s 文字列 fmt.Printf("%s", "test") → test
%q ダブルクォートで囲まれた文字列 fmt.Printf("%q", "test") → "test"
%p ポインタの16進数表現 fmt.Printf("%p", &x)
%c 文字(rune) fmt.Printf("%c", 'A') → A
%t ブール値(true or false) fmt.Printf("%t", true) → true

2023-10-13

  1. structにフィールドを追加
  2. WithXXXを追加。WithXXXはstructのponterを受け取り、値をセットする関数を返す。 code:server.go
type Option func(*Server)

func New(host string, port int, options ...Option) *Server {
    svr := &Server{
        host: host,
        port: port,
    }
    for _, option := range options {
        option(svr)
    }
    return svr
}

func WithTimeout(timeout time.Duration) func(*Server) {
    return func(s *Server) {
        s.timeout = timeout
    }
}

func WithLogger(logger *log.Logger) func(*Server) {
    return func(s *Server) {
        s.logger = logger
    }
}

func main() {
    f, err := os.Create("server.log")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    logger := log.New(f, "", log.LstdFlags)
    svr := server.New("localhost", 8080, server.WithLogger(logger), server.WithTimeout(30))
    if err := svr.Start(); err != nil {
        log.Fatal(err)
    }
}