Slide 1

Slide 1 text

Go:Java対応チートシート 用語まとめ 1

Slide 2

Slide 2 text

はじめに このチートシートの目的: 想定読者: 「Goのこの機能はJavaでいうとこれだよね」という対応関係を説明 ▶ Java開発者がGoコードを理解しやすくする ▶ Javaの実務経験があり、Goの現場にアサインされた方 ▶ JavaもGoも扱う現場担当者 ▶ 2

Slide 3

Slide 3 text

1. 基本用語 3

Slide 4

Slide 4 text

言語構造 用語 Goにおける説明 Javaでいうと package コードをグループ化する単位 パッケージ func 関数を定義する メソッド struct カスタムデータ型を定義する クラス interface メソッドのセットを定義する インターフェース type 新しい型を定義する クラス, インターフェース 関連リンク: Go言語の基本構文 ▶ 4

Slide 5

Slide 5 text

並行処理 用語 Goにおける説明 Javaでいうと Goroutine 軽量スレッド Thread channel Goroutine間の通信に使用 BlockingQueue select 複数のチャネル操作を待機 Java NIO Selector sync.Mutex 相互排他ロック synchronized, Lock sync.WaitGroup 複数のGoroutineの完了を待機 CountDownLatch 関連リンク: Goの並行処理 ▶ 5

Slide 6

Slide 6 text

エラー処理 用語 Goにおける説明 Javaでいうと error interface エラーを表現するインターフェース Exception panic/recover 例外的な状況の処理 try-catch defer 関数終了時に実行される処理を定義 try-finally 関連リンク: Goのエラー処理 ▶ 6

Slide 7

Slide 7 text

データ構造 用語 Goにおける説明 Javaでいうと slice 可変長配列 ArrayList map キーと値のペアを格納する HashMap array 固定長配列 配列 make スライス、マップ、チャネルの作成 new new ポインタを返す new 関連リンク: Goのスライスの使用法 ▶ 7

Slide 8

Slide 8 text

2. Goの周辺ツール、ミドルウェアなど 8

Slide 9

Slide 9 text

ビルドとパッケージ管理 用語 Goにおける説明 Javaでいうと Go mod Goの依存関係管理ツール Maven, Gradle Go build Goプログラムをコンパイルする javac Go run Goプログラムをコンパイルして実行する java Go get 外部パッケージをダウンロードしてインストールする Maven依存関係のダウンロード 関連リンク: Go Modules入門 ▶ 9

Slide 10

Slide 10 text

テストとプロファイリング 用語 Goにおける説明 Javaでいうと Go test Goの標準テストフレームワーク JUnit testify アサーションライブラリ JUnit Assertions Go vet Goの標準静的解析ツール SonarQube pprof Goの標準プロファイリングツール JProfiler 関連リンク: Goのテスト入門 ▶ 10

Slide 11

Slide 11 text

Webフレームワークとサービス 用語 Goにおける説明 Javaでいうと gin 高性能なWebフレームワーク Spring Boot echo 最小限のWebフレームワーク Spark Java gRPC Googleが開発したRPCフレームワーク Java RMI net/http 標準HTTPクライアント/サーバー java.net.HttpURLConnection 関連リンク: Gin Web Framework ▶ 11

Slide 12

Slide 12 text

3. Go開発者環境 12

Slide 13

Slide 13 text

開発環境設定 用語 Goにおける説明 Javaでいうと GoPATH Goのワークスペースを指定する環境変数 CLASSPATH GoROOT Goのインストールディレクトリを指定する環境変数 JAVA_HOME Go env Go環境変数を表示/設定 環境変数の設定 関連リンク: Goのインストールと環境設定 ▶ 13

Slide 14

Slide 14 text

IDE・エディタ 用語 Goにおける説明 Javaでいうと GoLand JetBrains社のGo用IDE IntelliJ IDEA Visual Studio Code MicrosoftのコードエディタでGoプラグインを使用 同じく vim-Go Vim用のGoプラグイン Eclipse Vrapper 関連リンク: Visual Studio CodeでのGo開発 ▶ 14

Slide 15

Slide 15 text

デバッグとトレース 用語 Goにおける説明 Javaでいうと Delve Goのデバッガー JDB, IntelliJ Debugger Go tool trace Goの実行トレースツール Java Flight Recorder 関連リンク: DelveでのGoのデバッグ ▶ 15

Slide 16

Slide 16 text

4. GoのUI 16

Slide 17

