将不同类型的参数传递给函数
Passing different type's parameters to the function
我有这个功能,我想让它能够接收所有类型的切片,不仅是 []string,还有 []int 等等......我想知道是否有一些将参数传递给函数头时抽象类型的方法,或者我是否应该做其他事情来完成它。
package removeDuplicate
// RemoveDuplicate remove duplicate items from slice setting it to arr2
func RemoveDuplicate(arr []string) []string {
arr2 := arr[:1]
Loop:
for i := 1; i < len(arr); {
for j := 0; j < len(arr2); {
if arr[i] != arr[j] {
j++
} else {
i++
continue Loop
}
}
arr2 = append(arr2, arr[i])
i++
}
return arr2
}
提前致谢=]
如果您更改函数签名以接受接口{},您可以获得适用于内置类型的东西。
package main
import "fmt"
func main() {
x := []interface{}{"bob", "doug", "bob"}
fmt.Println(RemoveDuplicate(x))
y := []interface{}{1, 3, 1}
fmt.Println(RemoveDuplicate(y))
z := []interface{}{"bob", "2", "doug", 3, 2, "bob"}
fmt.Println(RemoveDuplicate(z))
}
func RemoveDuplicate(arr []interface{}) []interface{} {
arr2 := arr[:1]
Loop:
for i := 1; i < len(arr); {
for j := 0; j < len(arr2); {
if arr[i] != arr[j] {
j++
} else {
i++
continue Loop
}
}
arr2 = append(arr2, arr[i])
i++
}
return arr2
}
查看常见问题 Can I convert a []T to an []interface{}?(以及之前的)了解更多信息。
Go 中的任何类型的通用算法都可以使用两种机制中的任何一种来实现:接口和反射。使用接口,你可以像 sort
包那样做:
type Slice interface {
Len() int
Swap(i, j int)
Eq(i, j int) bool
SubSlice(i, j int) Slice
}
func RemoveDuplicate(s Slice) Slice {
n := 1
Loop:
for i := 1; i < s.Len(); i++ {
for j := 0; j < n; j++ {
if s.Eq(i, j) {
continue Loop
}
}
s.Swap(n, i)
n++
}
return s.SubSlice(0, n)
}
带有整数和字符串的游乐场:http://play.golang.org/p/WwC27eP72n。
我有这个功能,我想让它能够接收所有类型的切片,不仅是 []string,还有 []int 等等......我想知道是否有一些将参数传递给函数头时抽象类型的方法,或者我是否应该做其他事情来完成它。
package removeDuplicate
// RemoveDuplicate remove duplicate items from slice setting it to arr2
func RemoveDuplicate(arr []string) []string {
arr2 := arr[:1]
Loop:
for i := 1; i < len(arr); {
for j := 0; j < len(arr2); {
if arr[i] != arr[j] {
j++
} else {
i++
continue Loop
}
}
arr2 = append(arr2, arr[i])
i++
}
return arr2
}
提前致谢=]
如果您更改函数签名以接受接口{},您可以获得适用于内置类型的东西。
package main
import "fmt"
func main() {
x := []interface{}{"bob", "doug", "bob"}
fmt.Println(RemoveDuplicate(x))
y := []interface{}{1, 3, 1}
fmt.Println(RemoveDuplicate(y))
z := []interface{}{"bob", "2", "doug", 3, 2, "bob"}
fmt.Println(RemoveDuplicate(z))
}
func RemoveDuplicate(arr []interface{}) []interface{} {
arr2 := arr[:1]
Loop:
for i := 1; i < len(arr); {
for j := 0; j < len(arr2); {
if arr[i] != arr[j] {
j++
} else {
i++
continue Loop
}
}
arr2 = append(arr2, arr[i])
i++
}
return arr2
}
查看常见问题 Can I convert a []T to an []interface{}?(以及之前的)了解更多信息。
Go 中的任何类型的通用算法都可以使用两种机制中的任何一种来实现:接口和反射。使用接口,你可以像 sort
包那样做:
type Slice interface {
Len() int
Swap(i, j int)
Eq(i, j int) bool
SubSlice(i, j int) Slice
}
func RemoveDuplicate(s Slice) Slice {
n := 1
Loop:
for i := 1; i < s.Len(); i++ {
for j := 0; j < n; j++ {
if s.Eq(i, j) {
continue Loop
}
}
s.Swap(n, i)
n++
}
return s.SubSlice(0, n)
}
带有整数和字符串的游乐场:http://play.golang.org/p/WwC27eP72n。