Goのfmt.Println()とprintln()の違い


117

下記に示されるように、両方fmt.Println()println()ゴーで同じ出力を与えます:Hello world!

しかし、それらは互いにどのように違うのですか?

スニペット1、fmtパッケージを使用。

package main

import (
    "fmt"
)

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

fmtパッケージなしのスニペット2 。

package main

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

回答:


98

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

言語開発者にとって、println依存関係がないことは便利ですが、fmtパッケージまたはそれに似たもの(logたとえば)を使用するのが道です。

することができますように実装で参照print(ln)機能であってもリモートで異なる出力モードをサポートするために設計されており、主にデバッグ・ツールですされていません。


108

ネモの答えを基にするには:

println言語に組み込まれた関数です。これは、仕様のブートストラップセクションにあります。リンクから:

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

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

したがって、依存関係は(コンパイラーに組み込まれている)欠けているため、開発者にとっては有用ですが、量産コードには含まれていません。また、重要なことに注意するprintと、println レポートにはstderr、ありませんstdout

fmtただし、によって提供されるファミリは、量産コードに組み込まれるように構築されています。stdout特に指定のない限り、彼らは予想通りにに報告します。彼らは、より汎用性があります(fmt.Fprint*いずれかに報告することができますio.Writerよう、os.Stdoutos.Stderr、あるいはnet.Connタイプ。)と実装固有のものではありません。

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


3

ここで違いがわかります:

rangeOverIntsAndStrings(1、5)

func rangeOverIntsAndStrings(args ...interface{}) {
    for _, v := range args {
        println(v)
    }
}

//出力

(0x108f060,0x10c5358)
(0x108f060,0x10c5360)

func rangeOverIntsAndStrings(args ...interface{}) {
    for _, v := range args {
        fmt.Println(v)
    }
}

//出力

1
5

1

違いとして、これは一例です。

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

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


11
あなたの言っていることがわかりません。
Pierrot

0

興味深い例:

  netpoll git:(develop)  cat test.go
package main

import "fmt"

func main() {
        a := new(struct{})
        b := new(struct{})
        println(a, b, a == b)

        c := new(struct{})
        d := new(struct{})
        fmt.Printf("%v %v %v\n", c, d, c == d)
}
  netpoll git:(develop)  go run test.go       
0xc000074f47 0xc000074f47 false
&{} &{} true
  netpoll git:(develop)  go run -gcflags="-m" test.go
# command-line-arguments
./test.go:12:12: inlining call to fmt.Printf
./test.go:6:10: new(struct {}) does not escape
./test.go:7:10: new(struct {}) does not escape
./test.go:10:10: new(struct {}) escapes to heap
./test.go:11:10: new(struct {}) escapes to heap
./test.go:12:35: c == d escapes to heap
./test.go:12:12: []interface {} literal does not escape
<autogenerated>:1: .this does not escape
0xc000074f47 0xc000074f47 false
&{} &{} true

これは、間に何か差であるprintlnfmt.Printf

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.