Slide 17 text

デスクトップGUI 用語 Goにおける説明 Javaでいうと fyne クロスプラットフォームGUIツールキット JavaFX gio 即時モードGUIフレームワーク Swing Gotk3 GTK3のGoバインディング SWT 関連リンク: Fyne - クロスプラットフォームGUIフレームワーク ▶ 17

Slide 18

Slide 18 text

Webベース UI 用語 Goにおける説明 Javaでいうと webview Webベースのデスクトップアプリケーションを作成するためのライブラリ JavaFX WebView electron GoバックエンドとElectronフロントエンド Java + Electron 18

Slide 19

Slide 19 text

5. GoのDB関連 19

Slide 20

Slide 20 text

リレーショナルデータベース 用語 Goにおける説明 Javaでいうと database/sql Goの標準データベースインターフェース JDBC sqlx 拡張されたデータベースライブラリ MyBatis GoRM GoのORMライブラリ Hibernate pgx PostgreSQL用の高性能ドライバー PostgreSQL JDBC Driver 関連リンク: Goのdatabase/sqlパッケージ使用法 ▶ 20

Slide 21

Slide 21 text

NoSQL データベース 用語 Goにおける説明 Javaでいうと Go-redis Redisクライアント Jedis mGo MonGoDBドライバー MonGoDB Java Driver Gocb Couchbaseクライント Couchbase Java SDK 関連リンク: Go-redis - Goの高性能Redisクライアント ▶ 21

Slide 22

Slide 22 text

6. Goのファイル連携に関する用語 22

Slide 23

Slide 23 text

基本的なファイル操作 用語 Goにおける説明 Javaでいうと os.Open ファイルを開く FileInputStream os.Create ファイルを作成する FileOutputStream bufio.NewReader バッファリングされたリーダーを作成 BufferedReader bufio.NewWriter バッファリングされたライターを作成 BufferedWriter 関連リンク: Goのファイル操作入門 ▶ 23

Slide 24

Slide 24 text

高レベルのファイル操作 用語 Goにおける説明 Javaでいうと ioutil.ReadFile ファイルの内容を全て読み込む Files.readAllBytes() ioutil.WriteFile ファイルに内容を書き込む Files.write() filepath.Walk ディレクトリを再帰的に走査 Files.walkFileTree() os.MkdirAll ディレクトリを再帰的に作成 Files.createDirectories() 24

Slide 25

Slide 25 text

ファイルシステム操作 用語 Goにおける説明 Javaでいうと os.Stat ファイル情報を取得 Files.getAttribute() os.Chmod ファイルの権限を変更 Files.setPosixFilePermissions() os.Rename ファイル名を変更 Files.move() os.Remove ファイルを削除 Files.delete() 関連リンク: Goのos/filepathパッケージ ▶ 25

Slide 26

Slide 26 text

7. 言語仕様 26

Slide 27

Slide 27 text

型システム 用語 Goにおける説明 Javaでいうと 静的型付け コンパイル時に型チェックを行う 同様 型推論 var キーワードを使用して型を推論 var キーワード(Java 10以降) インターフェース 暗黙的な実装 明示的な実装(implements キーワード) ジェネリクス Go 1.18以降でサポート 広範にサポート nil ポインタ、インターフェース等のゼロ値 null 関連リンク: Goの型システム ▶ 27

Slide 28

Slide 28 text

メモリ管理 用語 Goにおける説明 Javaでいうと ガベージコレクション 自動メモリ管理 同様 escape analysis スタック割り当ての最適化 同様(JVMで実行) 値型とポインタ型 明示的に区別 参照型のみ(プリミティブ型を除く) 関連リンク: Goのメモリモデル ▶ 28

Slide 29

Slide 29 text

並行処理モデル 用語 Goにおける説明 Javaでいうと CSP Goroutineとchannelによる通信順序プロセス Actor model(Akkaなど) スケジューラ Go runtime によるGoroutineのスケジューリング JVM のスレッドスケジューラ sync.Pool 一時オブジェクトのプール ThreadLocal, オブジェクトプール 関連リンク: Goの並行処理パターン ▶ 29

Slide 30

Slide 30 text

8. 標準ライブラリ 30

Slide 31

Slide 31 text

入出力処理 用語 Goにおける説明 Javaでいうと io.Reader / io.Writer 入出力のインターフェース java.io.InputStream / OutputStream bufio バッファリングされたI/O java.io.BufferedReader / BufferedWriter fmt フォーマット付きI/O System.out.printf, String.format 関連リンク: Goのfmtパッケージ ▶ 31

