web-dev-qa-db-ja.com

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は、移動中にクロスプラットフォーム固有の方法で改行を表す正しい方法です/ golang?

27
carbocation

私はこれに興味を持ったので、fmt.Printlnによって正確に何が行われるかを確認することにしました。 http://golang.org/src/pkg/fmt/print.go

一番下までスクロールすると、if addnewlineが表示されます。\nは常に使用されています。これが最も「クロスプラットフォーム」な方法であるかどうか、私はほとんど言うことができません。そして、goは当初はLinuxに関連付けられていましたが、それがstd libの場合です。

私は当初、fmt.Fprintlnの使用のみを提案していましたが、現在の機能が適切でなく、バ​​グを報告し、コードを最新のGoツールチェーンでコンパイルするだけでよいので、これはまだ有効である可能性があります。

18
dskinner

OSに改行文字が何であるかを判断させることは、多くの状況で間違っていると発生します。あなたが本当に知りたいのは「レコード」セパレータとは何かであり、Goはプログラマとしてあなたがそれを知っているべきだと想定しています。

バイナリがWindowsで実行されている場合でも、Unix OSのファイルを使用している可能性があります。

行末は、ファイルまたはドキュメントのソースが、バイナリが実行されているOSではなく行末であると述べたことによって決定されます。

10
Jeremy Wall

OS固有のファイルを常に使用して、特定の定数を宣言できます。 _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)
}
6
jucardi