build
コンパイル + 実行
コメント
変数
変数宣言は省略可能
var msg = "hello"
msg := "hellow"
a,b := 10, 15
var (
c int
d string
)
c = 20
d = "hoge"
一文字目が小文字でパッケージ内
大文字の場合は横断できる
型
ログ表示
fmt.Printf("a: %d, b:%f, c:%s, d:%t \n", a,b,c,d)
定数化
ポインタ
var point *int // <= 領域確保
point = &a // <= 領域を保存
fmt.Println(point) // これだとアドレスが表示される
参照先の値を表示
関数
func hoge(message string) string { // 後半のstringは返り値の型
fmt.Println(message)
msg := "return"
return msg
}
戻り値が2つの場合
func hoge(message string) (int, int) { // 後半のstringは返り値の型
}
関数が変数に入れられる
f := func(a,b int) {
fmt.Println(a,b)
}
f(2,3)
即時関数
func(msg string) {
fmt.Println(msg)
}("hoge")
配列
var a [5]int // a[0] - a[4]
b := [3]int{1,4,5}
len(b) // サイズの取得
スライス(便利な配列)
a := [3]int{1,4,5}
s := a[2:4] // 2番目と4番目を取得
s := a[:4] 4番目までの要素を指定
s := a[2:] 2番目からの要素を取得する
cap(s) // きりだせる最大個数
s := make([]int, 3) // [0 0 0]
s := []int{1,3,5} // [1 3 5]
s = append(s, 8,2,10) // 追加
t := make([]int, len(s))
n := copy(t, s)
map(hashのようなもの)
m := make(map[string]int)
m["dosukoi"] = 100
m["fuga"] = 200
m := map[string]int{"hoge":100, "fuga":200)
fmt.Println(len(m))
delete(m, "hoge")
v, ok := m["hoge"] // 第2返り値はデータが存在するかどうかの真偽値
条件分岐
if socre > 80 {
fmt.Println("hoge")
} else if score > 60 {
} else {
}
scopeがif文内のみ
if score := 45;socre > 80 {
fmt.Println("hoge")
} else if score > 60 {
} else {
}
switch文
signal := "red"
switch signal {
case "red":
fmt.Println("hoge")
case "yellow":
default:
}
switch {
case score > 80:
case score > 25:
default
}
for(whileはない)
for i := 0; i < 10: i++ {
if i == 3 { break }
if i == 2 { continue }
}
※ 無限ループ
range (eachみたいなもの)
s := []int{2,3,4}
// iはindex, vはvalue
for i, v := range s {
fmt.Println(v)
}
// indexがいらない場合
for _, v := range s {
}
m := map[string]int{"hoge":10, "fuga":20}
// key value
for k, v := range m {
}
構造体(オブジェクト)
type user struct {
// フィールド
name string
score int
}
u := new(user) // アドレスが帰ってくる
u.name = "koibuchi"
u.score = 20
u := user{"koibuchi", 20}
u := user{name: "hoge", socre: 50}
メソッド
type user struct {
// フィールド
name string
score int
}
func (u user) show() {
u := user{name:"koibuchi", score: 20}
u.show()
}
// 参照わたし
func (u *user) show() {
u := user{name:"koibuchi", score: 20}
u.show()
}
インターフェース
type greeter interface {
greet()
}
type japanese struct {}
type american struct {}
func (j javanese) greet() {
fmt.Println("こんにちは")
}
func (a american) greet() {
fmt.Println("Hello")
}
// ここでそれぞれ別の構造体を読んでいるが、同じメソッドを使える
greeters := []greeter(japanese{}, american{}}
for _, greeter := range greeters {
greeter.greet()
}
空のインターフェース
func show(t interface{}) {
// 型アサーション
_, ok := t.(japanese)
if ok {
}
// 型switch
switch t.type) {
case japanese:
case american:
}
show(greeter)
goroutine(並行処理)
import (
"fmt"
"time"
)
func task1() {
time.Sleep(time.Second * 2)
}
func task2() {
}
// 並列処理させたい場合
go task1()
go task2()
チャネル
goroutineは受け渡しが基本的できない。そのためにchannelにデータを入れて受け渡す
func task1(result chan string) {
time.Sleep(time.Second * 2)
result<- "task1 result"
}
func task2() {
}
result := make(chan string)
go task1(result)
go task2()
// resultに何も入っていない場合は、何か入るまで待つ
fmt.Println(<-result)
package
"net/http" // webサーバー
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi %s!", r.URL.Path[1:])
}
log出力(google app engine)
import "google.golang.org/appengine/log"
log.Infof(c, "Contract Get %v", p.ByName("id"))