Slide 32

Slide 32 text

文字列処理 用語 Goにおける説明 Javaでいうと strings パッケージ 文字列操作ユーティリティ java.lang.String, StringUtils (Apache Commons) strconv パッケージ 文字列変換 Integer.parseInt, Double.parseDouble など regexp パッケージ 正規表現 java.util.regex パッケージ 関連リンク: Goのstringsパッケージ ▶ 32

Slide 33

Slide 33 text

コレクション 用語 Goにおける説明 Javaでいうと slice 動的配列 ArrayList map ハッシュテーブル HashMap list パッケージ 双方向リスト LinkedList ring パッケージ 循環リスト - (カスタム実装が必要) 33

Slide 34

Slide 34 text

時間と日付 用語 Goにおける説明 Javaでいうと time パッケージ 時間と期間の操作 java.time パッケージ time.Time 時刻を表す java.time.Instant, LocalDateTime time.Duration 期間を表す java.time.Duration 関連リンク: Goのtimeパッケージ ▶ 34

Slide 35

Slide 35 text

9. ツールチェーン 35

Slide 36

Slide 36 text

ビルドツール 用語 Goにおける説明 Javaでいうと Go build ソースコードのコンパイルとリンク javac Go install バイナリのビルドとインストール Maven install Go generate ソースコード生成 Annotation Processor 関連リンク: Goのコマンドドキュメント ▶ 36

Slide 37

Slide 37 text

依存関係管理 用語 Goにおける説明 Javaでいうと Go.mod モジュール定義ファイル pom.xml, build.gradle Go get 依存関係のダウンロード Maven/Gradle の依存関係解決 Go mod tidy 依存関係の整理 Maven/Gradle の依存関係解決 関連リンク: Go Modulesのチュートリアル ▶ 37

Slide 38

Slide 38 text

コード品質 用語 Goにおける説明 Javaでいうと Go fmt コードフォーマッタ Checkstyle Go vet 静的解析ツール SpotBugs, SonarQube Golangci-lint 統合リントツール PMD, Checkstyle, SpotBugs の組み合わせ 関連リンク: Golangci-lintの使い方 ▶ 38

Slide 39

Slide 39 text

10. デザインパターンと実装技法 39

Slide 40

Slide 40 text

エラー処理 用語 Goにおける説明 Javaでいうと 複数返り値によるエラー返却 func DoSomething() (Result, error) チェック例外、Optional errors.Is / errors.As エラーの種類の判定 instanceof による例外の型チェック カスタムエラー struct による独自エラー型の定義 カスタム例外クラス 関連リンク: Goのエラー処理ベストプラクティス ▶ 40

Slide 41

Slide 41 text

並行処理パターン 用語 Goにおける説明 Javaでいうと fan-out, fan-in Goroutineとchannelを使用 ExecutorService, CompletableFuture worker pool Goroutineプール ThreadPoolExecutor Context リクエストスコープの値と取り消し ThreadLocal, 取り消し可能なFuture 関連リンク: Goの並行処理パターン ▶ 41

Slide 42

Slide 42 text

11. パフォーマンスチューニング 42

Slide 43

Slide 43 text

メモリ最適化 用語 Goにおける説明 Javaでいうと 構造体のフィールド順序 メモリアライメントを考慮 @Contended アノテーション sync.Pool オブジェクトの再利用 オブジェクトプール スライスの事前割り当て make([]T, 0, capacity) ArrayList のキャパシティ指定 関連リンク: Goのメモリ最適化テクニック ▶ 43

Slide 44

Slide 44 text

並行処理の最適化 用語 Goにおける説明 Javaでいうと GoMAXPROCS 使用するCPU数の制御 Runtime.getRuntime().availableProcessors() Goroutine の適切な利用 軽量なため多用可能 スレッドプールの適切なサイジング チャネルのバッファリング バッファ付きチャネル BlockingQueue のキャパシティ指定 関連リンク: Goの並行処理のパフォーマンスチューニング ▶ 44

Slide 45

Slide 45 text

プロファイリングとベンチマーク 用語 Goにおける説明 Javaでいうと Go test -bench ベンチマークテスト JMH (Java Microbenchmark Harness) pprof CPUとメモリのプロファイリング Java Flight Recorder, VisualVM trace 実行トレース Java Flight Recorder 関連リンク: Goのプロファイリングとトレーシング ▶ 45

