web-dev-qa-db-fra.com

Conversion d'un type personnalisé en chaîne dans Go

Dans cet exemple bizarre, quelqu'un a créé un nouveau type qui n'est en réalité qu'une chaîne: 

type CustomType string

const (
        Foobar CustomType = "somestring"
)

func SomeFunction() string {
        return Foobar
}

Cependant, ce code ne parvient pas à compiler:

ne peut pas utiliser Foobar (type CustomType) comme chaîne de type dans l'argument de retour

Comment répareriez-vous SomeFunction afin qu'il puisse renvoyer la valeur de chaîne de Foobar ("somestring")?

6
DaveUK

Convertir la valeur en chaîne:

func SomeFunction() string {
        return string(Foobar)
}
15
ThunderCat

Mieux vaut définir une fonction String pour Customtype - cela peut vous rendre la vie plus facile au fil du temps - vous contrôlez mieux les choses au fur et à mesure que la structure évolue. Si vous avez vraiment besoin de SomeFunction, laissez-le retourner Foobar.String()

   package main

    import (
        "fmt"
    )

    type CustomType string

    const (
        Foobar CustomType = "somestring"
    )

    func main() {
        fmt.Println("Hello, playground", Foobar)
        fmt.Printf("%s", Foobar)
        fmt.Println("\n\n")
        fmt.Println(SomeFunction())
    }

    func (c CustomType) String() string {
        fmt.Println("Executing String() for CustomType!")
        return string(c)
    }

    func SomeFunction() string {
        return Foobar.String()
    }

https://play.golang.org/p/jMKMcQjQj3

3
Ravi

Pour chaque type T, il existe une opération de conversion correspondante T (x) qui convertit la valeur x en type T. Conversion d'un type en un autre est autorisé si les deux ont le même type sous-jacent ou si les deux sont des types de pointeurs non nommés qui pointent vers des variables du même type sous-jacent; ces conversions changent le type mais pas le représentation de la valeur. Si x est assignable à T, une conversion est autorisé mais est généralement redondant. - Extrait de The Go Langage de programmation - de Alan A. A. Donovan

Selon votre exemple, voici quelques exemples qui renverront la valeur.

package main

import "fmt"

type CustomType string

const (
    Foobar CustomType = "somestring"
)

func SomeFunction() CustomType {
    return Foobar
}
func SomeOtherFunction() string {
    return string(Foobar)
}
func SomeOtherFunction2() CustomType {
    return CustomType("somestring") // Here value is a static string.
}
func main() {
    fmt.Println(SomeFunction())
    fmt.Println(SomeOtherFunction())
    fmt.Println(SomeOtherFunction2())
}

Il produira:

somestring
somestring
somestring

Le lien Go Playground

0
Krishnadas PC