目前,为了表示 go 程序中的换行符,我使用\n
. 例如:
package main
import "fmt"
func main() {
fmt.Printf("%d is %s \n", 'U', string(85))
}
... 将产生85 is U
后跟换行符。
但是,这似乎并不是跨平台的。看看其他语言,PHP 用一个全局常量 ( PHP_EOL
) 来表示它。\n
在 go / golang 中以跨平台特定方式表示换行符的正确方法是什么?
目前,为了表示 go 程序中的换行符,我使用\n
. 例如:
package main
import "fmt"
func main() {
fmt.Printf("%d is %s \n", 'U', string(85))
}
... 将产生85 is U
后跟换行符。
但是,这似乎并不是跨平台的。看看其他语言,PHP 用一个全局常量 ( PHP_EOL
) 来表示它。\n
在 go / golang 中以跨平台特定方式表示换行符的正确方法是什么?
我对此感到好奇,所以决定看看究竟是做什么的fmt.Println
。http://golang.org/src/pkg/fmt/print.go
如果滚动到最底部,您将看到始终使用的if addnewline
位置\n
。我很难说这是否是最“跨平台”的方式,并且 Go 在早期最初与 linux 相关联,但这就是 std lib 的所在。
我最初打算建议只使用fmt.Fprintln
,这可能仍然有效,就好像当前功能不合适一样,可以提交一个错误,然后只需要使用最新的 Go 工具链编译代码。
让操作系统确定换行符在许多情况下是错误的。您真正想知道的是“记录”分隔符是什么,Go 假设您作为程序员应该知道这一点。
即使二进制文件在 Windows 上运行,它也可能正在使用来自 Unix 操作系统的文件。
行尾取决于文件或文档的来源所说的行尾,而不是运行二进制文件的操作系统。
您始终可以使用特定于操作系统的文件来声明某些常量。就像_test.go
文件仅在执行时使用一样go test
,_[os].go
仅在构建到该目标平台时才包含。
基本上你需要添加以下文件:
- main.go
- main_darwin.go // Mac OSX
- main_windows.go // Windows
- main_linux.go // Linux
您可以在每个文件中声明一个 LineBreak 常量,main_[os].go
并将您的逻辑放在main.go
.
你文件的内容看起来像这样:
main_darwin.go
package somepkg
const LineBreak = "\n"
main_linux.go
package somepkg
const LineBreak = "\n"
main_windows.go
package somepkg
const LineBreak = "\r\n"
只需在您的main.go
文件中,编写代码并参考LineBreak
main.go
package main
import "fmt"
func main() {
fmt.Printf("%d is %s %s", 'U', string(85), LineBreak)
}