2016-11-21 30 views
0

我期待澄清爲什麼這兩個strings.Contains()調用的行爲不同。cmd行參數字符串。包含行爲不同於硬編碼參數

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") 
    } 

} 

如果我跑這跟

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

我得到以下

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 

我可以看到字符串打印出來是相同的格式字符串時卻把硬編碼string.Contains()沒有找到「\ n」。

我猜這是我的一個疏忽。任何人都可以解釋我失蹤或誤解?

+0

它的工作原理,如果我們使用'\ n'的命令行參數 – Priyanka

+0

哦,親愛的 - 似乎以前的受訪者刪除他們的評論,然後downvoted這個問題,然後訪問我的個人資料和downvoted我以前所有的問題:d可憐的約翰 – Airomega

回答

1

它的行爲不同,因爲在硬編碼\ n被視爲新的行參數。 而在命令行參數中,參數類型是字符串,其中給定的條件是「\ n」,它被認爲是新的行參數。 只需\ n將兩個連續字符「\」和「n」與一個新行字符進行比較。

所以對於命令行參數使用,

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

參考:https://golang.org/ref/spec#String_literals

原始字符串文字是反引號之間的字符序列,如foo。在引號內,任何字符都可能出現,除了後面的引號。原始字符串文字的值是由引號之間的未解釋(隱式UTF-8編碼)字符組成的字符串;特別是反斜槓沒有特殊含義,字符串可能包含換行符。

+0

很棒的回答。感謝那。 – Airomega

相關問題