Go最重要的特性是invisible - Jack

banq發表於2022-02-04

當被問及 Go 最重要的特性時,許多人會談論 Go 的簡單性、C 互操作性、編譯速度等。

然而,Go 的最佳特性是在同步介面中編寫非同步程式碼的能力。

作者給出了一個在 Go 與 Java 中發出的 HTTP 請求的示例,以展示 Go 如何非常有效地排程工作。

 

Go程式碼:

package main

import (
  "fmt"
  "log"
  "net/http"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
    fmt.Fprintln(w, "Goodbye, World!")
  })
  log.Fatal(http.ListenAndServe(":8080", nil))
}

上述Go 標準執行時允許非同步編碼,同時允許開發人員使用簡單的同步介面。但由於它是標準 Go 執行時的一部分,因此它是不可見的invisible 。

為了更好地突出該特性,讓我們看一個用 Java 編寫的類似程式碼的示例。

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class HelloWorld {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange t) throws IOException {
            String response = "Goodbye, World!";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }

}

為了使這個程式碼和 Go 程式碼一樣好,你需要做很多額外的工作。

我正在談論的特性是阻塞 goroutine 的 Go 執行時處理。當我第一次開始使用 Go 時,我認為 goroutines 是 Java 的綠色執行緒上更有效的變體,但是當我編寫看起來像傳統阻塞 I/O 的程式碼時,它從未意識到它實際上更類似於非同步 I/O . 很明顯,在進行阻塞呼叫時,Go 能夠更有效地安排工作。要從 Java 中獲得這種效能,您需要新增執行緒池、future或其他一些非同步庫。

 

效能測試結果:Java 版本每秒達到約 21K 請求,而 Go 版本每秒達到約 36K 請求。

相關文章