是否可以定义一个变量,哪个类型取决于Golang中的输入

时间:2016-04-30 03:32:35

标签: go

学习Go并尝试编写以深度为输入的应用,在bitDepth == 8时,将可变数定义为var y []byte,当bitDepth == 10时,定义变量{ {1}}

在Go中执行此操作的正确方法是什么?

2 个答案:

答案 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]
}