Upgrade to Pro — share decks privately, control downloads, hide ads and more …

速習Go/Fast Learning Go

速習Go/Fast Learning Go

2024/02/07に行われた、OCHaCafe Season8 #1 - 速習Goで用いた資料です。
commpass: https://ochacafe.connpass.com/event/307167/

oracle4engineer

February 07, 2024
Tweet

Video

More Decks by oracle4engineer

Other Decks in Programming

Transcript

  1. Copyright © 2024, Oracle and/or its affiliates. 2 1. Goとは

    2. Goとプロジェクト/パッケージ 3. Goの基本 • 関数, 型, 制御⽂, defer, interface… 4. Goの応⽤ • goroutine, channel, sync.Mutex, context, logger, UnitTest… 5. DEMO 6. まとめ Agenda
  2. Copyright © 2024, Oracle and/or its affiliates. 3 ⾃⼰紹介 仁井⽥

    拓也 • ⽇本オラクル株式会社 • ソリューション・アーキテクト部 • AppDev/Container/FaaS/(a little)ML… • Oracle Cloud Hangout Caféメンバー/Oracle Groundbreakers Advocate • 前職は某SIer • Oracle歴/Cloud Native歴︓5年弱 • ジブリ⼤好き • 今回もちゃんとネタあります…!! @takuya_0301
  3. Copyright © 2024, Oracle and/or its affiliates. 5 Go Go

    • https://go.dev/ • 最新v1.22.0(2024/2現在) • Googleで開発されたプログラミング⾔語 • 2007年に開発が始まり、2009年にオープン ソースとして公開 • 静的型付け⾔語 • オブジェクト指向⾔語とは⾔われていない • interfaceなど類似機能は持っている • 効率的でシンプルなコードの記述を重視 • メモリ管理や並⾏処理の制御は⾔語仕様、ランタイ ムやモジュールに組み込み済み • ガベージコレクション(GC)あり “The Go gopher” https://go.dev/blog/gopher モチーフはホリネズミ…!! The Go gopher was designed by Renée French.
  4. Copyright © 2024, Oracle and/or its affiliates. 6 • PYPL1では、12位にランクイン(2023年12⽉現在)

    • ちなみにPythonが1位、Javaが2位、TypeScriptが8位、Rustが13位 • Stack Overflow Developer Survey 2023では、これまでの1年間利⽤してきた、もしくは今後1年間で利 ⽤していきたい⾔語ランキング2で13位にランクイン • ちなみにPythonが3位、Javaが7位、JavaScriptが1位、Rustが14位 • Stack Overflow Developer Survey 2023では、現在の年間報酬総額はいくらか3という⾦額のランキングで10位 にランクイン • ちなみにPythonが25位、Javaが40位、TypeScriptが29位、Rustが14位 • TIOBE Index for December 20234では、13位にランクイン • ちなみにPythonが1位、Javaが4位、JavaScriptが6位、Rustが18位 1 Googleでその⾔語のチュートリアルがどれだけ検索されたかというデータを基にプログラミング⾔語の⼈気度をランク付けした指標 2 “Which programming, scripting, and markup languages have you done extensive development work in over the past year, and which do you want to work in over the next year?”という質問に対する回答 3 “What is your current total annual compensation (salary, bonuses, and perks, before taxes and deductions)?”という質問に対する回答 4 オランダに拠点を置く TIOBE Software BV によって作成および維持されているプログラミング⾔語の⼈気の尺度 Goの普及度
  5. Copyright © 2024, Oracle and/or its affiliates. 7 Goがなぜ普及したのか… 1.

    インストールが楽 • Linuxならtarを解凍するだけ(もちろんパッケージツールでもOK)、Windowsならmsiを実⾏するだけでインストール 2. シンプルで厳格な⽂法 • 表現のブレがほとんどなく、複数の書き⽅を許容しない • ループ⽂はfor⽂のみ etc… • 三項演算⼦なし 3. 標準のライブラリやツールが充実 • formatterがいい意味で選択肢があまりない(gofmt/goimports) • 書式で悩む必要がない(formatterやlinterの細かい設定変更は不可) • UnitTest、静的解析やソースコードドキュメントが標準ライブラリで利⽤可能 4. 並⾏処理が簡単に書ける • goroutine/channel 5. クロスコンパイルかつシングルバイナリ、ビルドが⾼速、省メモリ • 各OS、CPUアーキテクチャ向けに単⼀の実⾏ファイルを⽣成(別途⾔語ランタイム不要)
  6. Copyright © 2024, Oracle and/or its affiliates. 8 • Kubernetes(Operator)

    • YouTube • メルカリ • Gunosy • ぐるなび • Wantedly • Dropbox • Bitly • Netflix • Uber • Cloudflare Goが利⽤されているプロダクト ・ ・ ・ 大規模かつスケーラブルな環境にたくさん導入されている…!! 一緒にGoやっていきましょう!! “君もGopherに ならないか!?” The Go gopher was designed by Renée French.
  7. Copyright © 2024, Oracle and/or its affiliates. 10 • インストールは⾮常に簡単!!

    • https://go.dev/dl/ • Windowsはmsi、MacOSはpkg、Homebrewなど、Linuxはtar.gzで • ソースからコンパイルしてもOK Goのインストール
  8. Copyright © 2024, Oracle and/or its affiliates. 11 モジュール •

    Goでの基本的な開発単位 • レポジトリ : モジュール = 1 : 1 • 最近ではマルチモジュールも導⼊されている(後述) • 複数パッケージの集合体 • go.modファイル(後述)が存在する配下のディレクトリで構成 パッケージ • 単⼀もしくは複数の関数をまとめたもの • .goファイルの集合体 関数 • 任意の処理 モジュール パッケージ 関数 Goでのパッケージ、モジュール、関数
  9. Copyright © 2024, Oracle and/or its affiliates. 12 GOPATHモード •

    v1.10までに採⽤されていたパッケージ管理⽅法 • $GOPATH/src配下に全てのパッケージを管理 • レポジトリの最新バージョン(リビジョン)のみが対象 • $GOPATH(プロジェクトルート)と$GOROOT(Go SDKの場所)が必須 • 今は利⽤しないことが推奨されている モジュール(module-aware)モード • v1.11から採⽤されたパッケージ管理⽅法 • 任意のディレクトリにパッケージを管理可能 • レポジトリのバージョンタグやリビジョンも管理可能 • (デフォルト値から変更なければ)$GOPATHと$GOROOTの設定は不要 GOPATHモード/モジュール(module-aware)モード
  10. Copyright © 2024, Oracle and/or its affiliates. 13 • Go

    v1.18から導⼊されているマルチモジュールを管理するためのモード(本⽇は割愛) • モノレポジトリ(1つのレポジトリ)内に複数のGo Moduleを管理可能 • go.workファイルを利⽤して管理 【参考】workspaceモード . ├── go.work ├── moduleA │ ├── A.go │ └── go.mod └── modules ├── moduleB │ ├── B.go │ └── go.mod └── moduleC ├── C.go └── go.mod 4 directories, 7 files
  11. Copyright © 2024, Oracle and/or its affiliates. 14 1. Goプロジェクト作成

    2. S i. モジュールを公開する場合の例(GitHubの場合) ii. モジュールを公開しない場合の例 Goのモジュール(プロジェクト)を作成 $ go mod init <モジュール名> $ go mod init github.com/<アカウント名>/moduleA $ go mod init moduleA
  12. Copyright © 2024, Oracle and/or its affiliates. 15 プロジェクトの初期構成とgo.modファイル .

    └── go.mod 0 directories, 1 file モジュールの依存関係 を記述するファイル
  13. Copyright © 2024, Oracle and/or its affiliates. 16 • 主なアプリケーションコードをcmdに配置

    • 内部利⽤パッケージは”internal”、外部公開パッケージは”pkg”に配置 • その他OpenAPI仕様などを配置する”api”、ビルド関連ファイルを配置する”build”もある • 詳細はドキュメントを参照。 • https://github.com/Go-standards/project-layout/blob/master/README_ja.md) • https://go.dev/doc/modules/layout よくあるディレクトリ構成 . ├── cmd │ └── demo │ └── demo.go -> 本体 ├── internal -> 内部パッケージ │ └── internal.go ├── pkg -> 外部公開パッケージ │ └── external.go ├── go.mod └── go.sum
  14. Copyright © 2024, Oracle and/or its affiliates. 17 • Goにおけるエントリーポイント

    • Goのプログラムには必須 • mainパッケージの中にmain関数を定義 • mainパッケージ以外のパッケージは補助パッ ケージとして扱う • 補助パッケージのモジュールはレポジトリ内に サンプルコードが存在することも • サンプルコードはmain.goで実装 • Goでは最初が⼤⽂字から始まる名前(関数名や 変数など)は”Exported Names”と呼ぶ • 外部パッケージで利⽤できるもの(public属性) • 右の例では”fmt.Println”(fmtパッケージの Println関数を利⽤できる) main.go
  15. Copyright © 2024, Oracle and/or its affiliates. 18 ソースコードの構成 Hello,

    World パッケージ宣言(main or 任意の名前) インポート文(次スライドで解説) 関数と処理(詳細は次章で解説)
  16. Copyright © 2024, Oracle and/or its affiliates. 19 • インポートの定義順は以下の順

    • 標準パッケージ • 外部パッケージ • (ローカルパッケージ) • インポートは絶対パス • 単⼀⾏でもグループ化してもどちらでもOK • ブランクインポート(import _ パッケージ名) • パッケージのinit関数が実⾏され、他のエクスポートさ れた関数にはアクセス不可 • init関数に含まれる必要な初期化や設定を利⽤した い時に利⽤(database/sqlなど) • 可読性が低下する可能性があるため、ブランクイン ポートの理由をコメントやドキュメントで明確にすること を推奨 • ドット(.)を利⽤したパッケージ名の省略が可能 • エイリアスの付与が可能 パッケージのインポート ”fmt.”を省略 ”strings”
  17. Copyright © 2024, Oracle and/or its affiliates. 20 • ”go

    get <パッケージ名>”が基本 • バイナリやコンパイル済みパッケージをインストー ルする場合は”go install <パッケージ名>”を推 奨(v1.16から) • Goの⾔語ツールのインストールに利⽤ (goplsやgotestsなど) • “@”でバージョン指定可能 • “go mod tidy” • 依存パッケージをまとめてインストール&不要な パッケージを削除 • “go get”の上位互換と⾔えるかも 外部パッケージのインポート $ go get -u github.com/gin-gonic/[email protected] “go get”した後の go.modファイル
  18. Copyright © 2024, Oracle and/or its affiliates. 21 実⾏(最も⼿っ取り早い⽅法) 単体ソースコードのビルド

    モジュール(プロジェクト)のビルド Goのビルド(コンパイル)/実⾏ $ go run main.go Hello World!! $ go build main.go $ ./main Hello World!! // go.modファイル配下で $ go build GOOS=linux GOARCH=amd64 . $ ./main Hello World!! • GOOSやGOARCHの指定により、クロスプ ラットフォームなシングルバイナリを簡単に 作成!! • “go tool dist list”で確認 • Windows/Darwin/Android/iOS/Solaris… • -ldflagsなどを利用するとバイナリを小さく できるものもある • 要件に応じてオプションを適切に選択しま しょう
  19. Copyright © 2024, Oracle and/or its affiliates. 22 1. Go

    extension • https://marketplace.visualstudio.com/items?itemName=Go.go • コード補完などはとりあえずこれさえ⼊れておけば⼤丈夫…!! 2. Go Outliner • https://marketplace.visualstudio.com/items?itemName=766b.go-outliner • アウトラインを強化してくれる拡張機能 Visual Studio Codeの拡張機能 Language Server(gopls)など必 要なものをコマンドパレット から一括インストール…!!
  20. Copyright © 2024, Oracle and/or its affiliates. 24 Goの全てが分かるサイト A

    Tour of Go 皆さん、これをやっていきましょ!! - Fin. -
  21. Copyright © 2024, Oracle and/or its affiliates. 25 Goの全てが分かるサイト A

    Tour of Go 皆さん、これをやっていきましょ!! - Fin. - A Tour of Goの内容を掻い摘んで10個(恣意的)の ポイントにまとめて解説していきます…!!
  22. Copyright © 2024, Oracle and/or its affiliates. 26 1. varで宣⾔

    • var 変数名 型 • 複数の変数を並べることもできる • Ex) var i, j int = 1, 2 • ちなみに定数は”const” 2. 代⼊⽂での宣⾔ • :=という記号で宣⾔ • constでは利⽤不可 • 関数外では利⽤不可 • 型は暗黙的に定義 A Tour of Goをベースにポイントで解説…(1) 変数宣⾔
  23. Copyright © 2024, Oracle and/or its affiliates. 27 • 0個以上の引数をとる

    • func 関数名 (引数) (返り値) • 返り値がない場合は”(返り値)”を省略 • 引数や返り値が複数ある場合は並べて宣⾔ • 引数や返り値が同じ型である場合は、最後 の型だけ宣⾔すればOK(最後の型でまとめ る) • Ex) swap(x, y string) (string) • 返り値には名前を付与可能 • 返り値は関数内に定義した同⼀名の変数とする • return⽂に返り値を書かなくてもOK • naked returnと呼ばれる A Tour of Goをベースにポイントで解説…(2) 関数
  24. Copyright © 2024, Oracle and/or its affiliates. 28 基本型(プリミティブ型) •

    bool(初期値: false) • string(初期値: ””) • int/int8/int16/int32/int64(初期値: 0) • uint/uint8/uint16/uint32/uint64(初期値: 0) • 符号なし整数型 • byte(uint8) (初期値: 0) • rune(int32) (初期値: 0) • UTF-8でエンコードされた⽂字列を扱うための型 • float32/float64(初期値: 0) • complex64/complex128(初期値: (0+0i)) • 複素数型 型変換 • 他の⾔語とあまり変わらない • Ex) • 暗黙的な型宣⾔(“:=“での宣⾔)の場合は右側の変 数から推論 • 右側の変数の型が明⽰的であればその型を適⽤ • 右側の変数の⽅が暗黙的であれば変数から推 測して適⽤ A Tour of Goをベースにポイントで解説…(3) 型
  25. Copyright © 2024, Oracle and/or its affiliates. 29 繰り返し⽂ •

    ⼤きくは他の⾔語と⼤差なし • Goでのループ⽂はfor⽂のみ(while⽂はなし) • 条件付きループ⽂の場合は条件⽂のみが必須 • 条件⽂を省略すると無限ループ • 括弧()は不要で中括弧 ({})のみ必要 • 初期化と後処理はセミコロン含めて省略可 条件⽂ • ⼤きくは他の⾔語と⼤差なし • if⽂の条件の前に変数宣⾔などのステートメントを定 義することも可能 • ここで宣⾔した変数はif/else内でのみ利⽤可能 A Tour of Goをベースにポイントで解説…(4) 制御⽂
  26. Copyright © 2024, Oracle and/or its affiliates. 30 • 関数が終了するまで実⾏されない⽂

    • 正確には即時評価はされるが、実⾏はされな い • deferに複数の⽂や関数を渡した場合はスタックさ れて実⾏ • LIFO(last-in-first-out) • ⼀般的にはリソースの解放やエラー(panic)に対処 する⼿法の1つとして利⽤されることが多い • deferはreturnする前に実⾏されるので、その 習性を利⽤して必ずやりたい処理を実⾏可能 • リソースのクローズ処理など A Tour of Goをベースにポイントで解説…(5) defer
  27. Copyright © 2024, Oracle and/or its affiliates. 31 • フィールド(変数)の集まり

    • type struct名 struct • 型として利⽤可能 • structのフィールドは.(ドット)でアクセス可 • structのフィールドはポインタでのアクセスもOK • ポインタ記法 • フィールドの⼀部のみを列挙することも可能 A Tour of Goをベースにポイントで解説…(6) struct(構造体)
  28. Copyright © 2024, Oracle and/or its affiliates. 32 array •

    実体を持った配列 slice • arrayを参照した配列 • イメージはarrayの参照 • sliceを直接作成しても裏側では実体となる arrayが⽣成されている • sliceを変更すると元の配列にも反映 • 配列[low:high]でlowからhigh-1までを含む 値を抽出 • arrayよりも利⽤されることが多い map • keyとvalueをマップしたもの A Tour of Goをベースにポイントで解説…(7) array/slice/map
  29. Copyright © 2024, Oracle and/or its affiliates. 33 • Method

    = 型に対して定義可能な関数 • オブジェクト指向⾔語でよくあるメソッドではない • classの概念はGoには存在しない • func レシーバ Method名 • レシーバに型(struct)を定義 • レシーバはポインタの利⽤もOK(ポインタレシーバ) • stringやfloatなどのプリミティブ型にも利⽤可能 • Ex) A Tour of Goをベースにポイントで解説…(8) Method
  30. Copyright © 2024, Oracle and/or its affiliates. 34 • Goでは明⽰的にinterfaceを実装しない

    • “implements”キーワードはない • 任意の型にinterface(型)のMethodを実装してい くことによって暗黙的にかつ⾃動的に実装 • GoでのinterfaceはMethodの塊 • interfaceに紐づくMethodを全て実装すること でinterfaceを実装したことにできる • 任意の型を保持可能な空のインタフェースを宣⾔ することも可能(v1.18からはany型でもOK) • 例えば以下のようなメリット • 同じような実装になるstructのMethodを interfaceでグループ化 • interfaceにinterfaceを組み込んだり、struct にinterfaceを組み込むことで“継承っぽい” (“is-a関係”ではない)動き(委譲)を実現可能 A Tour of Goをベースにポイントで解説…(9) interface 関数の羅列
  31. Copyright © 2024, Oracle and/or its affiliates. 35 • Goでは返却するerrorは必ずerror

    interfaceであ る必要がある • Javaの“例外(Exception)クラス”のような考え はない • 実装⽅針としては”early return style” • とにかくエラーが発⽣したらその場でハンドリング • ラップしてthrowするという慣習がほとんどない • エラーが発⽣していない場合は”nil”で返す • 上記を遵守するとコード的にはif⽂によるエラーハン ドリングのオンパレードになりがちだが、、、 • Go的には正しい…!!(はず) A Tour of Goをベースにポイントで解説…(10) errors
  32. Copyright © 2024, Oracle and/or its affiliates. 37 並⾏性(Concurrency) •

    仕事を切り替えることで同時にある仕事をこなしてい るように⾒せる • 時間軸である瞬間だけ切り取ると1つの仕事しか こなしていない • コンピュータやプログラムでは「切り替える」という 動作をコンテキストスイッチと呼ぶ 並列性(parallelism) • 同時に複数の仕事をこなすこと • 時間軸である瞬間だけ切り取ると同時に複数 の仕事をこなしている • 基本的には複数のCPU(コア)が必須 • ”並列”かつ”並⾏”はあり得る 【参考】並⾏性と並列性 1台のコーヒーマシンで 複数の待ち行列を捌く 複数台のコーヒーマシンで 複数の待ち行列を捌く 並行 並列 待ち行列=処理, コーヒーマシン=CPU
  33. Copyright © 2024, Oracle and/or its affiliates. 38 並⾏性(Concurrency) •

    仕事を切り替えることで同時にある仕事をこなしてい るように⾒せる • 時間軸である瞬間だけ切り取ると1つの仕事しか こなしていない • コンピュータやプログラムでは「切り替える」という 動作をコンテキストスイッチと呼ぶ 並列性(parallelism) • 同時に複数の仕事をこなすこと • 時間軸である瞬間だけ切り取ると同時に複数 の仕事をこなしている • 基本的には複数のCPU(コア)が必須 • ”並列”かつ”並⾏”はあり得る 【参考】並⾏性と並列性 1台のコーヒーマシンで 複数の待ち行列を捌く 複数台のコーヒーマシンで 複数の待ち行列を捌く 並行 並列 待ち行列=処理, コーヒーマシン=CPU
  34. Copyright © 2024, Oracle and/or its affiliates. 39 • Goで容易に並⾏処理を実現できる仕組み

    • 軽量スレッド(cf. Virtual Thread in Java) • “go 関数名” だけでOK • Goでは全てのプログラムは1つ以上のgoroutineを持つことに なっている • main処理もgoroutineの⼀つ • goroutineでは複数のgoroutineの完了を待つ(カウンターが ゼロになるまで待つ)WaitGroupという仕組みがある • WaitGroup.Add()することでカウントアップし、対象の goroutineをセット • goroutineによって呼び出す関数内でdeferによるカウン トダウン(WaitGroup.Done()) • WaitGroupのカウンター管理に誤りがある場合はデット ロックに • goroutineのリソース競合(Race Condition)対策は後述 • goroutineのプロセス管理はcontextを利⽤(後述) goroutine 複数CPUを利用し得るので、 ”並列”でもある(プログラムに依る)
  35. Copyright © 2024, Oracle and/or its affiliates. 40 • 複数の処理が同時に⾏われた際に競合状態が発

    ⽣し、予期しない状態が引き起こされること • goroutineでも発⽣する • GoでRace Conditionを発⾒する⽅法 • -raceオプション • GoでRace Conditionを防⽌する⽅法 • channel • sync.Mutex Race Condition $ go run main.go count: 4972 それぞれのgoroutineが countを読んだタイミン グが異なるため… $ go run –race main.go ================== WARNING: DATA RACE Read at 0x00c0000200e8 by goroutine 8: (略) exit status 66
  36. Copyright © 2024, Oracle and/or its affiliates. 41 • goroutine間でデータの送受信を実施するための仕組み(=バッファ)

    • “make(chan 型)”という宣⾔で作成 • チャネルの操作 • 送信: channel <- value • 受信: <-channel • 原則として送信と受信はそれぞれブロックされる • コンテンツがchannelに届く前に受信したり、channelが満杯の時に送信できたりすることはない • make(chan string, 2)のように第2引数にバッファを持たせることで指定したサイズまではブロックされないようにすること も可能 • selectを利⽤することで複数のchannelを同時に操作することも可能(後述) Channel(1) goroutine1 goroutine2 Channel Receive Receive Send Send
  37. Copyright © 2024, Oracle and/or its affiliates. 43 • for⽂と⼀緒に利⽤することが多い

    • case⽂でchannelごとの処理を実装 • 以下の条件を満たすchannelの処理を実⾏ • 送信: 「channelが満杯になっていない」 • 受信: 「channelにコンテンツが⼊っている」 or 「channelがcloseされている」 • どのchannelも実⾏できる状態でなければdefault節を実⾏ • default節が省略されている場合はブロック • ブロックしたくない場合は空のdefault節でもOK • 複数のchannelの処理が実⾏可能な場合はランダムに選択 select
  38. Copyright © 2024, Oracle and/or its affiliates. 44 • goroutineによる並⾏処理で排他制御を⾏う場

    合に利⽤ • ⽬的は対象リソースへのアクセスを1つのみの goroutineに限定すること • mutexはmutual exclusionの略 • Javaで⾔えば”synchronized”に相当 • Lock()で対象リソースをロックし、Unlock()で解 • Lock-Unlock間に挟まれたリソースをロック • Unlock()はdeferとともに実装することが多い sync.Mutex $ go run main.go count: 5000
  39. Copyright © 2024, Oracle and/or its affiliates. 45 • 複数のgoroutineを跨いた関数の連鎖において以下を伝播可能な仕組み

    • 値(ex: OpenTelemetryでのコンテキスト情報の伝播) • キャンセル • タイムアウト • context⾃体はパッケージになっており、Contextという型が存在 • contextはgoroutineに第1引数で渡される • よく利⽤される関数 • Backgournd() => Contextの⽣成を⾏い、空のContextを返却 • WithValue() => 任意のキーに対して任意の値を付与 • WithCancel() => キャンセル関数を返却 • Contextの親⼦階層を実装している場合、親がキャンセルされると⼦もキャンセルされる • WithDeadline() => タイムアウト(指定した経過時間)付きのWithCancel() • WithTimeout() => タイムアウト(指定した時刻)付きのWithCancel() • Done() => キャンセル関数の実⾏を検知 Context(1)
  40. Copyright © 2024, Oracle and/or its affiliates. 46 Context(2) •

    単⼀階層のContext • 複数階層(親⼦階層)のContext 親のContextを引き継いでいる 親のcancel()関数が呼ばれると 連鎖的に子のcancel()関数も呼ばれる
  41. Copyright © 2024, Oracle and/or its affiliates. 47 • Go

    v1.21から導⼊されたslogが便利!! • 通常のlogパッケージは以下のように出⼒される • log.Printf("name=%v, value=%v", name, value) • ⼈間には優しい… • slogはデフォルトで構造化ログが扱える(JSON形式など) • クラウドのロギングサービスやElasticsearchなどで検索 したり、分析したり… • ログハンドラの設定が⾯倒な場合、init関数で設定するの もOK logger 2023/12/14 15:00:48 name=xxx, value=yyy
  42. Copyright © 2024, Oracle and/or its affiliates. 48 • 標準パッケージにユニットテストパッケージ“testing”が

    含まれている • カバレッジレポートも出⼒可能(-coverオプション) • ただし、Assert機能がない • 「Assert は便利だけど、頼り過ぎてエラーのレ ポートが適当になるので、必要なら⾃分たち で⾃作しよう」という思想…?? • サードパーティパッケージで補完 • ex) github.com/stretchr/testify/assert • テスト対象コードと同じパッケージ(ディレクトリ) に”xxx(テスト対象ファイル名)_test.go”という命名規 則で実装 • テスト関数は”Test”を接頭辞とした名前を付与し、 *testing.T型の引数を渡す必要がある • 関数名には⽇本語を含めてもOK UnitTest(1) math_test.go
  43. Copyright © 2024, Oracle and/or its affiliates. 49 テスト対象関数の呼び出し⽅ •

    テスト対象と同じパッケージ宣⾔でテストコードを作成 • Private関数も含めてテスト可能 • テスト対象と異なるパッケージ宣⾔でテストコードを作成 • 利⽤ユーザの視点に⽴ってテスト可能(publicな関 数のみをテスト) Table Driven Tests(テーブル駆動テスト) • Goが推奨するテストケースをテーブルとして整理する⼿ 法(おそらく境界値試験に特化した話) • データとテストロジックを分離 • データ数と⼊出⼒にフォーカスしてテスト可能 • 決まった実装⽅法があるわけではない、あくまで⼿ 法やポリシー • mapを利⽤している例が多い…?? UnitTest(2) Table
  44. Copyright © 2024, Oracle and/or its affiliates. 50 ソースコードドキュメント •

    pkg.go.devで公開されるにはOSSライセンスの明記やリリースタグの登録が必須 • ”pkgsite”、”godoc”(自動生成機能あり)などがある シンプルなコメント行でOK!! 拘りたければ以下を参考に…!! https://tip.Go.org/doc/comment
  45. Copyright © 2024, Oracle and/or its affiliates. 51 flag •

    標準ライブラリに含まれているフラグパーサ • フラグ(オプション)を扱うための基本的な機能を提供 • サブコマンドを扱うことは不可 urfave/cli • サブコマンドを利⽤可能 • Gitレポジトリ管理ツール”ghq”やAkamai CLIにも 利⽤されている spf13/cobra • 最も⼈気にあるCLIフレームワーク • cobraコマンド(cobra-cli)により、ボイラーテンプレー トが⽣成可能 Goの代表的なCLIアプリケーションフレームワーク $ go get github.com/spf13/cobra@latest $ go install github.com/spf13/cobra-cli@latest cobra-cliの実行例 ライブラリ/CLIのインストール $ cobra-cli init ボイラーテンプレートの作成 $ cobra-cli add <サブコマンド名> サブコマンドの追加 ├── cmd │ ├── ochacafe.go │ └── root.go cmd配下に 自動生成される
  46. Copyright © 2024, Oracle and/or its affiliates. 52 Goの代表的なWebフレームワーク フルスタック

    軽量 Gin echo Fiber Beego Iris まずは第1候補? Pythonでいう Django相当(MVC) Ginベース Express.jsを参考 に実装 これもMVC Goで最速 フレームワークらしい!?
  47. O/Rマッパー 対応RDBMS(公式) 備考 GORM MySQL, PostgreSQL, SQLite, SQL Server 一番人気!!

    Beego MySQL, PostgreSQL, SQLite WebフレームワークであるBeegoに 付属するO/Rマッパー ent MySQL, PostgreSQL, SQLite Meta(Facebook)製のO/Rマッパー sqlx MySQL, PostgreSQL, SQLite 標準ライブラリdatabase/sqlを拡 張したO/Rマッパー sqlc MySQL, PostgreSQL, SQLite SQLからGoのコードを生成する珍 しいO/Rマッパー Copyright © 2024, Oracle and/or its affiliates. 53 Goの代表的なO/Rマッパー ※Goは公式にはデータベースドライバーを提供していないため、必ずサードパーティの利用が必要。 ちなみにGoが公式で互換性テストを行なっているサードパーティドライバーがサポートするデータベースはMySQL, PostgreSQL, SQLiteのみ。 https://zchee.github.io/Go-wiki/SQLDrivers/
  48. Copyright © 2024, Oracle and/or its affiliates. 55 今回のデモ環境 OCI

    Region Availability Domain 1 Fault Domain 1 Fault Domain 2 Fault Domain 3 VCN LB Subnet 10.0.20.0/24 K8s API Subnet 10.0.0.0/28 Node Subnet 10.0.10.0/24 Container Engine for Kubernetes Worker Nodes Service Gateway Internet Gateway NAT Gateway Application Performance Monitoring Open Telemetry OCI Database with PostgreSQL デモコード
  49. Copyright © 2024, Oracle and/or its affiliates. 56 goroutine •

    Ginフレームワークではnet/httpが利⽤されており、net/httpそのものがgoroutineで実装されている • もちろんGinで明⽰的にgoroutineを利⽤できる • https://gin-gonic.com/ja/docs/examples/run-multiple-service/ • 別ポートでサービスを複数起動させたい場合など… • 通常のユースケースでは明⽰的にgoroutineを実装する必要はないはず contexts • 今回はOpenTelemetryを利⽤したトレース情報の伝播で利⽤ • “otelgin”と”otelgorm”を利⽤して⽣成したcontextを伝播 デモで取り⼊れている要素(1) goroutine, contexts, unittest デモコード
  50. Copyright © 2024, Oracle and/or its affiliates. 57 goroutine, contexts,

    unittest デモで取り⼊れている要素(2) テスト実行 カバレッジレポート (html形式) デモコード
  51. Copyright © 2024, Oracle and/or its affiliates. 59 Goの特徴 •

    Googleで開発されたプログラミング⾔語 • オブジェクト指向ではないが、類似機能を実装している • KubernetesやCloudflareなど様々なオープンソースや企業が取り⼊れており、最近普及している⾔語の⼀つ Goの開発 • インストールや環境構築が⾮常に簡単で、クロスプラットフォームかつシングルバイナリでコンパイル • モジュール単位で開発し、go.modとgo get(go mod tidy)を利⽤して依存関係を管理 goroutineとエコシステムの豊富さ • goroutineを利⽤して軽量スレッドを容易に起動可能 • channel、WaitGroupやsync.Mutexを利⽤してリソース競合やスレッド間のデータのやり取りを実装 • CLI/WebフレームワークやORMも豊富 まとめ
  52. Copyright © 2024, Oracle and/or its affiliates. 60 Go公式ページ •

    https://go.dev/ A Tour of Go • https://go.dev/tour/welcome GitHub • https://github.com/Go/go とほほのGo⼊⾨ • https://www.tohoho-web.com/ex/Go.html プログラミングGo⾔語完全⼊⾨ • https://docs.google.com/presentation/d/1RVx8oeIMAWxbB7ZP2IcgZXnbZokjCmTUca- AbIpORGk/edit#slide=id.g4f417182ce_0_0 デモソースコード • https://github.com/oracle-japan/ochacafe-faststart-go 参考資料
  53. Copyright © 2024, Oracle and/or its affiliates. 61 書籍 •

    oreilly • 初めてのGo⾔語: https://www.oreilly.co.jp/books/9784814400041/ • 実⽤Go⾔語: https://www.oreilly.co.jp/books/9784873119694/ • Go⾔語による並⾏処理: https://www.oreilly.co.jp/books/9784873118468/ • Go⾔語によるWebアプリケーション開発: https://www.oreilly.co.jp/books/9784873117522/ • Go⾔語で作るインタプリタ: https://www.oreilly.co.jp/books/9784873118222/ • Go⾔語による分散サービス: https://www.oreilly.co.jp/books/9784873119977/ • その他 • Go⾔語プログラミングエッセンス: https://gihyo.jp/book/2023/978-4-297-13419-8 • Go⾔語 100Tips: https://book.impress.co.jp/books/1122101133 参考資料