diff --git a/listener/sing_tun/server.go b/listener/sing_tun/server.go index 09bf308c73..a5edb77f63 100644 --- a/listener/sing_tun/server.go +++ b/listener/sing_tun/server.go @@ -24,6 +24,7 @@ import ( E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" "github.com/sagernet/sing/common/ranges" + "golang.org/x/exp/slices" ) var InterfaceName = "Meta" @@ -60,19 +61,21 @@ func CalculateInterfaceName(name string) (tunName string) { return } tunIndex := 0 - indexSet := make(map[int]struct{}) + indexArr := make([]int, 0, len(interfaces)) for _, netInterface := range interfaces { if strings.HasPrefix(netInterface.Name, tunName) { index, parseErr := strconv.ParseInt(netInterface.Name[len(tunName):], 10, 16) if parseErr == nil { - indexSet[int(index)] = struct{}{} + indexArr = append(indexArr, int(index)) } } } - for index := range indexSet { + slices.Sort(indexArr) + indexArr = slices.Compact(indexArr) + for _, index := range indexArr { if index == tunIndex { tunIndex += 1 - } else { // indexSet already sorted and distinct, so this tunIndex nobody used + } else { // indexArr already sorted and distinct, so this tunIndex nobody used break } }