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["koibuchi"] = 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 {


}


### if文内のみのscope
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("facility_id"))


関連ページ

Back