我希望得到一些澄清,说明为什么这两个字符串.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"。
我猜这是对我的疏忽。任何人都可以解释我错过或误解的内容吗?
答案 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编码)字符组成的字符串;特别是,反斜杠没有特殊含义,字符串可能包含换行符。