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

GO言語-Java対応チートシート-実装編-

ymgc
October 02, 2024

 GO言語-Java対応チートシート-実装編-

ymgc

October 02, 2024
Tweet

More Decks by ymgc

Other Decks in Programming

Transcript

  1. 目次 1. 基本構造とパッケージ 2. 変数宣言 3. 関数定義 4. クラスとメソッド 5.

    インターフェース 6. エラー処理 7. ゴルーチン(並行処理) 8. チャネル(通信) 9. まとめ 3
  2. 1. 基本構造とパッケージ Java: package com.example; import java.util.List; import java.util.ArrayList; public

    class Main { public static void main(String[] args) { List<String> 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
  3. 2. 変数宣言 Java: int x = 5; final int Y

    = 10; String name = "Alice"; List<Integer> 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 8. チャネル(通信) Java( BlockingQueue を使用): BlockingQueue<String> 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