Category Archives: Go

ポインタ型

ケース1

コード

v1 := 100
v2 := 200
pointer1 := &v1
pointer2 := &v2
fmt.Println(pointer1, pointer1)
fmt.Println(pointer2, pointer2)

結果

それぞれのポインタが表示される

0xc4200701b0
0xc4200701b8

ケース2

コード

var user1 = User{Name: "yohei"}
var user2 = User{Name: "miyamoto"}

// それぞれのポインタが表示される
fmt.Println("user1.Name", &user1.Name)
fmt.Println("user2.Name", &user2.Name)

ケース3

コード

var pointer1 = new(User)
var pointer2 = User{}
fmt.Println("pointer1", pointer1)
fmt.Println("pointer2", pointer2)

結果

// ポインタ型
pointer1 &{}

// 構造体
pointer2 {}

コード

より詳細にデータ型を確認

var pointer1 = new(User)
var pointer2 = User{}
fmt.Println("pointer1", reflect.TypeOf(pointer1))
fmt.Println("pointer2", reflect.TypeOf(pointer2))

結果

pointer1 *main.User
pointer2 main.User

go 構造体 メソッド追加

models/user.go

package models

import "fmt"

// User ...
// 外部パッケージから呼び出す場合は、頭を大文字のUserとする必要がある
type User struct {
    Name string // 外部のパッケージから呼び出す場合は、頭を大文字にする必要がある
}

// SayHello ...
// 構造体Userにメソッド追加
func (user User) SayHello() {
    fmt.Printf("hello!")
}

main.go

package main

import (
    "fmt"
    "test/models"
)

func main() {
    var user models.User // modelsから呼び出す
    user.Name = "yohei!\n"
    fmt.Printf(user.Name)
    user.SayHello() // モデルのメソッドを実行できる
}

go package 定義

modelsパッケージ

models/user.go

package models

import "fmt"

// sayHello ...
func SayHello() {
    fmt.Printf("user!")
}

main.go

package main

import (
    "fmt"
    models "test/models" // modelsという名前でパッケージ読み込み
)

func init() {
    fmt.Printf("init!\n")
}

func main() {
    models.SayHello() // modelsで呼び出し
}

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

go メソッド

ファイル

main.go

package main

import "fmt"

func init() {
    fmt.Printf("init!\n")
}

func main() {
    fmt.Printf(test("hello"))
}

// 引数と戻り値を定義できる
func test(input string) (output string) {
    output = input + "!" + "\n"
    return
}

実行

  • init funt
  • main func
    が実行される
go run main.go

go debug(gdb)

サンプルコード

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 10; i++ {
        value := i
        fmt.Println(value)
    }
}

使い方

// buildする
gdb test.go

// 実行
gdb test

// 実行される
run

// ブレイクポイント指定
b 9 // 9行目をブレイクポイントに指定

// 実行
run

// 変数の値を確認
p value

// アドレスの確認
p value

// 次に進む
c


参考

https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/11.2.html
証明書の設定
gdbコマンド

go model app engine

パッケージインストール

go get google.golang.org/appengine

コード

hello/hello.go

package hello

import (
    "fmt"
    "net/http"
)

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

    m := http.DefaultServeMux
    SetUpItem(m)
}

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

hello/item.go

package hello

import (
    "encoding/json"
    "net/http"
    "time"

    "google.golang.org/appengine"
    "google.golang.org/appengine/datastore"

    "github.com/pborman/uuid"
)

// Item
type Item struct {
    KeyStr    string    `json:"key" datastore:"-"`
    Title     string    `json:"title" datastore:",noindex"` // indexをつけない
    CreatedAt time.Time `json:"createdAt"`
    UpdatedAt time.Time `json:"updatedAt"`
}

type ItemApi struct {
}

func SetUpItem(m *http.ServeMux) {
    api := ItemApi{}

    m.HandleFunc("/api/1/item", api.handler)
}

func (a *ItemApi) handler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        a.doPost(w, r)
    } else {
        http.Error(w, "", http.StatusMethodNotAllowed)
    }
}

func (a *ItemApi) doPost(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)

    var param Item
    err := json.NewDecoder(r.Body).Decode(&param)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    defer r.Body.Close()

    item := Item{
        Title:     param.Title,
        CreatedAt: time.Now(),
        UpdatedAt: time.Now(),
    }

    key, err := datastore.Put(c, datastore.NewKey(c, "Item", uuid.New(), 0, nil), &item)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    item.KeyStr = key.Encode()

    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(item)
}

app.yml

application: {プロジェクト名}
version: 1
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

デプロイ

https://1-dot-nifty-harmony-158407.appspot.com/

post

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"title":"hello"}' https://{ドメイン}/api/1/item

参考

https://github.com/sinmetal/gaego_handson/tree/handson/part2

go app engine チュートリアル

コンソール

プロジェクト作成

sdkインストール

cloud SDK

Google Cloud 初期設定

go app engine SDK

// インストール
brew install go-app-engine-64

// バージョン確認
goapp version

// パス設定(不要かも)
export PATH=/path/to/go_appengine:$PATH

ソースコードクローン

cd $GOPATH/src
git clone https://github.com/GoogleCloudPlatform/appengine-try-go.git
git checkout gcloud

ローカルでテスト

// サーバー起動
goapp serve

// 確認
http://localhost:8080

デプロイ

// デプロイ
goapp deploy