Author Archives: yoheimiyamoto

gae go 静的ファイル

ファイル構成

// 動的テンプレート
gae/views/test.tmpl

// 静的ファイル
gae/static/img/gopher.png
gae/static/js/test.js

gae/app.yaml

動的テンプレートはapp.yamlでの定義不要

- url: /js
  static_dir: static/js
- url: /img
  static_dir: static/img
- url: /.*
  script: _go_app
  secure: always

ケース2

interface 変換

一般的な事例

var i interface{} = "hello"
s := i.(string)
fmt.Println(s)

s, ok := i.(string)
fmt.Println(s, ok)

Kintone事例

record, _ := app.GetRecord(1)
for _, f := range record.Fields {
    // fは、interface型。fには実行できるメソッドが実装されていない
    s, ok := f.(kintone.SingleSelectField) // SingleSelectField型であれば変換
    if ok {
        fmt.Print(s.String) // sには、Stringなどのメソッドが実装されている
    }
}

参考

https://tour.golang.org/methods/15

:= によるスコープ

a := 1
a := 2 // エラー
a,b := 2,3 // エラーでない。aは再定義されておらず、代入の扱いとなる。

エラーの場合

func getValue() (value int, err error) {
    value = 1
    err = fmt.Errorf("error")
    return value, err
}

func main() {
    value1, err := getValue()
    if err != nil {
        fmt.Println("error")
    }
    value2, err := getValue() // errは再定義されているわけではなく、代入されている
    if err != nil {
        fmt.Println("error")
    }

    fmt.Println(value1)
    fmt.Println(value2)
}

以下だとエラーがでる

func getValue() (value int, err error) {
    value = 1
    err = fmt.Errorf("error")
    return value, err
}

func main() {
    value1, err := getValue()

    value2, err := getValue() // 上記で定義したerrが利用されていないためエラーがでる
    if err != nil {
        fmt.Println("error")
    }

    fmt.Println(value1)
    fmt.Println(value2)
}

配列 for range

array := []int{1, 2, 3}
for i, v := range array {
    fmt.Println(i) // index
    fmt.Println(v) // value
}

結果

// index
012

// value
123

goroutin

パターン1

// Send ...
func Send(ch chan<- int, value int) {
    fmt.Println("送信")
    ch <- value
}

func main() {
    ch := make(chan int)
    go Send(ch, 1)
    n := <-ch
    fmt.Printf("受信: %v", n)
}

template 変数取得

{{define "content"}}
<form action="/forms/{{.AppID}}/{{.RecordID}}/update" method="post">
  {{range .Fields}}
    <h3>{{.Label}}</h3>
    <input type="text" name="{{.Code}}" value="{{index $.Record.Fields .Code}}"> // Record.Fields[.Code]の意味
  {{end}}
  <br>
  <input type="submit" name="送信">
</form>
{{end}}

参考

http://golang-jp.org/pkg/text/template/

最初の引数を続く引数でインデックスした結果を返します。
例えば”index x 1 2 3″はGoの文法では x[1][2][3]となります。
インデックスされる値はマップ、スライス、配列である必要があります。