在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

如果滚动到最底部,您将看到始终使用nif addnewline。我很难说这是否是最"跨平台"的方式,而且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

您可以在每个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 = "rn"

只需在您的main.go文件中,编写代码并参考LineBreak

主去

package main
import "fmt"

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

您可以使用os.PathSeparator

func main() {
    var PS = fmt.Sprintf("%v", os.PathSeparator)
    var LineBreak = "n"
    if PS != "/" {
        LineBreak = "rn"
    }
    fmt.Printf("Line Break %v", LineBreak)
}

https://play.golang.com/p/UTnBbTJyL9c

相关内容

  • 没有找到相关文章

最新更新