Ngôn ngữ lập trình Go
Đại học Sydney
23 tháng 3, 2010
Hello, world 2.0
package main
import (
"fmt"
"http"
)
func handler(c *http.Conn, r *http.Request) {
fmt.Fprintf(c, "Hello, %s.", r.URL.Path[1:])
}
func main() {
http.ListenAndServe(":8080",
http.HandlerFunc(handler))
}
Đồng thời
Bắt đầu luồng điều khiển mới bằng từ khóa go
Tính toán song song rất dễ dàng:
func main() {
go expensiveComputation(x, y, z)
anotherExpensiveComputation(a, b, c)
}
Về cơ bản, goroutine giống một thread nhưng nhẹ hơn:
- Goroutine có stack phân đoạn, và thường có stack nhỏ hơn
- Điều này đòi hỏi hỗ trợ của trình biên dịch. Goroutine không thể chỉ là thư viện C++ trên nền thư viện thread
Đồng thời
Hãy xem lại phép tính song song đơn giản của chúng ta:
func main() {
go expensiveComputation(x, y, z)
anotherExpensiveComputation(a, b, c)
}
Câu chuyện này chưa đầy đủ:
- Làm sao chúng ta biết hai phép tính đã xong?
- Giá trị của chúng là gì?
Đồng thời
Goroutine giao tiếp với nhau qua channel
func computeAndSend(ch chan int, x, y, z int) {
ch <- expensiveComputation(x, y, z)
}
func main() {
ch := make(chan int)
go computeAndSend(ch, x, y, z)
v2 := anotherExpensiveComputation(a, b, c)
v1 := <-ch
fmt.Println(v1, v2)
}
Ngôn ngữ hệ thống
Thu gom rác có tiếng là "chậm hơn"
Chúng tôi kỳ vọng Go sẽ chậm hơn C được tối ưu một chút, nhưng nhanh hơn Java tùy theo tác vụ. Tuy nhiên:
- Nhanh và có lỗi tệ hơn gần như nhanh và đúng
- Tối ưu hóa một chương trình đúng dễ hơn sửa một chương trình đã tối ưu
- Về cơ bản, đây chỉ là sự đánh đổi chúng tôi sẵn lòng thực hiện
Bố cục bộ nhớ có thể ảnh hưởng lớn đến hiệu năng. Hai thiết kế này tương đương trong Go, nhưng khác biệt đáng kể trong Java:
type Point struct { X, Y int }
type Rect struct { P0, P1 Point }
// or ...
type Rect struct { X0, Y0, X1, Y1 int }