Output Goroutine tidak betul
Editor PHP Zimo membawakan anda soalan tentang Goroutine hari ini: Mengapakah hasil keluaran Goroutine kadangkala tidak betul? Goroutine ialah utas ringan dalam bahasa Go yang boleh melaksanakan tugas secara serentak, tetapi kadangkala hasil keluarannya mungkin tidak betul. Jadi, apakah punca keadaan ini? Mari kita terokai bersama-sama! Dengan memahami masalah ini, kita boleh lebih memahami cara Goroutine berfungsi dan mengelak daripada menghadapi masalah yang sama dalam pembangunan sebenar.
Kandungan soalan
Saya sedang menonton kuliah di mana penulis membina aplikasi status menggunakan rutin go yang berkelakuan pelik selepas beberapa ketika.
Kod adalah seperti berikut:
65bcd28b0b95Output yang saya dapat ialah:
65bcd28b0ba0Saya tidak faham mengapa "amazon.com" terus berulang di sini? Mengapa ini berlaku selepas mencetak kesemua 5 pautan?
Penyelesaian
Masalahnya ialah dengan pembolehubah gelung l
的闭包捕获。由于 goroutine 是在循环内启动的,因此循环创建的所有 goroutine 共享 l
的相同内存地址。当睡眠结束并执行 goroutine 时,由于循环迭代剩余的链接,l
的值已更改。因此,所有 goroutine 最终都会检查 links
pautan terakhir dalam kepingan, iaitu "http://amazon.com".
Untuk menyelesaikan masalah ini, anda perlu menghantar pembolehubah gelung l
sebagai parameter kepada fungsi tanpa nama di dalam goroutine. Berikut ialah versi kod yang dikemas kini:
for l := range c { go func(link string) { time.Sleep(5 * time.Second) checkLink(link, c) }(l) }
Dengan menghantar l
作为参数传递给匿名函数,每个 goroutine 将拥有自己的 l
sebagai hujah kepada fungsi tanpa nama, setiap goroutine akan mempunyai salinan
Atas ialah kandungan terperinci Output Goroutine tidak betul. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Anda boleh menggunakan refleksi untuk mengakses medan dan kaedah peribadi dalam bahasa Go: Untuk mengakses medan peribadi: dapatkan nilai pantulan nilai melalui reflect.ValueOf(), kemudian gunakan FieldByName() untuk mendapatkan nilai pantulan medan dan panggil Kaedah String() untuk mencetak nilai medan . Panggil kaedah persendirian: dapatkan juga nilai pantulan nilai melalui reflect.ValueOf(), kemudian gunakan MethodByName() untuk mendapatkan nilai pantulan kaedah, dan akhirnya panggil kaedah Call() untuk melaksanakan kaedah. Kes praktikal: Ubah suai nilai medan persendirian dan panggil kaedah persendirian melalui refleksi untuk mencapai kawalan objek dan liputan ujian unit.

Ujian prestasi menilai prestasi aplikasi di bawah beban yang berbeza, manakala ujian unit mengesahkan ketepatan satu unit kod. Ujian prestasi memfokuskan pada mengukur masa tindak balas dan daya pemprosesan, manakala ujian unit memfokuskan pada output fungsi dan liputan kod. Ujian prestasi mensimulasikan persekitaran dunia sebenar dengan beban tinggi dan serentak, manakala ujian unit dijalankan di bawah beban rendah dan keadaan bersiri. Matlamat ujian prestasi adalah untuk mengenal pasti kesesakan prestasi dan mengoptimumkan aplikasi, manakala matlamat ujian unit adalah untuk memastikan ketepatan dan keteguhan kod.

