swap := reflect.Swapper(slice) // Swapper returns a function that swaps the elements in the provided 10 // slice. 11 // 12 // Swapper panics if the provided interface is not a slice. 13 func Swapper(slice interface{}) func(i, j int) { 14 v := ValueOf(slice) 15 if v.Kind() != Slice { 16 panic(&ValueError{Method: "Swapper", Kind: v.Kind()}) 17 } ..................此处省略部分代码 62 tmp := unsafe_New(typ) // swap scratch space 63 64 return func(i, j int) { 65 if uint(i) >= uint(s.Len) || uint(j) >= uint(s.Len) { 66 panic("reflect: slice index out of range") 67 } 68 val1 := arrayAt(s.Data, i, size) 69 val2 := arrayAt(s.Data, j, size) 70 typedmemmove(typ, tmp, val1) 71 typedmemmove(typ, val1, val2) 72 typedmemmove(typ, val2, tmp) 73 } 74 }