目前,为了表示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
如果滚动到最底部,您将看到始终使用n
的if 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