Lời nói đầu: Không cần bàn cãi rằngif else
là cách để đi, chúng ta vẫn có thể chơi và tìm thấy niềm vui trong các cấu trúc kích hoạt ngôn ngữ.
Cấu If
trúc sau đây có sẵn trong github.com/icza/gox
thư viện của tôi với nhiều phương thức khác, là builtinx.If
kiểu.
Go cho phép đính kèm các phương thức vào bất kỳ loại do người dùng xác định , bao gồm các kiểu nguyên thủy như bool
. Chúng ta có thể tạo một loại tùy chỉnh có kiểu cơ bảnbool
của nó và sau đó với một chuyển đổi loại đơn giản với điều kiện, chúng ta có quyền truy cập vào các phương thức của nó. Các phương thức nhận và chọn từ các toán hạng.
Một cái gì đó như thế này:
type If bool
func (c If) Int(a, b int) int {
if c {
return a
}
return b
}
Làm thế nào chúng ta có thể sử dụng nó?
i := If(condition).Int(val1, val2) // Short variable declaration, i is of type int
|-----------| \
type conversion \---method call
Ví dụ: một ternary làm max()
:
i := If(a > b).Int(a, b)
Một ternary làm abs()
:
i := If(a >= 0).Int(a, -a)
Điều này có vẻ mát mẻ, nó đơn giản, thanh lịch và hiệu quả (nó cũng đủ điều kiện để nội tuyến ).
Một nhược điểm so với toán tử ternary "thực": nó luôn đánh giá tất cả các toán hạng.
Để đạt được đánh giá hoãn lại và chỉ khi cần thiết, tùy chọn duy nhất là sử dụng các hàm (có thể là hàm hoặc phương thức được khai báo hoặc bằng chữ ), chỉ được gọi khi / nếu cần:
func (c If) Fint(fa, fb func() int) int {
if c {
return fa()
}
return fb()
}
Sử dụng nó: Giả sử chúng ta có các hàm này để tính toán a
và b
:
func calca() int { return 3 }
func calcb() int { return 4 }
Sau đó:
i := If(someCondition).Fint(calca, calcb)
Ví dụ: điều kiện là năm hiện tại> 2020:
i := If(time.Now().Year() > 2020).Fint(calca, calcb)
Nếu chúng ta muốn sử dụng hàm chữ:
i := If(time.Now().Year() > 2020).Fint(
func() int { return 3 },
func() int { return 4 },
)
Lưu ý cuối cùng: nếu bạn có các chức năng với các chữ ký khác nhau, bạn không thể sử dụng chúng ở đây. Trong trường hợp đó, bạn có thể sử dụng một chức năng bằng chữ với chữ ký phù hợp để làm cho chúng vẫn có thể áp dụng được.
Ví dụ: nếu calca()
và calcb()
cũng sẽ có các tham số (bên cạnh giá trị trả về):
func calca2(x int) int { return 3 }
func calcb2(x int) int { return 4 }
Đây là cách bạn có thể sử dụng chúng:
i := If(time.Now().Year() > 2020).Fint(
func() int { return calca2(0) },
func() int { return calcb2(0) },
)
Hãy thử những ví dụ trên Sân chơi Go .