Nếu nhắc đến var
là vấn đề chính của bạn, bạn có thể thả nó một cách dễ dàng, bằng cách thay đổi =
vào :=
, như thế này:
english := Greeting(func(name string) string {
return ("Hello, " + name);
})
Nhưng bạn thậm chí không phải bỏ chức năng của bạn vào Greeting
. Thông số kỹ thuật cho biết điều này về số function types:
Loại hàm biểu thị tập hợp tất cả các hàm có cùng thông số và loại kết quả.
Và đây về type identity:
Hai loại chức năng giống hệt nhau nếu họ có cùng một số thông số và giá trị kết quả, tương ứng với tham số và kết quả các loại giống hệt nhau, và một trong hai cả hai chức năng là variadic hay không Là. Thông số và tên kết quả không bắt buộc phải khớp.
Điều này có nghĩa là mỗi chức năng đều có loại chức năng riêng. Nếu hai hàm có cùng chữ ký (tham số và kiểu kết quả), chúng có chung một kiểu hàm. Bằng cách viết type Greeting func...
, bạn chỉ cần đặt tên cho một loại hàm cụ thể, không định nghĩa tên mới.
Vì vậy, các mã sau đây làm việc, và tôi hy vọng thể hiện đúng cách để làm việc với các loại chức năng trong Go:
package main
import "fmt"
type Greeting func(name string) string
func say(g Greeting, n string) { fmt.Println(g(n)) }
func french(name string) string { return "Bonjour, " + name }
func main() {
english := func(name string) string { return "Hello, " + name }
say(english, "ANisus")
say(french, "ANisus")
}
Chú ý rằng tôi cũng bỏ dấu chấm phẩy và dấu ngoặc đơn từ chức năng english
của bạn. Các nhà phát triển không sử dụng các dấu chấm câu này nếu họ không phải làm như vậy.
CẬP NHẬT: Bây giờ bạn đã cung cấp mã mẫu, tôi có thể hiểu rõ vấn đề.
Vì mục đích này, mã của bạn đủ tốt và không có nhiều cách khác để thực hiện. Nếu bạn thích, bạn có thể truyền ngay trước khi gọi phương thức:
english := func(name string) string { return "Hello, " + name }
Greeting(english).exclamation("ANisus")
Nhưng tôi không chắc đây là cải tiến. Tôi chỉ nói rằng những gì bạn muốn làm ở đó không có vẻ là những cách khác để viết mã.
Tức là, nếu chúng tôi không muốn thay đổi loại của bạn. Ý tôi là, toàn bộ ý tưởng gọi một phương thức trên một kiểu hàm có vẻ lạ một chút. Không phải là nó sai, nhưng một chút hiếm. Một cách khác để đạt được hiệu quả tương tự theo cách thông thường hơn là thông qua một kiểu cấu trúc và có một trường cho hàm.Một cái gì đó như thế này:
package main
import "fmt"
type Greeting struct {
say func(name string) string
}
func newGreeting(f func(string) string) *Greeting {
return &Greeting{say: f}
}
func (g *Greeting) exclamation(name string) string { return g.say(name) + "!" }
func main() {
english := &Greeting{say: func(name string) string {
return "Hello, " + name
}}
french := newGreeting(func(name string) string {
return "Bonjour, " + name
})
fmt.Println(english.exclamation("ANisus"))
fmt.Println(french.exclamation("ANisus"))
}
Đây english
và french
hiển thị hai cách khác nhau để mã hóa những điều tương tự. Một lần nữa, tôi không nói rằng đây là giải pháp tốt hơn, nhưng một cách thông thường hơn và linh hoạt hơn để đạt được hiệu quả tương tự.
Bạn không thể xóa 'var' vì bạn đang khai báo' english' làm biến toàn cầu. – Mostafa