Slide 1

Slide 1 text

Go:Java対応チートシート Java開発者が読み解くGOプログラム 1

Slide 2

Slide 2 text

はじめに このチートシートの目的: 想定読者: JavaとGOの共通言語を整理 ▶ 「GOのこの機能はJavaでいうとこれだよね」という対応関係を説明 ▶ Java開発者がGOコードを理解しやすくする ▶ Javaの実務経験があり、GOの現場にアサインされた方 ▶ JavaもGOも扱う現場担当者 ▶ クロスプラットフォーム開発に興味がある方 ▶ 2

Slide 3

Slide 3 text

目次 1. 基本構造とパッケージ 2. 変数宣言 3. 関数定義 4. クラスとメソッド 5. インターフェース 6. エラー処理 7. ゴルーチン(並行処理) 8. チャネル(通信) 9. まとめ 3

Slide 4

Slide 4 text

1. 基本構造とパッケージ Java: package com.example; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { List list = new ArrayList<>(); list.add("Hello, World!"); System.out.println(list.get(0)); } } GO: package main import ( "fmt" "container/list" ) func main() { l := list.New() l.PushBack("Hello, World!") fmt.Println(l.Front().Value) } GOには public キーワードがなく、大文字で始まる名前が公開 ▶ GOの package main はJavaの public static void main に相当 ▶ GOのインポート文はグループ化可能 ▶ 4

Slide 5

Slide 5 text

2. 変数宣言 Java: int x = 5; final int Y = 10; String name = "Alice"; List numbers = new ArrayList<>(); GO: var x int = 5 y := 5 // 型推論 const Y = 10 name := "Alice" numbers := make([]int, 0) GOは := で型推論による変数宣言が可能 ▶ GOの const はJavaの final に相当 ▶ GOのスライス( []int )はJavaのListに類似 ▶ 5

Slide 6

Slide 6 text

3. 関数定義 Java: public int add(int a, int b) { return a + b; } public void greet(String name) { System.out.println("Hello, " + name); } GO: func add(a, b int) int { return a + b } func greet(name string) { fmt.Println("Hello,", name) } GOは戻り値の型を関数名の後に記述 ▶ GOは同じ型の引数をまとめて型を記述可能 ▶ GOは複数の戻り値を持つことが可能(例: func divide(a, b int) (int, error) ) ▶ 6

Slide 7

Slide 7 text

4. クラスとメソッド (1/2) Java: public class Rectangle { private int width, height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public int area() { return width * height; } public void resize(int factor) { width *= factor; height *= factor; } } 7

Slide 8

Slide 8 text

4. クラスとメソッド (2/2) GO: type Rectangle struct { width, height int } func NewRectangle(width, height int) *Rectangle { return &Rectangle{width: width, height: height} } func (r Rectangle) area() int { return r.width * r.height } func (r *Rectangle) resize(factor int) { r.width *= factor r.height *= factor } // 使用例 rect := NewRectangle(10, 5) GOにはクラスがなく、代わりに構造体( struct )とメソッドを使用 ▶ GOのメソッドは構造体の外部で定義され、レシーバを指定 ▶ GOではポインタレシーバ( *Rectangle )を使用して構造体を変更可能 ▶ 8

Slide 9

Slide 9 text

5. インターフェース Java: public interface Shape { double area(); void resize(double factor); } public class Circle implements Shape { private double radius; @Override public double area() { return Math.PI * radius * radius; } GO: type Shape interface { area() float64 resize(factor float64) } type Circle struct { radius float64 } func (c Circle) area() float64 { return math Pi * c radius * c radius GOのインターフェースは暗黙的に実装( implements キーワードなし) ▶ 構造体がインターフェースのメソッドを持つだけで実装とみなされる ▶ GOのインターフェースはより柔軟で、小さなインターフェースの組み合わせが推奨される ▶ 9

Slide 10

Slide 10 text

6. エラー処理 Java: try { int result = dangerousOperation(); System.out.println("Result: " + result); } catch (Exception e) { System.err.println("エラー: " + e.getMessage()); } finally { cleanup(); } GO: result, err := dangerousOperation() if err != nil { fmt.Println("エラー:", err) return } fmt.Println("Result:", result) defer cleanup() GOは例外ではなく、エラー値を返す方式を採用 ▶ if err != nil はGOでよく見るエラーチェックパターン ▶ GOの defer はJavaの finally に似た役割を果たす ▶ 10

Slide 11

Slide 11 text

7. ゴルーチン(並行処理) Java: ExecutorService executor = Executors.newFixedThreadPool(4); executor.submit(() -> { System.out.println("Task running in thread: " + Thread.currentThread().getName()); }); executor.shutdown(); GO: func worker(id int) { fmt.Printf("Task running in goroutine: %d\n", id) } func main() { for i := 0; i < 4; i++ { go worker(i) } time.Sleep(time.Second) } GOの go キーワードはJavaの new Thread().start() に相当 ▶ GOのゴルーチンはJavaのスレッドよりも軽量で、数千〜数万のゴルーチンを同時に実行可能 ▶ GOには組み込みのスレッドプールがあり、ゴルーチンを効率的にスケジューリング ▶ 11

Slide 12

Slide 12 text

8. チャネル(通信) Java( BlockingQueue を使用): BlockingQueue queue = new LinkedBlockingQueue<>(); new Thread(() -> { try { queue.put("メッセージ"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); try { String message = queue.take(); System.out.println(message); } catch (InterruptedException e) { e.printStackTrace(); } GO: ch := make(chan string) go func() { ch <- "メッセージ" // 送信 }() message := <-ch // 受信 fmt.Println(message) GOのチャネルはJavaの BlockingQueue に近い概念 ▶ チャネルはゴルーチン間の通信と同期に使用 ▶ GOのチャネルは型安全で、バッファリングも可能( make(chan string, 10) ) ▶ 12

Slide 13

Slide 13 text

まとめ 両言語の特徴を理解することで、プロジェクトに応じて適切な選択が可能になります。 GOはJavaよりもシンプルな構文を持つ ▶ 並行処理やエラー処理に独自のアプローチを採用 ▶ GOはコンパイル速度が速く、静的型付け言語でありながら動的言語のような柔軟性を持つ ▶ メモリ管理が自動化されており、ガベージコレクションを持つ ▶ クロスプラットフォーム開発に適しており、シングルバイナリにコンパイル可能 ▶ 13