Go (Golang) และ Java เป็นภาษาโปรแกรมมิ่งที่โดดเด่นใน backend development แต่มีแนวคิดและการออกแบบที่ต่างกันอย่างมาก
ภาพรวม
| ด้าน |
Go |
Java |
| Paradigm |
Procedural + Concurrent (CSP) |
Object-Oriented + Functional (multi-paradigm) |
| Type System |
Static, Strong, Type Inference |
Static, Strong, Explicit types |
| Compilation |
Compiled to native binary |
Compiled to bytecode → JVM |
| Runtime |
No VM (static binary) |
JVM (HotSpot, OpenJ9, GraalVM) |
| Memory Management |
Garbage Collector (low latency) |
Garbage Collector (generational, tunable) |
| Concurrency |
Goroutines + Channels (CSP) |
Threads + Locks + java.util.concurrent |
| Error Handling |
Explicit error values (no exceptions) |
Checked/Unchecked Exceptions |
| Generics |
มีตั้งแต่ Go 1.18 (2022) |
มีตั้งแต่ Java 5 (2004) |
ตารางเปรียบเทียบรายละเอียด
| ลำดับ |
หัวข้อ |
Go |
Java |
| 1 |
Type System |
Procedural, structural typing (interfaces implicit) |
Object-oriented, nominal typing (implements keyword) |
| 2 |
Class/Struct |
มี struct ไม่มี class, ไม่มี constructor, ไม่มี inheritance |
มี class, constructor, inheritance (extends), abstract class |
| 3 |
Error Handling |
Return error values: val, err := fn(), if err != nil |
try-catch-finally, throws, checked/unchecked exceptions |
| 4 |
Inheritance |
ไม่มี - ใช้ Composition + Interface Embedding |
มี - single inheritance (extends), multiple interfaces |
| 5 |
Implicit Conversion |
ไม่มี - ต้อง cast อย่างชัดเจน |
มี - widening primitive conversion, boxing/unboxing |
| 6 |
Function Overloading |
ไม่มี - ใช้ชื่อฟังก์ชันต่างกัน หรือ variadic params |
มี - method overloading |
| 7 |
Generics |
มี (Go 1.18+), type parameters บน functions/types |
มี (Java 5+), type erasure, bounded wildcards |
| 8 |
Concurrency Model |
Goroutines (lightweight), Channels (CSP), select |
Threads (heavyweight), ExecutorService, CompletableFuture, Virtual Threads (Java 21+) |
| 9 |
Channels |
First-class citizen: chan T, buffered/unbuffered |
ไม่มี built-in (ใช้ BlockingQueue, channels ใน library) |
| 10 |
Loop Constructs |
มีแค่ for (while, do-while, range ทั้งหมด) |
for, while, do-while, for-each, streams |
| 11 |
Binary Size |
Compact (~5-15 MB static binary) |
ต้องการ JRE/JDK (~50-100MB+), native-image (GraalVM) ได้แต่ซับซ้อน |
| 12 |
Thread/Goroutine Cost |
~2KB stack, เริ่มต้นเร็ว, รองรับล้านๆ |
~1MB stack (platform thread), Virtual threads (Java 21) ~1KB |
| 13 |
Package Management |
td>Go Modules (go.mod), vendoring
Maven/Gradle, pom.xml/build.gradle, repositories |
| 14 |
Build Speed |
非常快 (seconds) |
ช้ากว่า (minutes สำหรับโปรเจกต์ใหญ่) |
| 15 |
Deployment |
Single binary, cross-compile ง่าย (GOOS/GOARCH) |
JAR/WAR + JRE, หรือ Docker, jlink custom runtime |
ตัวอย่างโค้ดเปรียบเทียบ
Hello World
// Go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
// Java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Concurrency: Hello World
// Go - Goroutine + Channel
package main
import (
"fmt"
"time"
)
func worker(id int, ch chan<- string) {
time.Sleep(time.Second)
ch <- fmt.Sprintf("Worker %d done", id)
}
func main() {
ch := make(chan string, 3)
for i := 1; i <= 3; i++ {
go worker(i, ch)
}
for i := 1; i <= 3; i++ {
fmt.Println(<-ch)
}
}
// Java - Thread + ExecutorService (Traditional)
import java.util.concurrent.*;
public class ConcurrencyDemo {
public static void main(String[] args) throws Exception {
ExecutorService es = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 3; i++) {
final int id = i;
es.submit(() -> {
Thread.sleep(1000);
System.out.println("Worker " + id + " done");
});
}
es.shutdown();
es.awaitTermination(1, TimeUnit.MINUTES);
}
}
// Java 21+ - Virtual Threads (Lightweight like Goroutines)
Thread.startVirtualThread(() -> {
Thread.sleep(1000);
System.out.println("Virtual thread done");
});
Error Handling
// Go - Explicit error handling
func readFile(path string) (string, error) {
data, err := os.ReadFile(path)
if err != nil {
return "", fmt.Errorf("read %s: %w", path, err)
}
return string(data), nil
}
// Usage
content, err := readFile("config.json")
if err != nil {
log.Fatal(err)
}
// Java - Exceptions
public String readFile(String path) throws IOException {
return Files.readString(Paths.get(path));
}
// Usage
try {
String content = readFile("config.json");
} catch (IOException e) {
log.error("Failed to read", e);
throw new RuntimeException(e);
}
เมื่อไหร่ควรเลือก Go?
- Microservices, Cloud-native, Kubernetes tooling
- High-throughput network services (API gateways, proxies)
- CLI tools, DevOps tools (Docker, Kubernetes, Terraform, Prometheus เขียนเป็น Go)
- ต้องการ binary เดียว deploy ง่าย, startup เร็ว, memory ใช้น้อย
- ทีมชอบ simplicity, explicit code, ไม่ชอบ magic/annotation
เมื่อไหร่ควรเลือก Java?
- Enterprise applications, Large-scale systems
- Complex domain logic ที่ได้ประโยชน์จาก OOP, DI, AOP
- Ecosystem สำเร็จรูป: Spring Boot, Hibernate, Kafka, Elasticsearch clients
- Team มี Java expertise อยู่แล้ว, Legacy systems
- Long-running processes, Batch processing, Big Data (Spark, Flink)
- ต้องการ mature tooling: IDE (IntelliJ), Profilers, Debuggers, APM
Trend 2024+
- Java 21 (LTS): Virtual Threads (Project Loom), Pattern Matching, Record Patterns, String Templates - ลดช่องว่างกับ Go มาก
- Go 1.22+: Range over functions, improved tooling, WASM support
- Polyglot: หลายองค์กรใช้ทั้งคู่ - Java สำหรับ business logic, Go สำหรับ infrastructure/sidecars