Di Go, jika Anda mendefinisikan tipe baru misalnya:
type MyInt int
Anda tidak dapat meneruskan a MyInt
ke fungsi yang mengharapkan int, atau sebaliknya:
func test(i MyInt) {
//do something with i
}
func main() {
anInt := 0
test(anInt) //doesn't work, int is not of type MyInt
}
Baik. Tetapi mengapa hal yang sama tidak berlaku untuk fungsi? misalnya:
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
}
Sekarang, saya tidak mengeluh karena saya tidak perlu melakukan cast newfunc
untuk mengetik MyFunc
, seperti yang harus saya lakukan di contoh pertama; sepertinya tidak konsisten. Saya yakin ada alasan bagus untuk itu; Adakah yang bisa mencerahkan saya?
Alasan saya bertanya terutama karena saya ingin mempersingkat beberapa jenis fungsi saya yang agak panjang dengan cara ini, tetapi saya ingin memastikan hal ini diharapkan dan dapat diterima untuk dilakukan :)
type
lebih berguna di Go daripada Scala. Scala hanya memiliki alias tipe, sayangnya.Jawaban:
Ternyata, ini adalah kesalahpahaman yang saya miliki tentang bagaimana Go menangani tipe, yang dapat diselesaikan dengan membaca bagian spesifikasi yang relevan:
http://golang.org/ref/spec#Type_identity
Perbedaan relevan yang tidak saya sadari adalah perbedaan tipe bernama dan tidak disebutkan .
Tipe yang diberi nama adalah tipe dengan nama, seperti int, int64, float, string, bool. Selain itu, tipe apa pun yang Anda buat menggunakan 'tipe' adalah tipe bernama.
Jenis yang tidak disebutkan namanya adalah seperti [] string, peta [string] string, [4] int. Mereka tidak memiliki nama, hanya deskripsi yang sesuai dengan bagaimana mereka akan disusun.
Jika Anda membandingkan dua jenis bernama, nama tersebut harus cocok agar dapat dipertukarkan. Jika Anda membandingkan tipe bernama dan tipe tanpa nama, selama representasi yang mendasarinya cocok , Anda siap melakukannya!
misalnya diberi tipe berikut:
berikut ini tidak valid:
berikut ini baik-baik saja:
Saya agak kecewa karena saya tidak mengetahuinya lebih awal, jadi saya harap hal itu menjelaskan jenis burung itu sedikit untuk orang lain! Dan berarti casting jauh lebih sedikit daripada yang saya pikirkan sebelumnya :)
sumber
is := make(MySlice, 0); m := make(MyMap)
, yang lebih mudah dibaca dalam beberapa konteks.Baik pertanyaan maupun jawabannya cukup mencerahkan. Namun, saya ingin mengemukakan perbedaan yang tidak jelas dalam jawaban lytnus.
Jenis Bernama berbeda dari Jenis Tanpa Nama .
Variabel Jenis Bernama dapat dialihkan ke variabel Jenis Tanpa Nama , sebaliknya.
Variabel dari Jenis Bernama yang berbeda tidak dapat ditetapkan satu sama lain.
http://play.golang.org/p/uaYHEnofT9
sumber