int切片和string切片为什么不能转为interface类型的切片

来自公众号:新世界杂货铺

在给可变参数传参时, 笔者经常会犯一些低级错误。如:
cannot use (type []string) as type []interface {}cannot use (type []int) as type []interface {}等。所以, 特地写下这篇文章用来时时刻刻地提醒自己。

Q1: 可以将[]T转为[]interface{}类型嘛?

答:不能直接转,Go语言规范不允许这样做,因为两种类型在内存中没有相同的表现形式。有必要将元素单独复制到目标切片。下面的例子将一个[]int转换为[]interface{}:

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}

Q2: 如果T1和T2具有相同的基础类型,可以将[]T1转换为[]T2嘛?
具体列子如下:

type T1 int
type T2 int
var t1 T1
var x = T2(t1) // OK
var st1 []T1
var sx = ([]T2)(st1) // NOT OK

答:在Go中,类型与方法密切相关,每一个命名类型都有一个(可能是空的)方法集。一般规则是,可以更改要转换的类型的名称(从而可以更改其方法集),但不能更改复合类型的元素的名称(和方法集)。Go要求您明确说明类型转换。

注:上述内容翻译自https://golang.org/doc/faq#convert_slice_of_interface

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Go 中,可以通过将切片作为参数,来实现链式调用。具体实现步骤如下: 1. 定义一个结构体类型,结构体中包含需要链式调用的方法。 2. 在方法中,将当前结构体指针和一个切片作为参数,将当前结构体指针添加到切片中,然后返回切片本身,这样就可以在调用完当前方法后,将当前结构体指针添加到切片中,并直接调用下一个方法。 例如,下面的代码演示了如何定义一个包含链式调用的结构体类型 Person: ```go type Person struct { name string age int } func (p *Person) SetName(name string, chain []interface{}) []interface{} { p.name = name chain = append(chain, p) return chain } func (p *Person) SetAge(age int, chain []interface{}) []interface{} { p.age = age chain = append(chain, p) return chain } ``` 在上面的代码中,SetName 和 SetAge 方法都接受了一个类型为 []interface{} 的切片作为参数,这个切片用于存储调用链中的结构体指针。在方法中,我们将当前结构体指针添加到切片中,并返回切片本身。 下面是如何使用这个结构体类型进行链式调用的示例代码: ```go p := &Person{} chain := []interface{}{} chain = p.SetName("Tom", chain) chain = p.SetAge(20, chain) ``` 在上面的示例代码中,首先创建了一个 Person 类型的指针 p,然后定义了一个类型为 []interface{} 的切片 chain,将 p 作为参数调用 SetName 和 SetAge 方法,将返回值赋值给 chain,这样就完成了链式调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值