关于对比两个切片不同的问题

gameserver · 2017-02-25 01:54:18 · 1990 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-02-25 01:54:18 的主题,其中的信息可能已经有所发展或是发生改变。

在学习 go web编程那本书的时候,里面有一段,是判断用户复选框是否合法,采用以下代码

slice:=[]string{"football","basketball","tennis"}

a:=Slice_diff(r.Form["interest"],slice)

if a == nil{

return true

}

return false

我用的时候,发现Slice_diff 不是标准函数,好像是第三方的,于是我也建个包,把这个函数弄过来:

func Slice_diff(slice1, slice2 []interface{}) (diffslice []interface{}) {

for _, v := range slice1 {

    if !In_slice(v, slice2) {

        diffslice = append(diffslice, v)

    }

}

return

}

然后,我就加入自己代码

//复选框验证

    slice2 := []string{"football", "basketball", "tennis"}

    a := beeku.Slice_diff(r.Form["interest"], slice2)

    if a != nil {

        fmt.Fprintf(w, "复选框选择错误")

        return

    }

但是一直报错,就是这句

beeku.Slice_diff(r.Form["interest"], slice2)

提示

Cannot use r.Form["interest"] (type []string) as type []interface{}

意思应该是不能把字符串切片转换为interface,interface这东西不是通用类型么,怎么会出现这样的错误,谁明白呢?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1990 次点击  
加入收藏 微博
1 回复  |  直到 2017-02-27 01:23:35
eric160
eric160 · #1 · 8年之前

因为[]interface{}是切片,类型为interface{},所以只能接收interface{}类型的切片。 而[]string是string类型的切片,所以不能使用。 你所说的通用类型即interface{},如果函数Slice_diff的参数是interface{}类型,就可以 接收任何类型的数据。 区别:[]interface{}是interface{}类型的切片(即切片的元素可以是任何类型);interface{}是空接口类型、不要混淆了!

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传