Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah alasan di sebalik pendekatan "penegasan jenis" Go?

Apakah alasan di sebalik pendekatan "penegasan jenis" Go?

王林
王林ke hadapan
2024-02-06 08:12:07948semak imbas

Go 的“类型断言”方式背后的原因是什么?

Kandungan soalan

Saya cuba memahami hakikat bahawa penegasan jenis golang hanya digunakan pada pembolehubah yang ditakrifkan secara jelas sebagai jenis antara muka, bukan untuk jenis konkrit (iaitu "rentetan", "int32"), dsb... ).

Berikut ialah contoh kod pantas dan ringkas yang menggambarkan punca kekeliruan saya:

package main

import "fmt"

// here we define an interface type:
type Shape interface {
    DoubleSize() int32
}

// here we define a new type which is really just an int32:
type Rect int32

// here we make "Rect" type above comply with the "Shape" interface by implementing the methods of that interface
// and so, since the interfaces in Go are implemented implicitly, this should make the "Rect" type an implicit instance of the "Shape" interface
func (theShape Rect) DoubleSize() int32 {
    return int32(theShape) * 2
}

// this function expects its "someShape" parameter to be of "Shape" type (or "the type that quacks like "Shape" interface does))
func whateverFunction(someShape Shape) int32 {
    return someShape.DoubleSize()
}

func main() {
    var newRect = Rect(5)
    // ^^ if this is instead written as "var newRect Shape = Rect(5)" no error with type assertion happens down the line

    whateverFunction(newRect) // the function works just fine because "newRect" implicitly implements the "Shape" interface — the one that this function expects to receive.  

    // !! but type assertion doesn't work on "newRect"
    v, ok := newRect.(Shape) // error: invalid operation: newRect (variable of type Rect) is not an interface
    if !ok {
        fmt.Println("type assertion failed")
        return
    }
    fmt.Println("This is v:", v)
}
Seperti yang dicadangkan oleh tajuk soalan ini, saya tidak dapat memahami alasan di sebalik penegasan jenis pelaksanaan hanya untuk jenis antara muka dan menyemak sama ada nilai asas yang diberikan kepada pembolehubah yang secara eksplisit melaksanakan antara muka itu ialah nilai yang kami nyatakan secara dalaman".(t )" kaedah penegasan. Ini membuatkan saya fikir "penegasan jenis" adalah salah nama yang tidak disengajakan, bermakna ia digunakan untuk semua jenis tetapi tidak, hanya untuk jenis antara muka.

Maksud saya, pasti ada sebab di sebalik keputusan reka bentuk bahasa ini, dan saya fikir ia mungkin ada kaitan dengan cara idiomatik golang ditulis, tetapi walaupun saya telah melihat banyak sumber mengenai isu ini, mereka tidak pernah nyatakan mengapa.

Sebabnya masuk akal kepada saya ialah jika program go harus "lebih baik (saya andaikan, kerana definisi antara muka eksplisit adalah pilihan)" ditulis dengan semua pembolehubah mewakili beberapa antara muka (tingkah laku), oleh itu tentukan a Untuk tujuan kejelasan dan kebolehbacaan, eksplisit antara muka pada pembolehubah masuk akal.

Tetapi seperti yang saya nyatakan, saya tidak pernah melihat mana-mana sumber yang menerangkan secara khusus mengapa ciri "penegasan jenis" dilaksanakan secara berterusan, dan saya harap anda boleh membantu saya menyelesaikan kekeliruan ini.

-- kemas kini 1 - Menambah beberapa kandungan untuk menjelaskan soalan saya:

Saya rasa, soalan teras saya ialah tentang sebab (yang saya tidak faham) bahawa penegasan jenis hanya berfungsi apabila antara muka pembolehubah dilaksanakan secara eksplisit dan bukan apabila antara muka dilaksanakan secara tersirat.

Seperti yang ditunjukkan oleh "whateverfunction", kod mempertimbangkan "baru" untuk melaksanakan antara muka "bentuk", atau "menjadi pelaksanaan antara muka "bentuk"" (jika tidak, fungsi itu tidak akan digunakan untuk pembolehubah, tetapi ia ada ), tetapi kod di sebalik kaedah penegasan jenis ".(t)" tidak menganggap "newrect" sebagai pelaksanaan antara muka "bentuk".

Jadi, jika terdapat perbezaan dalam pertimbangan berkaitan pelaksanaan antara muka dalam golang, saya rasa mesti ada sebab (pembezaan) di sebalik keputusan reka bentuk tersebut.

Itulah sebabnya saya menyebut bahawa satu-satunya sebab yang boleh saya fikirkan setakat ini ialah jika ini adalah cara untuk menarik orang ramai menulis kod go dalam beberapa cara.


Jawapan betul


Anda boleh menyemak jawapan Burak Serdar

- anda mungkin mendapati ia lebih ringkas dan membantu. Namun, saya akan menyiarkan keseluruhan rangkaian penaakulan yang akhirnya menjadikannya "klik" untuk saya:

|-> Antara muka digunakan apabila kami tidak pasti jenis data yang tepat yang kami harapkan untuk diterima (kerana, sebagai contoh, parameter yang sama dalam fungsi dalam program mungkin menerima jenis data yang berbeza hasil daripada input pengguna ), Tetapi kami tahu gelagat tepat yang sepatutnya ada pada data yang disediakan.

^^ Oleh itu, jenis sebenar nilai yang disimpan dalam antara muka tidak diketahui pada masa penyusunan. (Jika tidak, jelas, kami akan menyatakannya dalam kod.)

|

|-> Oleh itu, penegasan jenis hanya digunakan pada pembolehubah yang dinyatakan secara jelas sebagai jenis antara muka, bukan pada pembolehubah yang mungkin melaksanakan antara muka yang sama tetapi tidak dinyatakan secara eksplisit sebagai jenis antara muka

kerana

Apabila kami menggunakan antara muka, kami hanya memerlukan penegasan jenis ini semasa masa jalan kerana kami tidak mengetahui jenis data yang tepat yang akan dihantar ke program - Penegasan jenis ini hanya diperlukan apabila menggunakan antara muka, jadi penegasan jenis hanya digunakan untuk Jenis yang dinyatakan secara eksplisit sebagai jenis antara muka kerana dalam semua kes lain jenis data diketahui (membenarkan pengkompil untuk secara tersirat menganggap bahawa pembolehubah melaksanakan antara muka - kerana ia sudah mengetahui semua jenis data data yang terlibat) kita hanya tidak menaip pernyataan diperlukan untuk data jenis yang diketahui. 🎜

Atas ialah kandungan terperinci Apakah alasan di sebalik pendekatan "penegasan jenis" Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam