Goのセットアップとチュートリアル【3】

こんにちは、ナナオです。 前回の続きでチュートリアルをやっていこうと思います。 Goroutines goroutine(ゴルーチン)はGoのランタイムで管理される軽量なスレッドです。 複雑な記法は必要ありません。goキーワードを関数実行時の先頭に入れるだけです。 package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") } Channels チャネル型(Channel)は、チャネルオペレータ(<-)を使って値の送受信を行うことができます。 これを使うことでゴルーチンの値を簡単に取得することができます。 package main import "fmt" func sum(s []int, c chan int) { sum := 0 for _, v := range s { sum += v } c <- sum // send sum to c } func main() { s := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x+y) } selectステートメント selectステートメント、これ最初に見たときは一見意味が分かりませんでした。 ...

2026年2月15日 · にあえん

Goのセットアップとチュートリアル【2】

こんにちは、ナナオです。 前回の続きでチュートリアルをやっていこうと思います。 map package main import "fmt" func main() { // このmapはnilのため、make関数で初期化する必要がある var m map[string]int // make関数でmapを作成する m = make(map[string]int) // このマップは初期化済み m = map[string]int{ "A": 1, "B": 2, } // キーの追加 m["Answer"] = 42 fmt.Println("The value:", m["Answer"]) // キーの変更 m["Answer"] = 48 fmt.Println("The value:", m["Answer"]) // キーの削除 delete(m, "Answer") fmt.Println("The value:", m["Answer"]) // キーの取得と存在確認 v, ok := m["Answer"] fmt.Println("The value:", v, "Present?", ok) } 関数 関数も変数として定義することができますし、引数にもできます。 package main import ( "fmt" "math" ) func compute(fn func(float64, float64) float64) float64 { return fn(3, 4) } func main() { hypot := func(x, y float64) float64 { return math.Sqrt(x*x + y*y) } fmt.Println(hypot(5, 12)) fmt.Println(compute(hypot)) fmt.Println(compute(math.Pow)) } メソッド メソッドはレシーバ引数を実装することで可能です。 ...

2026年2月13日 · にあえん

Goのセットアップとチュートリアル【1】

こんにちは、ナナオです。 Goを触り始めるにあたり、どこで勉強するかなどをまとめます。 インストール インストールはmiseでやりました。 Home | mise-en-place mise use -g go どこで勉強したか(するか) GoにはA tour of Goという公式のチュートリアルが用意されているので、そこでやりました。 A Tour of Go ローカルからこのチュートリアルを実行したい場合は以下のコマンドを実行します。 go install golang.org/x/website/tour@latest $GOROOT/bin/tour 印象に残ったところ naked return 関数内の変数をそのまま返却する実装方法 ほかの言語にはない特徴的な記法ですね(実務で使うかどうかは置いといて) package main import "fmt" func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x return } func main() { fmt.Println(split(17)) } whileはない goではfor文がwhileを兼任しています。 package main import ( "fmt" ) func main() { sum := 1 for sum < 1000 { sum += sum } fmt.Println(sum) } 更にrustでいうloop文もforで表現可能です。 ...

2026年2月12日 · にあえん

GoでgRPCをササッと実装してみる 1

こんにちは。ナナオです。 今回は触ろうと思って触ってなかったgRPCに入門してみようと思います。 gRPCとは? gRPCとは、GoogleがRPCを実現するために作った技術のことです。 詳細については以下のサイトがかなり細かく説明してくれています。 https://zenn.dev/hsaki/books/golang-grpc-starting gRPCサーバーを動かす まずはgRPCのリクエストとレスポンスを定義するためのprotoファイルを作成します。 適当なディレクトリを作成して、Goモジュールとして初期化しておきましょう。 mkdir go_grpc_playground && cd go_grpc_playground go mod init go_grpc_playground 次に、protoファイルを作成します。 (参考にしてるサイトをパクってるだけですが。。) // protoのバージョンの宣言 syntax = "proto3"; // protoファイルから自動生成させるGoのコードの置き先 option go_package = "pkg/grpc"; // packageの宣言 package myapp; // サービスの定義 service GreetingService { // サービスが持つメソッドの定義 rpc Hello (HelloRequest) returns (HelloResponse); } // 型の定義 message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } 次にこのprotoファイルからgoファイルを作成するためのモジュールをインストールします。 brewがあれば以下のコマンドで一発インストールできます。 brew install protobuf インストールするとprotocというコマンドが使用可能になります。 続けて、必要なモジュールを依存関係に追加しておきます。 go get -u google.golang.org/grpc go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc さて、今のディレクトリはこうなっています。 ...

2024年11月17日 · にあえん