2016-11-21 2 views
0

Ich bin auf der Suche nach etwas Klärung warum diese beiden Strings.Contains() Aufrufe verhalten sich anders.cmd Zeile Parameter string.Contains Verhalten anders als hardcoded Parameter

package main 

import (
    "strings" 
    "os" 
    "errors" 
    "fmt" 
) 

func main() { 

    hardcoded := "col1,col2,col3\nval1,val2,val3" 
    if strings.Contains(hardcoded, "\n") == false { 
     panic(errors.New("The hardcoded string should contain a new line")) 
    } 
    fmt.Println("New line found in hardcoded string") 

    if len(os.Args) == 2 { 
     fmt.Println("parameter:", os.Args[1]) 
     if strings.Contains(os.Args[1], "\n") == false { 
      panic(errors.New("The parameter string should contain a new line.")) 
     } 
     fmt.Println("New line found in parameter string") 
    } 

} 

Wenn ich diese laufen mit

go run input-tester.go col1,col2,col3\\nval1,val2,val3 

ich folgendes

New line found in hardcoded string 
parameter: col1,col2,col3\nval1,val2,val3 
panic: The parameter string should contain a new line. 

goroutine 1 [running]: 
panic(0x497100, 0xc42000e310) 
    /usr/local/go/src/runtime/panic.go:500 +0x1a1 
main.main() 
    /home/user/Desktop/input-tester.go:21 +0x343 
exit status 2 

Ich kann erhalten sehen, dass die Zeichenfolge gedruckt wird das gleiche Format wie die Zeichenfolge, die noch fest einprogrammiert wird die string.Contains() findet das "\ n" nicht.

Ich schätze, das ist ein Versehen meinerseits. Kann mir jemand erklären, was ich vermisse oder was ich falsch verstehe?

+0

Es funktioniert, wenn wir '\ n' für Befehlszeilenargumente – Priyanka

+0

Oh lieber verwenden - scheint eine der vorherigen Befragten ihren Kommentar gelöscht werden, dann diese Frage Downvoted, dann mein Profil zugegriffen und Downvoted alle meine bisherigen Fragen: D Armer John – Airomega

Antwort

1

Es verhält sich anders, weil in hardcoded \ n als neue Zeile Parameter betrachtet wird. Und in Befehlszeilenargumenten ist der Argumenttyp string, wobei die angegebene Bedingung für "\ n" gilt, was als neuer Zeilenparameter gilt. Einfach `\ n compares mit zwei aufeinanderfolgenden Zeichen" \ "und" n "nicht mit" \ n "ein neues Zeilenzeichen.

Also für Befehlszeilenargumente verwenden,

if strings.Contains(os.Args[1], `\n`) == false { 
     panic(errors.New("The parameter string should contain a new line.")) 
    } 

Referenz: https://golang.org/ref/spec#String_literals

Raw Stringliterale sind Zeichenfolgen zwischen Hochkommata, wie in foo. Innerhalb der Anführungszeichen kann ein beliebiges Zeichen mit Ausnahme des Rückwärtszitats angezeigt werden. Der Wert eines rohen String-Literals ist die Zeichenfolge, die aus den nicht interpretierten (implizit UTF-8-codierten) Zeichen zwischen den Anführungszeichen besteht. insbesondere haben Backslashes keine spezielle Bedeutung und die Zeichenfolge kann Zeilenumbrüche enthalten.

+0

Große Antwort. Dank dafür. – Airomega