在go / golang中表示换行的最便携/跨平台方式是什么?

时间:2013-01-24 04:15:31

标签: cross-platform go newline portability

目前,为了代表go程序中的换行符,我使用\n。例如:

package main

import "fmt"


func main() {
    fmt.Printf("%d is %s \n", 'U', string(85))
}

...将产生85 is U后跟换行符。

但是,这似乎不是跨平台的。查看其他语言,PHP使用全局常量(PHP_EOL)表示它。 {/ 1}是在go / golang中以跨平台特定方式表示换行符的正确方法吗?

3 个答案:

答案 0 :(得分:18)

我对此感到好奇,所以决定看看fmt.Println究竟做了什么。 http://golang.org/src/pkg/fmt/print.go

如果滚动到最底部,您会看到始终使用if addnewline的{​​{1}}。如果这是最“跨平台”的做法,我就不能说出来了,并且在最初阶段最初与linux绑定,但这就是std lib的用途。

我原本打算建议只使用\n,这可能仍然有效,好像当前功能不合适,可以提交错误,然后代码只需要使用最新编译去工具链。

答案 1 :(得分:10)

让操作系统确定在多个上下文中出现的换行符是错误的。你真正想知道的是“记录”分隔符是什么,Go假设你是程序员应该知道的。

即使二进制文件在Windows上运行,它也可能正在消耗Unix操作系统中的文件。

行结尾取决于文件或文档的来源是什么,而不是二进制文件运行的操作系统。

答案 2 :(得分:6)

您始终可以使用特定于操作系统的文件来声明某些常量。就像_test.go文件仅在执行go test时使用一样,_[os].go仅在构建到该目标平台时包含。

基本上你需要添加以下文件:

 - main.go
 - main_darwin.go     // Mac OSX
 - main_windows.go    // Windows
 - main_linux.go      // Linux

您可以在每个main_[os].go文件中声明一个LineBreak常量,并将您的逻辑放在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)
}