请问这个func该如何写?

www_7di_net 2014-09-02 05:34:16
我的期望:

s1 := []string{"1", "2", "3"}
s2 := []string{"1", "3"}
fmt.Println(SliceDiff(s1, s2))



s1 := []string{1, 2, 3}
s2 := []string{"1", "3"}
fmt.Println(SliceDiff(s1, s2))



s1 := []string{1, 2, 3}
s2 := []string{1, 3}
fmt.Println(SliceDiff(s1, s2))

目前go语言不支持泛型,所以就连func的参数类型我都不知道该怎么写了,汗一个
请不吝指教....

...全文
619 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
svenwang 2014-09-04
上面写错了,下面这个才是转成字符串比较的。

package main

import (
	"fmt"
)

type ValueSlice interface {
	Len() int
	Value(int) string
}

func SliceDiff(s1, s2 ValueSlice) bool {
	if s1.Len() != s2.Len() {
		return false
	}
	for i := 0; i < s1.Len(); i++ {
		if s1.Value(i) != s2.Value(i) {
			return false
		}
	}
	return true
}

type IntSlice []int

func (is IntSlice) Len() int {
	return len(is)
}

func (is IntSlice) Value(index int) string {
	return fmt.Sprintf("%d", int(is[index]))
}

type StrSlice []string

func (ss StrSlice) Len() int {
	return len(ss)
}

func (ss StrSlice) Value(index int) string {
	return ss[index]
}

func main() {
	s1 := []int{1, 2, 3}
	s2 := []string{"1", "2", "3"}
	fmt.Println(SliceDiff(IntSlice(s1), StrSlice(s2)))
}
回复
svenwang 2014-09-04
引用 8 楼 sibang 的回复:
引用 7 楼 svenwang 的回复:
[quote=引用 6 楼 sibang 的回复:] [quote=引用 1 楼 svenwang 的回复:] 你可以参考sort.Sort的实现方法和对接口的应用。
內部的算法我是會寫,但是形參不知道該用什麽類型
这个函数的输出是什么呢?字符串和数字怎么比较? [/quote] 我期望能進行數據轉換,把int型轉為string在進行比較.[/quote] 你可以参考sort.Sort,自己实现一个接口,函数SliceDiff针对这个接口进行处理: 例如:

package main

import(
	"fmt"
    "strconv"
)

type ValueSlice interface {
    Len() int
    Value(int) (int, error)
}

func SliceDiff(s1, s2 ValueSlice) bool {
    if s1.Len() != s2.Len() {
        return false
    }
    for i := 0; i < s1.Len(); i++ {
        v1, err := s1.Value(i)
        if err != nil {
            return false
        }
        v2, err := s2.Value(i)
        if err != nil {
            return false
        }
        if v1 != v2 {
            return false
        }
    }
    return true
}

type IntSlice []int

func (is IntSlice) Len() int {
    return len(is)
}

func (is IntSlice) Value(index int) (int, error) {
    return int(is[index]), nil
}

type StrSlice []string

func (ss StrSlice) Len() int {
    return len(ss)
}

func (ss StrSlice) Value(index int) (int, error) {
    return strconv.Atoi(string(ss[index]))
}

func main() {
    s1 := []int{1, 2, 3}
    s2 := []string{"1", "2", "3"}
    fmt.Println(SliceDiff(IntSlice(s1), StrSlice(s2)))
}
回复
www_7di_net 2014-09-04
引用 7 楼 svenwang 的回复:
引用 6 楼 sibang 的回复:
[quote=引用 1 楼 svenwang 的回复:] 你可以参考sort.Sort的实现方法和对接口的应用。
內部的算法我是會寫,但是形參不知道該用什麽類型
这个函数的输出是什么呢?字符串和数字怎么比较? [/quote] 我期望能進行數據轉換,把int型轉為string在進行比較.
回复
svenwang 2014-09-04
引用 6 楼 sibang 的回复:
引用 1 楼 svenwang 的回复:
你可以参考sort.Sort的实现方法和对接口的应用。
內部的算法我是會寫,但是形參不知道該用什麽類型
这个函数的输出是什么呢?字符串和数字怎么比较?
回复
www_7di_net 2014-09-04
引用 1 楼 svenwang 的回复:
你可以参考sort.Sort的实现方法和对接口的应用。
內部的算法我是會寫,但是形參不知道該用什麽類型
回复
svenwang 2014-09-03
你的例子里输入一个[]string,一个[]int,输出是什么呢?[]string还是[]int? 不知道SliceDiff的算法规则,说不了太多。
回复
svenwang 2014-09-03
你可以参考sort.Sort的实现方法和对接口的应用。
回复
svenwang 2014-09-03
引用 4 楼 selecthis 的回复:

package main

import (
	"fmt"
	"reflect"
)

func SliceDiff(one interface{}, other interface{}) bool {
	val1 := reflect.ValueOf(one)
	val2 := reflect.ValueOf(other)

	if val1.Len() != val2.Len() {
		return false
	}

	for i := 0; i < val1.Len(); i++ {
		s1 := val1.Index(i)
		s2 := val2.Index(i)
		if s1 != s2 {
			return false
		}
	}

	return true
}

func main() {
	s1 := []string{"1", "2", "3"}
	s2 := []interface{}{1, 2.3, 3}
	fmt.Printf("bool: %v\n", SliceDiff(s1, s2))
}
这个实现是有问题的,因为两个值的比较不等于两个值对应的reflect.Value的比较。

reflect.ValueOf("1") == reflect.ValueOf("1")
以上表达式的值为false
回复
李察德-泰森 2014-09-03

package main

import (
	"fmt"
	"reflect"
)

func SliceDiff(one interface{}, other interface{}) bool {
	val1 := reflect.ValueOf(one)
	val2 := reflect.ValueOf(other)

	if val1.Len() != val2.Len() {
		return false
	}

	for i := 0; i < val1.Len(); i++ {
		s1 := val1.Index(i)
		s2 := val2.Index(i)
		if s1 != s2 {
			return false
		}
	}

	return true
}

func main() {
	s1 := []string{"1", "2", "3"}
	s2 := []interface{}{1, 2.3, 3}
	fmt.Printf("bool: %v\n", SliceDiff(s1, s2))
}
回复
黑泡泡选手 2014-09-03
参数应该是切片吧?make一个~
回复
发动态
发帖子
go语言
创建于2013-07-31

1405

社区成员

go语言学习与交流版
申请成为版主
社区公告
暂无公告