Я думаю, что для этого вам нужно построить рейтинг ваших языков:
var langMap map[string]int
for i, lang := range languages {
langMap[lang.Code] = i
}
С этим становится просто просто посмотреть рейтинг каждого элемента в variants
и вернутьсясоответствующее значение:
sort.Slice(variants, func(i, j int) bool {
iRank, jRank := langMap[variants[i].Code], langMap[variants[j].Code]
return iRank < jRank
})
Если есть вероятность, что у вас могут быть входы, которых нет в предварительно отсортированном списке, вы можете отсортировать их последними:
sort.Slice(variants, func(i, j int) bool {
iRank, iExists := langMap[variants[i].Code]
jRank, jExists := langMap[variants[j].Code]
switch (
case iExists && jExists:
// Both exist in the pre-ordered list, so sort by rank
return iRank < jRank
case !iExists && !jExists:
// Neither exists in the pre-ordered list, sort alphabetically
return variants[i].Code < variants[j].Code
case iExists:
// Only i exists, so sort it before j
return true
default: // jExists
// Only j exists, so sort it after i
return false
)
})
Это логически возможносделать то же самое, просматривая список ссылок каждый раз, когда вы пытаетесь, но об этом гораздо сложнее думать и гораздо менее эффективно.