web-dev-qa-db-ja.com

goのfmt.Println()とprintln()の違いは何ですか

Goでは、何かを印刷したい場合、次のようにします。

import "fmt"
func main(){
    fmt.Println("Hello world!")
}

しかし、fmtをインポートしなくても同じことができることがわかりました。

func main(){
    println("Hello world!")
}

誰か説明していただけますか?

101
YulCheney

printlnは(ランタイムへの)組み込み関数であり、最終的には削除される可能性がありますが、fmtパッケージは標準ライブラリにあり、永続化されます。そのトピックの 仕様 を参照してください。

言語開発者にとっては、依存関係のないprintlnがあると便利ですが、行く方法はfmtパッケージまたは同様のもの(たとえば[log)を使用することです。

実装を参照print(ln)関数は、異なる出力モードをリモートでサポートするように設計されておらず、主にデバッグツールです。

82
nemo

Nemoの答えに基づいて作成するには:

printlnは、言語に組み込まれた関数です。 spec のBootstrappingセクションにあります。リンクから:

現在の実装は、ブートストラップ中に役立ついくつかの組み込み関数を提供します。これらの関数は完全性のために文書化されていますが、言語にとどまることが保証されていません。結果を返しません。

Function   Behavior

print      prints all arguments; formatting of arguments is implementation-specific
println    like print but prints spaces between arguments and a newline at the end

したがって、依存関係(コンパイラーに組み込まれている)がないため、開発者にとっては便利ですが、実動コードにはありません。 printprintlnは、stderrではなく、stdoutに報告することに注意することも重要です。

ただし、fmtが提供するファミリは、製品コードに組み込まれています。特に指定しない限り、それらはstdoutに予測可能な形で報告します。より多用途です(fmt.Fprint*は任意のio.Writer、 といった os.Stdoutos.Stderr、またはnet.Conn type。)、実装固有ではありません。

出力を担当するほとんどのパッケージには、fmtなどの依存関係としてlogがあります。プログラムが本番環境で何かを出力する場合、fmtがおそらくあなたが望むパッケージです。

98
Alexander Bauer

違いについては、 this が例です。

println()は、関数testのアドレスへのポインターポイントを出力します。

fmt.Println()は、関数のアドレスを出力します。

1
Steven