cmd行参数string.Contains的行为与硬编码参数

时间:2016-11-21 12:09:43

标签: go

我希望得到一些澄清,说明为什么这两个字符串.Contains()调用的行为方式不同。

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

我可以看到打印出的字符串与硬编码的字符串格式相同但字符串.Contains()没有找到" \ n"。

我猜这是对我的疏忽。任何人都可以解释我错过或误解的内容吗?

1 个答案:

答案 0 :(得分:1)

它的行为不同,因为在硬编码中\ n被视为新行参数。 在命令行参数中,参数类型是字符串,其中给定条件是" \ 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编码)字符组成的字符串;特别是,反斜杠没有特殊含义,字符串可能包含换行符。