42

目前,为了表示 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 中以跨平台特定方式表示换行符的正确方法是什么?

4

3 回答 3

26

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

如果滚动到最底部,您将看到始终使用的if addnewline位置\n。我很难说这是否是最“跨平台”的方式,并且 Go 在早期最初与 linux 相关联,但这就是 std lib 的所在。

我最初打算建议只使用fmt.Fprintln,这可能仍然有效,就好像当前功能不合适一样,可以提交一个错误,然后只需要使用最新的 Go 工具链编译代码。

于 2013-01-24T04:50:45.880 回答
17

让操作系统确定换行符在许多情况下是错误的。您真正想知道的是“记录”分隔符是什么,Go 假设您作为程序员应该知道这一点。

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

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

于 2013-01-24T21:18:08.570 回答
16

您始终可以使用特定于操作系统的文件来声明某些常量。就像_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)
}
于 2018-04-22T07:05:20.430 回答