Perangkap dalam Bahasa Go Semasa Merekabentuk Sistem Teragih Go ialah bahasa popular yang digunakan untuk membangunkan sistem teragih. Walau bagaimanapun, terdapat beberapa perangkap yang perlu diberi perhatian apabila menggunakan Go yang boleh menjejaskan kekukuhan, prestasi dan ketepatan sistem anda. Artikel ini akan meneroka beberapa perangkap biasa dan memberikan contoh praktikal tentang cara mengelakkannya. 1. Terlalu banyak menggunakan concurrency Go ialah bahasa concurrency yang menggalakkan pembangun menggunakan goroutine untuk meningkatkan paralelisme. Walau bagaimanapun, penggunaan konkurensi yang berlebihan boleh menyebabkan ketidakstabilan sistem kerana terlalu banyak gorout bersaing untuk mendapatkan sumber dan menyebabkan overhed penukaran konteks. Kes praktikal: Penggunaan concurrency yang berlebihan membawa kepada kelewatan respons perkhidmatan dan persaingan sumber, yang ditunjukkan sebagai penggunaan CPU yang tinggi dan overhed kutipan sampah yang tinggi.

Perpustakaan dan alatan untuk pembelajaran mesin dalam bahasa Go termasuk: TensorFlow: perpustakaan pembelajaran mesin popular yang menyediakan alatan untuk membina, melatih dan menggunakan model. GoLearn: Satu siri algoritma pengelasan, regresi dan pengelompokan Gonum: Pustaka pengkomputeran saintifik yang menyediakan operasi matriks dan fungsi algebra linear.

Evolusi konvensyen penamaan fungsi Golang adalah seperti berikut: Peringkat awal (Go1.0): Tiada konvensyen formal dan penamaan unta digunakan. Konvensyen garis bawah (Go1.5): Fungsi yang dieksport bermula dengan huruf besar dan diawali dengan garis bawah. Konvensyen fungsi kilang (Go1.13): Fungsi yang mencipta objek baharu diwakili oleh awalan "Baharu".

Dengan keselarasan tinggi, kecekapan dan sifat merentas platform, bahasa Go telah menjadi pilihan ideal untuk pembangunan aplikasi Internet Perkara (IoT) mudah alih. Model keselarasan Go mencapai tahap keselarasan yang tinggi melalui goroutine (coroutine ringan), yang sesuai untuk mengendalikan sejumlah besar peranti IoT yang disambungkan pada masa yang sama. Penggunaan sumber Go yang rendah membantu menjalankan aplikasi dengan cekap pada peranti mudah alih dengan pengkomputeran dan storan terhad. Selain itu, sokongan merentas platform Go membolehkan aplikasi IoT digunakan dengan mudah pada pelbagai peranti mudah alih. Kes praktikal menunjukkan penggunaan Go untuk membina aplikasi penderia suhu BLE, berkomunikasi dengan penderia melalui BLE dan memproses data masuk untuk membaca dan memaparkan bacaan suhu.

Takrifan makro fungsi dalam bahasa Go membolehkan penunjuk fungsi disimpan dalam pemalar untuk mengikat panggilan fungsi terlebih dahulu dan meningkatkan kebolehbacaan dan kebolehselenggaraan kod. Langkah-langkah khusus adalah seperti berikut: Gunakan kata kunci const untuk menentukan makro, nyatakan nama makro, senarai parameter dan jenis nilai pulangan. Tulis badan fungsi dalam makro fungsi. Panggil makro fungsi dengan namanya. Makro fungsi boleh digunakan dalam pelbagai senario, seperti perbandingan kandungan fail.

Kelebihan Rangka Kerja Golang Golang ialah bahasa pengaturcaraan serentak berprestasi tinggi yang amat sesuai untuk perkhidmatan mikro dan sistem teragih. Rangka kerja Golang menjadikan pembangunan aplikasi ini lebih mudah dengan menyediakan satu set komponen dan alatan siap sedia. Berikut ialah beberapa kelebihan utama rangka kerja Golang: 1. Prestasi tinggi dan selaras: Golang sendiri terkenal dengan prestasi tinggi dan selaras. Ia menggunakan goroutine, mekanisme penjalinan ringan yang membolehkan pelaksanaan kod serentak, dengan itu meningkatkan daya pemprosesan dan tindak balas aplikasi. 2. Kemodulan dan kebolehgunaan semula: Rangka kerja Golang menggalakkan kemodulatan dan kod boleh guna semula. Dengan memecahkan aplikasi kepada modul bebas, anda boleh mengekalkan dan mengemas kini kod dengan mudah
