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

是否可以定义一个变量,该变量的类型取决于Golang中的输入,go,Go,学习Go并尝试编写一个以位深度为输入的应用程序,当bitDepth==8时,将变量定义为vary[]byte,当bitDepth==10时,定义变量vary[]uint16 在围棋中正确的方法是什么?一种方法是: package main import ( "fmt" ) func virtualVar(bitDepth int) interface{} { var v interface{} switch bitDepth { case 8:

学习
Go
并尝试编写一个以位深度为输入的应用程序,当
bitDepth==8
时,将变量定义为
vary[]byte
,当
bitDepth==10
时,定义变量
vary[]uint16

在围棋中正确的方法是什么?

一种方法是:

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

因为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]
}

您需要更多的功能,但它比到处抛出
接口{}
要干净得多。

声明的变量类型不能依赖于运行时值。你没有说你想解决什么问题,但可能是相关的——即使你不能直接使用Image,它的源代码也可能有用。@PaulHankin我快速看了一下Image软件包,它看起来只支持8位(uint8)像素数据。没有支持10位的解决方案。