ใน Go หากคุณกำหนดประเภทใหม่เช่น:
type MyInt int
จากนั้นคุณไม่สามารถส่งผ่านMyInt
ไปยังฟังก์ชันที่คาดหวังว่าจะเป็น int หรือในทางกลับกัน:
func test(i MyInt) {
//do something with i
}
func main() {
anInt := 0
test(anInt) //doesn't work, int is not of type MyInt
}
ละเอียด. แต่เหตุใดจึงใช้ฟังก์ชันเดียวกันนี้ไม่ได้ เช่น:
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
}
ตอนนี้ฉันไม่ได้บ่นเพราะมันช่วยให้ฉันไม่ต้องแคสต์อย่างชัดเจนnewfunc
เพื่อพิมพ์MyFunc
อย่างที่ฉันต้องทำในตัวอย่างแรก ดูเหมือนว่าไม่สอดคล้องกัน ฉันแน่ใจว่ามีเหตุผลที่ดีสำหรับมัน ใครช่วยสอนฉันได้ไหม
เหตุผลที่ฉันถามส่วนใหญ่เป็นเพราะฉันต้องการย่อประเภทฟังก์ชันที่ค่อนข้างยาวของฉันให้สั้นลงด้วยวิธีนี้ แต่ฉันต้องการให้แน่ใจว่ามันคาดหวังและยอมรับได้ในการทำสิ่งนี้ :)
type
ค่อนข้างมีประโยชน์ใน Go มากกว่า Scala Scala เพียงมีนามแฝงประเภทอนิจจา