کلیدهای بازتابنده و غیر بازتابنده در GO (Golang)

اصطلاحات کلیدهای “بازتابنده” و “غیر بازتابنده” اصطلاحات استاندارد نیستند.
با این حال ، بر اساس زمینه ، به نظر می رسد شما ممکن است به نحوه استفاده از کلیدها در نقشه ها یا نحوه مقایسه آنها برای برابری اشاره کنید.
کلید بازتابنده
بوها کلید بازتابنده اشاره به یک کلید است که با خودش برابر است.
در GO ، این یک ویژگی اساسی برابری است.
به عنوان مثال ، اگر یک کلید دارید k
، بیان k == k
همیشه باید ارزیابی شود true
بشر
این یک الزام اساسی برای هر کلید مورد استفاده در نقشه یا عملیات مقایسه است.
type MyKey struct {
ID int
}
k := MyKey{ID: 1}
fmt.Println(k == k) // true (reflexive)
کلید غیر قابل برگشت
بوها کلید غیر قابل برگشت دلالت بر یک کلیدی دارد که با خودش برابر نباشد ، و این امر باعث نقض قوانین اساسی برابری در GO می شود.
چنین کلیدهایی را نمی توان در نقشه ها یا برای مقایسه استفاده کرد زیرا GO برای رفتار صحیح به کلیدهایی نیاز دارد تا بازتابنده ، متقارن و گذرا باشد.
نمونه ای از یک کلید نامعتبر (فرضی ، زیرا این قوانین GO را می شکند):
// This is not valid Go code, as it violates the reflexive property.
type InvalidKey struct {
ID int
}
func (k InvalidKey) Equal(other InvalidKey) bool {
return k.ID != other.ID // Non-reflexive by design
}
k := InvalidKey{ID: 1}
fmt.Println(k.Equal(k)) // false (non-reflexive, invalid in Go)
الزامات کلیدی در نقشه های GO
در GO ، کلیدهای مورد استفاده در نقشه ها باید باشد قابل مقایسهبشر این بدان معنی است:
- نوع کلید باید پشتیبانی کند
==
وت!=
اپراتورها - مقایسه برابری باید بازتابنده باشد (
k == k
همیشه درست است) ، متقارن (k1 == k2
دلالت داردk2 == k1
) ، و گذرا (k1 == k2
وتk2 == k3
دلالت داردk1 == k3
).
انواع متداول که می تواند به عنوان کلیدها در نقشه ها مورد استفاده قرار گیرد عبارتند از:
- انواع اساسی (
int
باstring
باfloat64
، و غیره) - ساختار (اگر تمام زمینه های آنها قابل مقایسه باشد)
- آرایه ها (اگر انواع عناصر آنها قابل مقایسه است)
انواع مختلفی که نمی توانند به عنوان کلید استفاده شوند عبارتند از:
- برش
- نقشه
- توابع
- ساختاری با زمینه های غیر قابل مقایسه (به عنوان مثال ، برش یا نقشه)