Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah kunci golang disalin?

Bolehkah kunci golang disalin?

DDD
DDDasal
2023-08-15 11:44:511464semak imbas

Tidak, kerana kunci digunakan untuk mengawal akses kepada sumber yang dikongsi Tindakan menyalin kunci boleh menyebabkan operasi buka kunci berbilang pada sumber yang sama, menyebabkan persaingan sumber dan masalah kebuntuan. Di Golang, apabila menetapkan pembolehubah jenis rujukan atau parameter lulus, ia hanya menyalin penuding itu sendiri, dan bukannya menyalin data yang ditunjuk oleh penuding. Ini bermakna menyalin pembolehubah jenis Mutex hanya menyalin penunjuk ke kunci, bukan kunci itu sendiri.

Bolehkah kunci golang disalin?

Persekitaran pengendalian artikel ini: sistem Windows 10, versi Go1.20.4, komputer Dell G3.

Jenis kunci di Golang tidak boleh disalin terus. Saya akan menerangkan mengapa secara terperinci di bawah.

Di Golang, kunci dilaksanakan melalui jenis Mutex dalam pakej penyegerakan. Jenis Mutex ialah struktur yang mengandungi beberapa medan dalaman yang digunakan untuk mewakili status kunci. Apabila kita mengisytiharkan pembolehubah jenis Mutex, kita sebenarnya mengisytiharkan penunjuk kepada struktur Mutex.

Memandangkan jenis Mutex ialah penunjuk struktur, ia adalah jenis rujukan. Di Golang, apabila menetapkan pembolehubah jenis rujukan atau parameter lulus, ia hanya menyalin penuding itu sendiri, dan bukannya menyalin data yang ditunjuk oleh penuding. Ini bermakna menyalin pembolehubah jenis Mutex hanya menyalin penunjuk ke kunci, bukan kunci itu sendiri.

Mengapa kita tidak boleh menyalin kunci secara terus? Ini kerana kunci digunakan untuk mengawal akses kepada sumber yang dikongsi Menyalin kunci boleh membawa kepada operasi buka kunci berbilang pada sumber yang sama, menyebabkan persaingan sumber dan masalah kebuntuan.

Pertimbangkan contoh kod berikut:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var mutex sync.Mutex
	mutex.Lock()
	defer mutex.Unlock()

	// 复制锁
	newMutex := mutex
	newMutex.Lock() // 这里会导致死锁
	defer newMutex.Unlock()

	fmt.Println("Hello, World!")
}

Dalam contoh ini, kita mula-mula mencipta mutex pembolehubah jenis Mutex, kemudian memanggil kaedah mutex.Lock() untuk mengunci kunci, dan akhirnya menggunakan pernyataan tangguh untuk membuka kuncinya di akhir fungsi.

Seterusnya, kami cuba menyalin kunci ini dan mencipta pembolehubah jenis Mutex baharu newMutex. Panggil kaedah newMutex.Lock() untuk mengunci kunci. Tetapi ini akan menyebabkan kebuntuan, kerana kami telah menyalin kunci yang sama, jadi selepas kaedah mutex.Lock() dilaksanakan, kunci telah diduduki, dan menguncinya semula akan menyebabkan penyekatan.

Contoh di atas menunjukkan mengapa kita tidak boleh menyalin kunci. Kerana menyalin kunci akan menyebabkan berbilang operasi mengunci dan membuka kunci pada sumber yang sama, menyebabkan masalah kebuntuan.

Ringkasan

Kunci di Golang tidak boleh ditiru terus. Memandangkan kunci digunakan untuk mengawal akses kepada sumber yang dikongsi, penduaan kunci boleh membawa kepada pertikaian sumber dan masalah kebuntuan. Oleh itu, apabila menggunakan kunci, kita harus mengelakkan menyalin kunci dan menggunakannya sebagai pembolehubah lurus.

Atas ialah kandungan terperinci Bolehkah kunci golang disalin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn