2011-11-08 2 views
0

Je souhaite qu'il existe un moyen efficace d'imprimer mon format. Comme je sais que convertir en chaîne peut se produire problème de performance. Y a-t-il une meilleure méthode?manière efficace d'imprimer mon format

package main 

import "fmt" 

type T struct { 
    order_no [5]byte 
    qty int32 
} 
func (t T)String() string { 
    return fmt.Sprint("order_no=", t.order_no, 
    "qty=", t.qty) 
} 

func main() { 
     v := T{[5]byte{'A','0','0','0','1'}, 100} 

    fmt.Println(v) 
}  

La sortie est order_no=[65 48 48 48 49]qty=100 Je souhaite qu'il sera order_no=A0001 qty=100.

BTW, pourquoi le travail func (t T)String() string et func (t *T)String() string ne peuvent pas travailler (sur goplay)

+1

'' est un V' T', pas un '* T'. Par conséquent, son jeu de méthodes n'inclut pas les méthodes sur '* T' (bien qu'un' * T' * ait * les méthodes de 'T'). Go vous permet d'appeler de toute façon les méthodes '* T' sur' v' (cas particulier), mais seulement tant que v est adressable. La valeur d'une interface n'est pas adressable, donc quand vous passez 'v' comme paramètre d'interface' fmt.Println', 'fmt.Println' ne peut pas appeler' func (t * T) String() string' dessus, mais il peut appeler un 'func (t T) String() string'. Pour contourner cela, vous pouvez passer '& v'. – SteveMcQwark

+0

Merci, Steve, dans mon cas, dois-je utiliser fmt.Println (& v) au lieu de fmt.Println (v) pour empêcher une structure de copie? –

+0

Généralement, oui, bien que vous puissiez aussi déclarer v comme 'v: = & T {...}' et le transmettre directement. Parfois, il est logique de faire circuler une structure par valeur, mais ici, puisque vous la passez à une interface et qu'elle est plus grande qu'un mot machine, il n'y en a vraiment pas. – SteveMcQwark

Répondre

1
package main 

import "fmt" 

type T struct { 
    order_no [5]byte 
    qty  int32 
} 

func (t T) String() string { 
    return fmt.Sprint(
     "order_no=", string(t.order_no[:]), 
     " qty=", t.qty, 
    ) 
} 

func main() { 
    v := T{[5]byte{'A', '0', '0', '0', '1'}, 100} 
    fmt.Println(v) 
} 

Sortie:.

order_no=A0001 qty=100 
+0

Est-ce que string() convert crée une nouvelle allocation de mémoire? Si c'est une chaîne nulle de C, est-ce que je peux utiliser de la même manière? –

Questions connexes