Memahami Nuansa *t vs. t dalam Invokasi Kaedah Go
Dalam Go, penggunaan penunjuk ('*') dalam penerima kaedah boleh mempunyai kesan yang ketara ke atas fungsi kaedah. Perbezaan ini diserlahkan dalam coretan kod berikut:
Pelaksanaan asal kaedah String() menggunakan penerima penuding (*TT), yang mengelakkan perangkap mengakses penuding nol jika t adalah nol . Walau bagaimanapun, mengubah suai kaedah String() untuk menggunakan penerima bukan penuding (TT) menghasilkan gelung mati.
Sebab Gelung Mati:
Kunci untuk memahami tingkah laku ini terletak pada cara pakej fmt Go mengendalikan jenis yang melaksanakan antara muka fmt.Stringer (iaitu, jenis yang menyediakan kaedah String() tersuai). Apabila mencetak nilai jenis *TT, fmt.String() akan terlebih dahulu menyemak sama ada *TT melaksanakan kaedah String() yang sah. Jika ia berlaku, ia akan menggunakan kaedah itu untuk mendapatkan perwakilan rentetan nilai. Ini berfungsi dengan baik apabila *TT mempunyai penerima penuding kerana set kaedah *TT termasuk kaedah String().
Walau bagaimanapun, apabila penerima String() ditukar kepada jenis bukan penuding (iaitu, TT), timbul isu. Dalam kes ini, set kaedah TT termasuk kaedah String(), yang bermaksud bahawa apabila fmt.String() cuba mencetak nilai t (contoh TT), ia akan memanggil t.String(), yang dalam turn akan memanggil dirinya semula, membawa kepada rekursi yang tidak terhingga.
Mencegah Gelung Mati:
Untuk mengelakkan gelung mati, seseorang boleh menggunakan teknik yang dipanggil penukaran jenis. Dengan mencipta jenis baharu menggunakan kata kunci jenis dan menukar nilai yang dihantar kepada fmt.String(), seseorang boleh mengelakkan rekursi tak terhingga:
Dalam kes ini, jenis baharu (TT2) tidak mempunyai kaedah , jadi apabila fmt.String() cuba mencetak nilai yang ditukar, ia tidak menggunakan kaedah String() pada yang ditukar jenis.
Kesimpulan:
Memahami perbezaan antara *t dan t dalam penerima kaedah adalah penting untuk mengelakkan kemungkinan perangkap apabila mencetak jenis tersuai menggunakan fmt.String() fungsi. Dengan berhati-hati mempertimbangkan jenis penerima dan menggunakan penukaran jenis apabila perlu, seseorang boleh menghalang gelung mati dan memastikan fungsi seruan kaedah yang betul.
Atas ialah kandungan terperinci Apakah implikasi menggunakan `*t` lwn. `t` sebagai penerima kaedah dalam Go, dan bagaimanakah gelung mati boleh dihalang apabila menggunakan `fmt.String()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!