学习Go
并尝试编写以深度为输入的应用,在bitDepth == 8
时,将可变数定义为var y []byte
,当bitDepth == 10
时,定义变量{ {1}}
在Go中执行此操作的正确方法是什么?
答案 0 :(得分:1)
由于go中没有泛型,如果使用空接口即interface{}
,则仍需要进行类型断言。
最好的选择是定义一个提供所需功能的接口,并为需要包装的所有数据类型实现它。
package main
type SliceWrapper interface {
Slice(start, end int) SliceWrapper
Index(index int) int
}
func NewSlice(bitDepth int) SliceWrapper {
switch bitDepth {
case 8:
return make(Uint8Wrapper)
case 16:
return make(Uint16Wrapper)
}
}
type Uint8Wrapper []uint8
func (u Uint8Wrapper) Slice(s, e int) SliceWrapper {
return u[s:e]
}
func (u Uint8Wrapper) Index(i int) int {
return u[i]
}
type Uint16Wrapper []uint16
func (u Uint16Wrapper) Slice(s, e int) SliceWrapper {
return u[s:e]
}
func (u Uint16Wrapper) Index(i int) int {
return u[i]
}
您需要的功能比我确定的要多,但它比在任何地方投掷interface{}
更清晰。
答案 1 :(得分:0)
一种方法是:
package main
import (
"fmt"
)
func virtualVar(bitDepth int) interface{} {
var v interface{}
switch bitDepth {
case 8:
y := []byte{1, 2}
v = y
case 16:
y := []uint16{12345, 11000}
v = y
}
return v
}
func main() {
a := virtualVar(8)
b := virtualVar(16)
fmt.Println(a) //[1 2]
fmt.Println(b) //[12345 11000]
}