Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Melewati rujukan dan nilai dalam fungsi Pergi ke

Melewati rujukan dan nilai dalam fungsi Pergi ke

王林
王林ke hadapan
2024-02-12 23:21:10574semak imbas

在 Go to 函数中通过引用和值传递

Dalam pembangunan PHP, fungsi Pergi ke ialah fungsi yang sangat biasa digunakan yang boleh digunakan untuk mengawal aliran program. Apabila menggunakan fungsi Pergi ke, kami mempunyai dua cara untuk menghantar parameter: dengan rujukan dan nilai. Apabila parameter diluluskan melalui rujukan, pengubahsuaian kepada parameter di dalam fungsi akan mempengaruhi nilai pembolehubah di luar fungsi. Apabila parameter diluluskan mengikut nilai, pengubahsuaian pada parameter di dalam fungsi tidak akan menjejaskan nilai pembolehubah di luar fungsi. Oleh itu, apabila menulis fungsi, kita perlu memilih kaedah pemindahan parameter yang sesuai mengikut keperluan sebenar untuk mencapai logik program yang diharapkan. Dalam artikel ini, saya akan memperkenalkan secara terperinci penggunaan dan perbezaan rujukan lulus dan nilai dalam fungsi Pergi ke untuk membantu pembaca lebih memahami dan menggunakan fungsi PHP yang penting ini.

Kandungan soalan

Saya agak keliru untuk meneruskan rujukan dan nilai dalam perjalanan.

Saya telah melihat penjelasan untuk * di hadapan jenis.

* in front of a type name, means that the declared variable will store an address of another variable of that type (not a value of that
type).

Ini tidak masuk akal bagi saya.

Di java, jika saya menghantar contoh pangkalan data kepada fungsi, saya melakukan ini

databasefunction(databasetype db) {
      // do something
}

Tetapi dalam contoh go, saya telah lulus seperti ini.

func puttasks(db *sql.db) echo.handlerfunc {

}

Mengapa kita memerlukan asterisk di hadapan jenis?

Berdasarkan helaian tipu ini, saya dapati.

func PrintPerson(p *Person)   ONLY receives the pointer address
(reference)

Saya tidak faham mengapa saya hanya mahu menghantar alamat penunjuk sebagai parameter.

Penyelesaian

Pertama sekali, pergi secara teknikal hanya mempunyai nilai lulus. Apabila anda menghantar penunjuk kepada objek, anda menghantar penunjuk mengikut nilai, bukan objek dengan rujukan. Perbezaannya adalah halus, tetapi kadangkala relevan. Sebagai contoh, daripada membatalkan rujukannya dan menulis ganti memori yang ditunjukkannya, anda boleh menulis ganti nilai penuding yang tidak mempunyai kesan pada pemanggil.

// *int means you *must* pass a *int (pointer to int), NOT just an int!
func someFunc(x *int) {
    *x = 2 // Whatever variable caller passed in will now be 2
    y := 7
    x = &y // has no impact on the caller because we overwrote the pointer value!
}

Berkenaan soalan anda "Mengapa kita memerlukan asterisk di hadapan jenis?": Asterisk bermaksud nilai itu menunjuk kepada nilai jenis sql.db 类型的指针,而不是 sql.db. Ini tidak boleh ditukar ganti!

Kenapa hantar alamat penunjuk? Dengan cara ini anda boleh berkongsi nilai antara pemanggil fungsi dan badan fungsi, dan mempunyai perubahan yang dibuat di dalam fungsi yang ditunjukkan dalam pemanggil (cth. penuding ialah satu-satunya cara kaedah "penetap" boleh bertindak pada objek) . Ini sebenarnya yang dilakukan oleh kod java anda juga; dalam java anda sentiasa mengakses objek melalui rujukan (penunjuk), jadi java melakukan ini secara automatik dan bukannya membenarkan anda menyatakannya secara eksplisit. Tetapi dalam perjalanan anda juga boleh mengakses objek melalui penunjuk, jadi anda perlu jelas. Jika anda memanggil fungsi dan menghantar objek secara terus, fungsi itu akan mendapat salinan objek, dan jika fungsi itu mengubah suai objek, pemanggil tidak akan melihat perubahan tersebut. Oleh itu, jika anda mahu perubahan disebarkan di luar fungsi, anda mesti lulus penunjuk. Dengan cara ini, penuding akan disalin, tetapi objek yang ditunjukkannya akan dikongsi.

Lihat juga:

Bahagian jelajah tentang penunjuk, Pergi bahagian spesifikasi tentang penunjuk, Pergi ke bahagian spesifikasi tentang pengendali alamat

Atas ialah kandungan terperinci Melewati rujukan dan nilai dalam fungsi Pergi ke. 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