golang中的常规切片类型?

prl*_*900 4 types go slice

我在尝试将切片类型扩展为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,...)而不隐藏切片的很酷的索引功能?

pet*_*rSO 5

你有

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)