2016-04-30 6 views
-1

Lernen hängt von Eingabe ist Go und versucht, eine App zu schreiben, die Bit-Tiefe als Eingabe, wenn bitDepth == 8, eine varable als var y []byte definieren, wenn bitDepth == 10, eine variable var y []uint16Ist es möglich, eine Variable zu definieren, welche Art in Golang

definieren

Was ist der richtige Weg, um es in Go zu tun?

+2

Der deklarierte Typ einer Variablen kann nicht von den Laufzeitwerten abhängen. Sie sagen nicht, welches Problem Sie lösen möchten, aber https://godoc.org/image#Image ist wahrscheinlich relevant - auch wenn Sie Image nicht direkt verwenden können, kann der Quellcode nützlich sein. –

+0

@PaulHankin Ich habe einen kurzen Blick auf das Bild-Paket, es sieht aus wie nur 8 Bit (Uint8) Pixeldaten unterstützen. Keine Lösung, um 10 Bits zu unterstützen. –

Antwort

0

ein Weg ist:

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

Da es keine Generika unterwegs sind, werden Sie noch Art Behauptungen zu tun haben, wenn Sie eine leere Schnittstelle verwenden, das heißt interface{}.

Die beste Option besteht darin, eine Schnittstelle zu definieren, die alle benötigten Funktionen bereitstellt, und sie für alle Datentypen zu implementieren, die Sie umbrechen müssen.

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

Sie mehr Funktionalität benötigen, als dass ich sicher bin, aber es ist viel sauberer als interface{} überall herum zu werfen.

Verwandte Themen