Category Archives: Go

float64 to string

func main() {
    f := 1000000.2
    log.Print(strconv.FormatFloat(f, 'e', -1, 64)) // 1000000.2
    log.Print(strconv.FormatFloat(e, 'e', -1, 64)) // 1.0000002e+06 省略された形
}

小数点 json unmarshal

func main() {
    data := []byte(`{"value":1.000002}`)
    f := struct {
        Value float32 `json:"value"`
    }{}
    json.Unmarshal(data, &f)
    log.Print(f)
}

func test(input string) (output string) {
    output = input + "!" + "\n"
    return
}

gin func 共通化

package app

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func init() {
    r := gin.Default()
    baseFunc := BaseFunc(baseFunc)
    r.GET("/new", baseFunc.new)
    http.Handle("/", r)
}

// BaseFunc ...
type BaseFunc func(*gin.Context) string

// 共通メソッド
func baseFunc(*gin.Context) string {
    return "hello"
}

func (f BaseFunc) new(c *gin.Context) {
    s := f(c)
    c.String(200, s)
}

gae go パッケージ構成 dotenvについて

フォルダ構成

(project root)
├── app
│   ├── app.yaml
│   ├── key.env
│   └── main.go (userパッケージ呼び出し)
├── models [サービス共通で使うパッケージ]
│   ├── model.go(dotenv初期化)
│   └── user.go
└── vendor

app/main.go

func init() {
    os.Setenv("GO_ENV", "dev")
    err := godotenv.Load("key.env")
    if err != nil {
        log.Fatal("Error loading .env file")
    }
}

models/model.go

func init() {
        // modelsパッケージ単体テストの時のみ、app/key.envを参照する
    if os.Getenv("GO_ENV") != "dev" {
        err := godotenv.Load("../app/key.env")
        if err != nil {
            log.Fatal("Error loading .env file")
        }
    }
}

gae go helloworld

ソース

package app

import (
    "fmt"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, world!")
}

app.yaml

application: {アプリケーション名}
version: 1
runtime: go
api_version: go1.8

handlers:
- url: /.*
  script: _go_app

golang メソッドチェーン

package main

import (
    "fmt"
    "log"
    "strings"
)

// Repo ...
type Repo struct {
    RawQuery []string
}

// User ...
func (r *Repo) User(id string) *Repo {
    r.RawQuery = append(r.RawQuery, fmt.Sprintf(`user=%s`, id))
    return r
}

// Group ...
func (r *Repo) Group(id string) *Repo {
    r.RawQuery = append(r.RawQuery, fmt.Sprintf(`group=%s`, id))
    return r
}

// Query ...
func (r *Repo) Query() string {
    return strings.Join(r.RawQuery, " and ")
}

func main() {
    r := new(Repo)
    log.Print(r.User("1").Group("2").Query()) // user=1 and group=2 が返る
}

func 共通化

func newHandlerFunc(handleFunc func(w http.ResponseWriter, r *http.Request)) http.Handler {
    handler := http.HandlerFunc(handleFunc)
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "common!")
        handler.ServeHTTP(w, r)
    })
}

func testFunc(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "test!") }

func main() {
    http.Handle("/", newHandlerFunc(testFunc))
    http.ListenAndServe(":8080", nil)
}

gin

func init() {
    err := godotenv.Load(fmt.Sprintf("kintone.env.%s", "dev"))
    if err != nil {
        log.Fatal("Error loading .env file")
    }
    r := gin.Default()
    h := newHandleFunc(testFunc)
    r.GET("/", h)
    http.Handle("/", r)
}

func newHandleFunc(handleFunc func(*gin.Context, *kintone.Client)) func(*gin.Context) {
    return func(c *gin.Context) {
        c.String(200, "base!")
        ctx := appengine.NewContext(c.Request)
        client, _ := newClient(ctx, os.Getenv("KINTONE_APPID"))
        handleFunc(c, client)
    }
}

func testFunc(c *gin.Context, client *kintone.Client) {
    c.String(200, "test!!")
    r, _ := client.GetRecord("39")
    c.String(200, r.ID)
}

gin wrap

func init() {
    r := gin.Default()
    r.GET("/", gin.WrapF(newHandlerFunc(testFunc)))
    http.Handle("/", r)
}

func newHandlerFunc(handleFunc func(w http.ResponseWriter, r *http.Request)) http.HandlerFunc {
    handler := http.HandlerFunc(handleFunc)
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "common!")
        handler.ServeHTTP(w, r)
    })
}

func testFunc(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "test!") }

funcを返すfunc

package main

import "log"

func newFunc(str string) func() string {
    return func() string {
        return str
    }
}

func main() {
    f := newFunc("hello")
    log.Print(f()) // "hello"が返る
}