在函数参数类型上需要用到类似泛型方式,`golang`里面只需要实现接口方法就可以视为实现了该接口,尝试使用数组来使用,无法成功,源代码如下:
```
// 接口
type DemoInterface interface {
GetTime() time.Time
}
// 结构体实现了接口
type DemoStruct struct {
}
func (ds DemoStruct) GetTime() time.Time {
return time.Now()
}
// ??
func GetAllTime1(demos []DemoInterface) {
for _, dm := range demos {
fmt.Println("time1:", dm.GetTime())
}
}
// 结构体数组
func GetAllTime2(demos []DemoStruct) {
for _, dm := range demos {
fmt.Println("time2:", dm.GetTime())
}
}
// 单个
func GetOneTime(demo DemoInterface) {
fmt.Println("time:", demo.GetTime())
}
func main() {
ds1 := DemoStruct{}
GetOneTime(ds1)
ds2 := DemoStruct{}
GetAllTime1([]DemoStruct{ds1, ds2}) // 1.错误
GetAllTime2([]DemoStruct{ds1, ds2}) // 2.正确
}
```
这种在`golang`里面不能这样实现吗,还是其他原因,报错提示为将`[]DemoInterface`作为一个整体看待而不是一个数组。
```
GetAllTime1([]DemoStruct{ds1, ds2}) // 1.错误
//DemoStruct结构实现了DemoInterface接口,所以接口的变量才可赋值为DemoStruct结构类型的值
//但是结构类型、接口类型、切片类型都是独立的类型,[]DemoInterface切片和[]DemoStruct是两个类型
//即切片的元素才可被赋值为DemoStruct结构的值。
GetAllTime1([]DemoInterface{ds1, ds2})
---------------------------或如下
var ditf = make([]DemoInterface, 2) //定义接口切片
ditf[0] = ds1;ditf[1] = ds2;GetAllTime1(ditf) // 正确
```
#1