Maison  >  Article  >  développement back-end  >  Comment obtenir un type sans instance dans Go ?

Comment obtenir un type sans instance dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 06:19:02746parcourir

How to Get a Type Without an Instance in Go?

TypeOf sans instance : Passer le résultat à une fonction

En Go, il est possible d'obtenir un "Type" sans avoir d'instance de ce type. Ceci peut être réalisé grâce à l'utilisation de Reflect.TypeOf(), mais les exemples impliquent généralement une instance.

Obtenir un type sans instance

Pour acquérir un "Type" sans par exemple, l'astuce consiste à commencer par un pointeur vers le type, auquel peut être attribué un zéro "typé". Par la suite, .Elem() peut être utilisé pour obtenir le descripteur Reflect.Type du type pointé, connu sous le nom de type de base.

<code class="go">t := reflect.TypeOf((*int)(nil)).Elem()
fmt.Println(t)

t = reflect.TypeOf((*http.Request)(nil)).Elem()
fmt.Println(t)

t = reflect.TypeOf((*os.File)(nil)).Elem()
fmt.Println(t)</code>

Exemple de sortie :

int
http.Request
os.File

Transmission de types

Si vous devez transmettre des types et les utiliser dans des commutateurs, créez-les et stockez-les dans des variables globales pour référence :

<code class="go">var (
    intType         = reflect.TypeOf((*int)(nil))
    httpRequestType = reflect.TypeOf((*http.Request)(nil))
    osFileType      = reflect.TypeOf((*os.File)(nil))
    int64Type       = reflect.TypeOf((*uint64)(nil))
)

func printType(t reflect.Type) {
    switch t {
    case intType:
        fmt.Println("Type: int")
    case httpRequestType:
        fmt.Println("Type: http.request")
    case osFileType:
        fmt.Println("Type: os.file")
    case int64Type:
        fmt.Println("Type: uint64")
    default:
        fmt.Println("Type: Other")
    }
}

func main() {
    printType(intType)
    printType(httpRequestType)
    printType(osFileType)
    printType(int64Type)
}</code>

Approche simplifiée

Si vous utilisez les types uniquement à des fins de comparaison, envisagez d'utiliser des constantes au lieu de refléter.Type :

<code class="go">type TypeDesc int

const (
    typeInt TypeDesc = iota
    typeHttpRequest
    typeOsFile
    typeInt64
)

func printType(t TypeDesc) {
    switch t {
    case typeInt:
        fmt.Println("Type: int")
    case typeHttpRequest:
        fmt.Println("Type: http.request")
    case typeOsFile:
        fmt.Println("Type: os.file")
    case typeInt64:
        fmt.Println("Type: uint64")
    default:
        fmt.Println("Type: Other")
    }
}

func main() {
    printType(typeInt)
    printType(typeHttpRequest)
    printType(typeOsFile)
    printType(typeInt64)
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn