go Go 基礎

本稿について

本稿はサイト運営者が学んだことなどを記したメモの内容です。
全てが正確な情報とは限りません。ご注意ください。また修正するべき点は適時修正していきます
build
go build

コンパイル + 実行
go run hoge.go

コメント
//
/* */

変数
var 変数名 型
var msg string

変数宣言は省略可能
var msg = "hello"
msg := "hellow"

a,b := 10, 15
var (
  c int
  d string
)

c = 20
d = "hoge"

一文字目が小文字でパッケージ内
大文字の場合は横断できる

string
int
float64
bool
nil

ログ表示
fmt.Printf("a: %d, b:%f, c:%s, d:%t \n", a,b,c,d)

定数化
const hoge

ポインタ
var point *int // <= 領域確保
point = &a // <= 領域を保存
fmt.Println(point) // これだとアドレスが表示される

参照先の値を表示
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 }
}

※ 無限ループ
for {
}


i := 0
for i < 10 {


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"))


関連ページ

環境構築メモ

#go
Back