Thoughts, stories and ideas.

get parameterでarrayを受け取る

func newHandler(w http.ResponseWriter, r *http.Request) {

  fmt.Println("GET params:", r.URL.Query());      
  // if only one
  moviename := r.URL.Query().Get("moviename")
  if moviename != nil {
    ... process it
  }
  // if multiples possible
  movienames := r.URL.Query()["moviename"];
  if movienames != nil {
    ... process them ...
  }    
}

fibonacci

package main

import "fmt"

func main() {  
    fmt.Println("Hello, playground")
    f0 := 0
    f1 := 1
    f2 := 0
    for f1 < 100 {
      fmt.Println(f1)
      f2 = f1 + f0
      f0 = f1
      f1 = f2
    }
}

struct field, tag

package main

import (  
    "fmt"
    "reflect"
)

func main() {  
    type S struct {
        F string `species:"gopher" color:"blue"`
        E string `species:"golang" color:"black"`
    }

    s := S{}
    st := reflect.TypeOf(s)
    for i := 0; i < st.NumField(); i++ {
        field := st.Field(i)
        fmt.Println(field.Tag.Get("species"))
    }
}

struct db, json

structでdbとjson定義

package models

import "time"

type Todo struct {  
    Id          int       `db:"id" json:"id"`
    Description string    `db:"description" json:"description"`
    CreatedAt   time.Time `db:"created_at" json:"created_at"`
}

fmt.Sprintf

汎用:

%v    デフォルトフォーマットを適用した値
    構造体を出力する際、+フラグ(%+v)を加えるとフィールド名が表示される
%#v    この値をGo言語の構文で表現する
%T    この値の型をGo言語の構文で表現する

論理値:

%t    単語、trueまたはfalse

整数:

%b    基数2
%c    対応するUnicodeコードポイントによって表される文字
%d    基数10
%o    基数8
%x    基数16、10以上の数には小文字(a-f)を使用
%X    基数16、10以上の数には大文字(A-F)を使用
%U    ユニコードフォーマット: U+1234; "U+%x"と同じ。デフォルトは、4桁

浮動小数と複素数

%e    科学的記数法、例: -1234.456e+78
%E    科学的記数法、例: -1234.456E+78
%f    指数なしの小数、例: 123.456
%g    %e、%fのどちらか出力の短い方
%G    %E、%fのどちらか出力の短い方

文字列とバイト型のスライス

%s    文字列またはスライスそのまま
%q    Go言語の構文に従いダブルクォート形式でエスケープ
%x    各バイトを2文字の16進数文字列として

ポインタ

%p    16進数文字列、先頭に0x

time format

formatedTime := time.Now().Format("20060102150405.999999")

formatedTime := time.Now().Format("2006年01月02日 15時04分05秒.999999")  

http request goroutine

http://m0t0k1ch1st0ry.com/blog/2014/06/09/golang/

for ループを起動して、リクエストを待ち受けている。リクエストが来ると net.Listener.Accept がそれを受けてコネクションを設立し、リクエストに対して goroutine を1つ立ち上げるようになっている。

func (srv *Server) Serve(l net.Listener) error {  
    defer l.Close()
    var tempDelay time.Duration
    for {
        rw, e := l.Accept()
        if e != nil {
            if ne, ok := e.(net.Error); ok && ne.Temporary() {
                if tempDelay == 0 {
                    tempDelay = 5 * time.Millisecond
                } else {
                    tempDelay *= 2
                }
                if max := 1 * time.Second; tempDelay > max {
                    tempDelay = max
                }
                log.Printf("http: Accept error: %v; retrying in %v", e, tempDelay)
                time.Sleep(tempDelay)
                continue
            }
            return e
        }
        tempDelay = 0
        c, err := srv.newConn(rw)
        if err != nil {
            continue
        }
        go c.serve()
    }
}

Numerical type

uint8       符号なし  8-ビット 整数 (0 to 255)  
uint16      符号なし 16-ビット 整数 (0 to 65535)  
uint32      符号なし 32-ビット 整数 (0 to 4294967295)  
uint64      符号なし 64-ビット 整数 (0 to 18446744073709551615)

int8        符号あり  8-ビット 整数 (-128 to 127)  
int16       符号あり 16-ビット 整数 (-32768 to 32767)  
int32       符号あり 32-ビット 整数 (-2147483648 to 2147483647)  
int64       符号あり 64-ビット 整数 (-9223372036854775808 to 9223372036854775807)

float32     IEEE-754 32-ビット 浮動小数値  
float64     IEEE-754 64-ビット 浮動小数値

complex64   float32の実数部と虚数部を持つ複素数  
complex128  float64の実数部と虚数部を持つ複素数

byte        uint8の別名(エイリアス)  
rune        int32の別名(エイリアス)  

Golang Pointer

package main

import (  
    "fmt"
)

func main() {

    var ptr *int

    i := 12345

    ptr = &i

    fmt.Println("iのアドレス:", &i)           // 0x1043617c
    fmt.Println("ptrの値(変数iのアドレス):", ptr) // 0x1043617c

    fmt.Println("iの値:", i)           // 12345
    fmt.Println("ポインタ経由のiの値:", *ptr) // 12345

    *ptr = 999

    fmt.Println("ポインタ経由で変更したiの値:", i) // 999
    fmt.Println(*ptr)                 // 999
    fmt.Println(&ptr)                 // 0x1040a120
    fmt.Println(ptr)                  // 0x1043617c
}