Goの特徴

Go言語の基本

他の言語との差分で自分が気になった箇所のみ記述する。
言語仕様は、以下のURLに詳細にまとめられているのでそちらを参照のこと。

URL https://golang.org/ref/spec

エントリーポイント

mainパッケージのmain関数がエントリーポイント

package main

import "fmt"

func main() {
	fmt.Printf("Hello, World\n")
}

構文・関数

go文

並行処理のための構文。
スレッドよりも小さな単位であるgoroutineが並行して動作する。

package main

import (
	"fmt"
	"time"
)

func main() {
	termCh := make(chan struct{})
	finCh := make(chan struct{})

	go func(termCh, finCh chan struct{}) {
		defer func() {
			fmt.Println("go: close(finCh)")
			close(finCh)
		}()

		i := 0
		for {
			fmt.Printf("go: running go routine = %d\n", i)
			i = i + 1
			time.Sleep(1 * time.Second)

			select {
			case <-termCh:
				fmt.Println("go: received stop signal from main")
				return
			default:
			}
		}
	}(termCh, finCh)

	times := 0
	for {
		time.Sleep(800 * time.Millisecond)
		if times > 3 {
			fmt.Println("main: send stop signal")
			close(termCh)
			break
		}
		times = times + 1
	}

	<-finCh
	fmt.Println("main: done")

}

defer文

関数の終了時にdeferで指定された式を実行することができる。
リソースの解放処理などに使用できる。

package main

import "fmt"

func finalize() {
	fmt.Println("finalize")
}

func runDefer() {
	defer finalize()
	defer func() { fmt.Println("runDefer defer") }()

	fmt.Println("end runDefer()")
}

func main() {
	defer func() { fmt.Println("main defer") }()
	runDefer()
	fmt.Println("end main()")
}

// end runDefer()
// runDefer defer
// finalize
// end main()
// main defer

参考 https://golang.org/ref/spec#Defer_statements

iotaキーワード

package main

import "fmt"

const Out_block1 = iota // 0 (ConstSpec)
const Out_block2 = iota // 0 (ConstSpec)

const (
	Blk1_a = iota  // 0  (iota=0) (ConstSpec)
	Blk1_b = 0     //    (iota=1) (ConstSpec)
	Blk1_c = iota  // 2  (iota=2) (ConstSpec)
)

const (
	Blk2_a = iota  // 0
	Blk2_b = 0     // 0
	Blk2_c = iota  // 2
)

const (
	Blk3_a1, Blk3_a2 = iota, iota  // 0, 0 (ConstSpec)
	Blk3_b1, Blk3_b2 = iota, iota  // 1, 1 (ConstSpec)
)

func main() {
	fmt.Printf("Out_block1 = %d\n", Out_block1)
	fmt.Printf("Out_block2 = %d\n", Out_block2)

	fmt.Printf("Blk1_a = %d, Blk1_b = %d, Blk1_c = %d\n", Blk1_a, Blk1_b, Blk1_c)
	fmt.Printf("Blk2_a = %d, Blk2_b = %d, Blk2_c = %d\n", Blk2_a, Blk2_b, Blk2_c)
	fmt.Printf("Blk3_a1 = %d, Blk_a2 = %d\n", Blk3_a1, Blk3_a2)
}

参考 https://golang.org/ref/spec#ConstSpec

init関数

init関数は、main関数の実行に先立って実行される。パッケージの初期化を目的にした特殊な関数である。通常ならば関数の重複はエラーとなるが、init関数は複数定義することができるようだ。

package main

import "fmt"

func init() {
	fmt.Println("init")
}

func init() {
	fmt.Println("init2")
}

func main() {
	fmt.Printf("Hello world\n")
}

// init
// init2
// Hello world

参考リンク

実装例など

goroutineのパターンが分かりやすくまとめられている。

数多くの実装例が掲載されている。

初学者に分かりやすく役立つ情報


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP