Sekatan Penukaran Jenis dalam Go
Go menguatkuasakan peraturan menaip yang ketat, yang boleh menghalang penukaran yang kelihatan jelas antara kepingan jenis berbeza yang mengandungi asas yang sama elemen. Sekatan ini jelas dalam kod berikut:
package main import "fmt" type Card string type Hand []Card func NewHand(cards []Card) Hand { hand := Hand(cards) return hand } func main() { value := []string{"a", "b", "c"} firstHand := NewHand(value) fmt.Println(firstHand) }
Walaupun terdapat persamaan antara []rentetan dan []Kad, pengkompil melaporkan ralat:
cannot use value (type []string) as type []Card in argument to NewHand
Rasional
Spesifikasi Go melarang penukaran ini untuk mengelakkan penukaran jenis tidak sengaja antara jenis yang tidak berkaitan yang secara kebetulan berkongsi struktur yang sama.
Penyelesaian
value := []string{"a", "b", "c"} cards := *(*[]Card)(unsafe.Pointer(&value)) firstHand := NewHand(cards)
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menukar Secara Terus Antara Kepingan Pelbagai Jenis dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!