我在尝试将切片类型扩展为Go中的常规类型时遇到了一些困难.我已经创建了一个示例代码来解释我的问题.玩地面版
package main
import "fmt"
type Sequencer interface {
Mean() float64
}
type Sequence []int
func (s Sequence) Mean() float64 {
sum := 0.0
for _, el := range s {
sum += float64(el)
}
return sum / float64(len(s))
}
func main() {
a := []int{1, 2, 3, 4}
b := Sequence(a)
fmt.Println(b.Mean())
fmt.Println(b[:2].Mean())
c := Sequencer(b)
fmt.Println(c.Mean())
fmt.Println(c[:2].Mean())
}
Run Code Online (Sandbox Code Playgroud)
main()函数的最后一行返回一个错误,指出Sequencer类型的变量不能被切片:
不能切片c(类型序列器)
有没有一种方法可以定义一般类型的切片(int,float64,string,...)而不隐藏切片的很酷的索引功能?
你有
type Sequencer interface {
Mean() float64
}
c := Sequencer(b)
Run Code Online (Sandbox Code Playgroud)
因此,变量c包含满足Sequencer接口的某种类型的值; 该类型有一个Mean方法.这就是我们所能说的,不多也不少.这并不意味着可以对变量c值进行切片.因此,切片表达式c[:2]无效.例如,我们可以定义一个Map满足Sequencer接口但不能切片的类型.例如,如果要切片,c则断言它是一种可以切片的类型c.(Sequence)[:2].
package main
import "fmt"
type Sequencer interface {
Mean() float64
}
type Sequence []int
func (s Sequence) Mean() float64 {
sum := 0.0
for _, el := range s {
sum += float64(el)
}
return sum / float64(len(s))
}
type Map map[string]float64
func (m Map) Mean() float64 {
sum := 0.0
for _, v := range m {
sum += float64(v)
}
return sum / float64(len(m))
}
func main() {
a := []int{1, 2, 3, 4}
b := Sequence(a)
fmt.Println(b.Mean())
fmt.Println(b[:2].Mean())
c := Sequencer(b)
fmt.Println(c.Mean())
fmt.Println(c.(Sequence)[:2].Mean())
m := Map{"one": 3.14159, "two": 2.718}
fmt.Println(m.Mean())
}
Run Code Online (Sandbox Code Playgroud)
输出:
2.5
1.5
2.5
1.5
2.929795
Run Code Online (Sandbox Code Playgroud)