Trong Go, nếu bạn xác định một kiểu mới, ví dụ:
type MyInt int
Sau đó, bạn không thể chuyển một hàm MyInt
cho một hàm mong đợi một số nguyên, hoặc ngược lại:
func test(i MyInt) {
//do something with i
}
func main() {
anInt := 0
test(anInt) //doesn't work, int is not of type MyInt
}
Khỏe. Nhưng tại sao điều tương tự không áp dụng cho các hàm? ví dụ:
type MyFunc func(i int)
func (m MyFunc) Run(i int) {
m(i)
}
func run(f MyFunc, i int) {
f.Run(i)
}
func main() {
var newfunc func(int) //explicit declaration
newfunc = func(i int) {
fmt.Println(i)
}
run(newfunc, 10) //works just fine, even though types seem to differ
}
Bây giờ, tôi không phàn nàn vì nó giúp tôi không phải ép kiểu rõ ràng newfunc
để nhập MyFunc
, như tôi sẽ phải làm trong ví dụ đầu tiên; nó chỉ có vẻ không nhất quán. Tôi chắc rằng có một lý do chính đáng cho nó; bất cứ ai có thể khai sáng cho tôi?
Lý do tôi hỏi chủ yếu là vì tôi muốn rút ngắn một số loại hàm khá dài của mình theo cách này, nhưng tôi muốn đảm bảo rằng nó được mong đợi và chấp nhận được để làm điều này :)
type
khá hữu ích trong cờ vây hơn là Scala. Scala chỉ có bí danh loại, than ôi.