現在、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?
私はこれに興味を持ったので、fmt.Println
によって正確に何が行われるかを確認することにしました。 http://golang.org/src/pkg/fmt/print.go
一番下までスクロールすると、if addnewline
が表示されます。\n
は常に使用されています。これが最も「クロスプラットフォーム」な方法であるかどうか、私はほとんど言うことができません。そして、goは当初はLinuxに関連付けられていましたが、それがstd libの場合です。
私は当初、fmt.Fprintln
の使用のみを提案していましたが、現在の機能が適切でなく、バグを報告し、コードを最新のGoツールチェーンでコンパイルするだけでよいので、これはまだ有効である可能性があります。
OSに改行文字が何であるかを判断させることは、多くの状況で間違っていると発生します。あなたが本当に知りたいのは「レコード」セパレータとは何かであり、Goはプログラマとしてあなたがそれを知っているべきだと想定しています。
バイナリがWindowsで実行されている場合でも、Unix OSのファイルを使用している可能性があります。
行末は、ファイルまたはドキュメントのソースが、バイナリが実行されているOSではなく行末であると述べたことによって決定されます。
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)
}