Chỉ cần có câu hỏi tương tự và quyết định thử một số gợi ý trong chủ đề này.
Tôi đã điểm chuẩn các tình huống tốt nhất và tồi tệ nhất trong 3 loại tra cứu:
- sử dụng bản đồ
- sử dụng một danh sách
- sử dụng câu lệnh chuyển đổi
đây là mã chức năng:
func belongsToMap(lookup string) bool {
list := map[string]bool{
"900898296857": true,
"900898302052": true,
"900898296492": true,
"900898296850": true,
"900898296703": true,
"900898296633": true,
"900898296613": true,
"900898296615": true,
"900898296620": true,
"900898296636": true,
}
if _, ok := list[lookup]; ok {
return true
} else {
return false
}
}
func belongsToList(lookup string) bool {
list := []string{
"900898296857",
"900898302052",
"900898296492",
"900898296850",
"900898296703",
"900898296633",
"900898296613",
"900898296615",
"900898296620",
"900898296636",
}
for _, val := range list {
if val == lookup {
return true
}
}
return false
}
func belongsToSwitch(lookup string) bool {
switch lookup {
case
"900898296857",
"900898302052",
"900898296492",
"900898296850",
"900898296703",
"900898296633",
"900898296613",
"900898296615",
"900898296620",
"900898296636":
return true
}
return false
}
trường hợp tốt nhất chọn mục đầu tiên trong danh sách, trường hợp xấu nhất sử dụng giá trị không tồn tại.
đây là kết quả:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op
BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op
BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op
BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op
BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op
BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
Switch thắng tất cả các cách, trường hợp xấu nhất là nhanh hơn so với trường hợp tốt nhất. Bản đồ là tồi tệ nhất và danh sách gần hơn để chuyển đổi.
Vì vậy, đạo đức là: Nếu bạn có một danh sách nhỏ, hợp lý, câu lệnh chuyển đổi là cách để đi.