Slide 46

Slide 46 text

12. セキュリティ 46

Slide 47

Slide 47 text

暗号化 用語 Goにおける説明 Javaでいうと crypto パッケージ 暗号化アルゴリズムの実装 java.security, javax.crypto パッケージ crypto/tls TLS接続の実装 javax.net.ssl パッケージ crypto/rand 暗号学的に安全な乱数生成 java.security.SecureRandom 関連リンク: Goの暗号化パッケージ ▶ 47

Slide 48

Slide 48 text

認証・認可 用語 Goにおける説明 Javaでいうと JWT-Go JSONウェブトークンの実装 JJWT (Java JWT) oauth2 パッケージ OAuth 2.0クライアントの実装 Spring Security OAuth bcrypt パスワードハッシュ化 Spring Security の BCryptPasswordEncoder 関連リンク: JWT-Goライブラリ ▶ 48

Slide 49

Slide 49 text

13. ネットワーキング 49

Slide 50

Slide 50 text

HTTP処理 用語 Goにおける説明 Javaでいうと net/http パッケージ HTTPクライアント/サーバーの実装 java.net.HttpURLConnection, Servlets http.Handler インターフェース HTTPリクエストハンドラ Servlet http.Client HTTPクライアント java.net.http.HttpClient (Java 11+) 関連リンク: Goのnet/httpパッケージ ▶ 50

Slide 51

Slide 51 text

ソケットプログラミング 用語 Goにおける説明 Javaでいうと net.Dial ネットワーク接続の確立 Socket net.Listen ネットワークリスナーの作成 ServerSocket net.Conn インターフェース ネットワーク接続の抽象化 Socket 関連リンク: Goのnetパッケージ ▶ 51

Slide 52

Slide 52 text

14. システム連携 52

Slide 53

Slide 53 text

データシリアライゼーション 用語 Goにおける説明 Javaでいうと encoding/json JSON処理 Jackson, Gson encoding/xml XML処理 JAXB encoding/Gob Goバイナリ形式 Java Serialization protobuf Protocol Buffersの実装 Protocol Buffers for Java 関連リンク: Goのencoding/jsonパッケージ ▶ 53

Slide 54

Slide 54 text

メッセージングシステム 用語 Goにおける説明 Javaでいうと Go-redis Redisクライアント Jedis, Lettuce sarama Apache Kafkaクライアント Apache Kafka Clients amqp RabbitMQクライアント Spring AMQP 関連リンク: Go-redisライブラリ ▶ 54

Slide 55

Slide 55 text

15. テスト 55

Slide 56

Slide 56 text

ユニットテスト 用語 Goにおける説明 Javaでいうと testing パッケージ 標準テストフレームワーク JUnit testify アサーションライブラリ AssertJ Go-cmp 深い比較 EqualsBuilder (Apache Commons) 関連リンク: Goのtestingパッケージ ▶ 56

Slide 57

Slide 57 text

モック 用語 Goにおける説明 Javaでいうと Gomock モックオブジェクト生成 Mockito httptest パッケージ HTTPテスト用ユーティリティ MockMvc (Spring Test) 関連リンク: Gomockライブラリ ▶ 57

Slide 58

Slide 58 text

ベンチマークとプロファイリング 用語 Goにおける説明 Javaでいうと testing.B ベンチマークテスト JMH (Java Microbenchmark Harness) pprof プロファイリングツール Java Flight Recorder, YourKit 関連リンク: Goのベンチマークテスト ▶ 58

Slide 59

Slide 59 text

16. クラウドネイティブ開発 59

Slide 60

Slide 60 text

コンテナ化 用語 Goにおける説明 Javaでいうと 軽量バイナリ シングルバイナリでデプロイ可能 Fat JAR, Spring Boot Executable JAR scratch イメージ 最小限のDockerイメージ JRE-alpine イメージ 関連リンク: GoアプリケーションのDockerfile最適化 ▶ 60

Slide 61

Slide 61 text

マイクロサービス 用語 Goにおける説明 Javaでいうと Go-micro マイクロサービスフレームワーク Spring Boot, Micronaut Go-kit マイクロサービスツールキット Spring Cloud consul-api サービスディスカバリ (Consul) Spring Cloud Consul 関連リンク: Go-microフレームワーク ▶ 61

Slide 62

Slide 62 text

