2016-08-25 2 views
2

möchte ich eine Funktion func format(s []string) string, so dass für zwei Streich Scheiben s1 und s2, wenn reflect.DeepEqual(s1, s2) == false, dann format(s1) != format(s2).Golang: print String-Array in einer einzigartigen Art und Weise

Wenn ich einfach fmt.Sprint verwenden, werden die Scheiben ["a", "b", "c"] und ["a b", "c"] alle als [a b c] gedruckt, was unerwünscht ist; und es gibt auch das Problem von string([]byte('4', 0, '2')) mit der gleichen Darstellung wie "42".

Antwort

8

Verwenden Sie ein Format Verb, das die Datenstruktur zeigt, wie %#v. In diesem Fall funktioniert %q auch gut, weil die primitiven Typen alle Zeichenfolgen sind.

fmt.Printf("%#v\n", []string{"a", "b", "c"}) 
fmt.Printf("%#v\n", []string{"a b", "c"}) 

// prints 
// []string{"a", "b", "c"} 
// []string{"a b", "c"} 
+0

Ha, das ist eine sehr gute Lösung - I sollte https://golang.org/pkg/fmt/ genauer gelesen haben. Vielen Dank! – Ted

1

können Sie verwenden:

func format(s1, s2 []string) string { 
    if reflect.DeepEqual(s1, s2) { 
     return "%v\n" 
    } 
    return "%q\n" 
} 

Wie dieser Arbeitsprobe (The Go Playground):

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    s1, s2 := []string{"a", "b", "c"}, []string{"a b", "c"} 
    frmat := format(s1, s2) 
    fmt.Printf(frmat, s1) // ["a" "b" "c"] 
    fmt.Printf(frmat, s2) // ["a b" "c"] 

    s2 = []string{"a", "b", "c"} 
    frmat = format(s1, s2) 
    fmt.Printf(frmat, s1) // ["a" "b" "c"] 
    fmt.Printf(frmat, s2) // ["a b" "c"] 
} 

func format(s1, s2 []string) string { 
    if reflect.DeepEqual(s1, s2) { 
     return "%v\n" 
    } 
    return "%q\n" 
} 

Ausgang:

["a" "b" "c"] 
["a b" "c"] 
[a b c] 
[a b c] 
+3

Ihre Antworten sind viel zu lang und (vielleicht unnötig) illustrativ, auch wenn die Frage eine kurze Antwort mit vielleicht 1-2 Zeilen Code erfordert. Ich habe trotzdem gewählt, um keine Beleidigung zu vermitteln, da ich einiges von deinen anderen Antworten gelernt habe. – Sridhar

Verwandte Themen