クラウドサービス連携 用語 Goにおける説明 Javaでいうと aws-sdk-Go AWS SDK AWS SDK for Java Google-cloud-Go Google Cloud SDK Google Cloud Java azure-sdk-for-Go Azure SDK Azure SDK for Java 関連リンク: AWS SDK for Go ▶ 62

Slide 63

Slide 63 text

17. エコシステムと実行環境 63

Slide 64

Slide 64 text

パッケージマネージャ 用語 Goにおける説明 Javaでいうと Go get 依存関係のダウンロードとインストール Maven, Gradle Go mod モジュール管理システム Maven, Gradle dep (非推奨) 以前の依存関係管理ツール Apache Ivy 関連リンク: Go Modulesの使い方 ▶ 64

Slide 65

Slide 65 text

コミュニティとリソース 用語 Goにおける説明 Javaでいうと Go Playground オンラインコード実行環境 JDoodle Awesome Go Goリソースのキュレーションリスト Awesome Java Go Forum 公式ディスカッションフォーラム Stack Overflow, Reddit r/java 関連リンク: Go Playground ▶ 65

Slide 66

Slide 66 text

人気のあるフレームワークとライブラリ 用語 Goにおける説明 Javaでいうと gin Webフレームワーク Spring Boot Gorm ORM Hibernate cobra CLIアプリケーションフレームワーク picocli viper 設定管理 Spring Boot Externalized Configuration 関連リンク: Gin Web Framework ▶ 66

Slide 67

Slide 67 text

18. 言語の設計方針 67

Slide 68

Slide 68 text

設計原則 観点 Go Java 設計思想 シンプルさと実用性重視 汎用性と堅牢性重視 コード スタイル 強制的なフォーマット(Go fmt) コーディング規約はあるが強制ではない エラー処理 明示的なエラー返却 例外機構 並行処理モデル CSP(Communicating Sequential Processes) 共有メモリとロック 型システム 構造的型付け 名前的型付け メモリ管理 ガベージコレクション(シンプルで予測可能) ガベージコレクション(複雑で高度) 関連リンク: Goの設計哲学 ▶ 68

Slide 69

Slide 69 text

型システムと総称型 機能 Go Java 総称型 1.18以降でサポート(シンプルな実装) 完全サポート(複雑な実装) 型推論 広範囲(var キーワード、:= 演算子) 限定的(var キーワード、ラムダ式) null安全性 ポインタ型のみnilable Optional型の使用推奨 共変性・反変性 未サポート ワイルドカード(? extends, ? super)でサポート 関連リンク: Goのジェネリクス入門 ▶ 69

Slide 70

Slide 70 text

並行処理と並列処理 機能 Go Java 基本単位 Goroutine(軽量) Thread(比較的重い) 通信手段 channel 共有メモリ、java.util.concurrent 同期プリミティブ sync パッケージ synchronized、java.util.concurrent 並列処理 GoMAXPROCS ForkJoinPool、ParallelStream 関連リンク: Goの並行処理モデル ▶ 70

Slide 71

Slide 71 text

メモリ管理とパフォーマンス 機能 Go Java メモリモデル 値型とポインタ型 すべてがオブジェクト(プリミティブ型を除く) GCアルゴリズム 並行トライカラーマーク&スイープ 複数のアルゴリズム(G1GC、ZGC等) メモリ割り当て スタックとヒープ(エスケープ解析) 主にヒープ(JITによる最適化) パフォーマンスチューニング GoGC、GC Trace JVM引数、GCログ解析 関連リンク: Goのメモリモデル ▶ 71

Slide 72

Slide 72 text

まとめ 72

Slide 73

Slide 73 text

Goの特徴 Javaの特徴 1. シンプルで読みやすい構文 2. 高速なコンパイルと実行 3. 組み込みの並行処理サポート 4. 強力な標準ライブラリ 1. プラットフォーム非依存性(Write Once, Run Anywhere) 2. 豊富なエコシステムと長年の実績 3. 堅牢なオブジェクト指向プログラミングサポート 4. 大規模エンタープライズアプリケーションでの実績 73

Slide 74

Slide 74 text

まとめ 両言語の違いを理解し、それぞれの強みを活かすことが重要 ▶ Goは並行処理やマイクロサービス、クラウドネイティブアプリケーションの開発で強み ▶ Javaは大規模で複雑なエンタープライズアプリケーションや長期的なメンテナンスが必要なシステムで優れている ▶ 関連リンク: ▶ Go言語公式ドキュメント - Java言語公式ドキュメント - 74