【Go】fmt.Print とビルトイン関数の print の違い

  • 17
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

以前、fmtパッケージにて提供されるprint系の関数についての投稿を行いました。
【Go】print系関数の違い

こちらの投稿にて、ビルトイン関数の print, println についても紹介してみては?とコメントをいただいたので、調べてみました。

ビルトイン関数のprint, printlnについては私自身の実用経験がないので、単純に調べたことをまとめただけになります。
間違い等あればご指摘ください。 :raised_hands:

fmt.Print() について

fmt.Print()については「【Go】print系関数の違い」にてまとめさせていただきましたので、そちらをご参照ください。

ビルトイン関数 print, println について

まずは print について公式のドキュメントを見てみましょう。
builtin - The Go Programming Language

The print built-in function formats its arguments in an implementation-specific way and writes the result to standard error. Print is useful for bootstrapping and debugging; it is not guaranteed to stay in the language.

訳すと、

- print関数は引数をフォーマットして標準エラーに書き込みます。ブートストラッピングやデバッグに役立ちますが、このまま言語に残される保証はありません。

といった感じでしょうか?

ちなみに、println については前述の投稿でも紹介の通り、
接尾辞「ln」がつくのでオペランド間にスペースが入り、最後に改行が加えられるという点がprintと異なります。

fmt.Print() とビルトイン関数 print() の違いは?

それでは、fmt.Print() とビルトイン関数 print() の違いをあげていきましょう。

1. パッケージの import

- fmt.Print()

fmtパッケージで提供されるPrint関数は当然ながらfmtパッケージをimportする必要があります。

import "fmt"

fmt.Print("hello")

- ビルトイン関数 print()

一方、ビルトイン関数は組み込みなので、そのまま使用できます。

print("hello")

2. 書き込み先

- fmt.Print()

fmt.Print()では、標準出力に書き込まれます。
また、fmt.Fprint()とすると書き込み先を設定することも可能です。

- ビルトイン関数 print()

一方、ビルトイン関数では、
ドキュメントにある通り、標準エラーに書き込まれます。

3. フォーマット

- fmt.Print()

fmt.Print() ではデフォルトのフォーマットでフォーマットされます。
デフォルトのフォーマットはこちら。

bool:                    %t
int, int8 etc.:          %d
uint, uint8 etc.:        %d, %x if printed with %#v
float32, complex64, etc: %g
string:                  %s
chan:                    %p
pointer:                 %p

https://golang.org/pkg/fmt/

また、接尾辞にfがついたfmt.Printfなどはフォーマットを指定できます。

- ビルトイン関数 print()

一方、ビルトイン関数のprintでは、フォーマットの指定はできないようです。

The print built-in function formats its arguments in an implementation-specific way

とあり、訳すと「実装固有の方法でフォーマットする」という感じのようですが、
正直なところ、この辺りは理解しきれていないです。。
(詳しい方教えていただけるとありがたいです :sweat_smile:

まとめ

ざっと調べたところ、

fmtパッケージ Print系関数 ビルトイン関数 print
パッケージの import fmt パッケージの import
書き込み先 標準出力(Fprint系は書き込み先の設定が可能) 標準エラー
フォーマット 「%v」で指定されるデフォルトのフォーマット(Printf系はフォーマットの指定が可能) 「an implementation-specific way」実装固有の方法?

の3点が違いのようです。

補足・間違いなどご指摘ください。 :pray:

参考

builtin - The Go Programming Language
https://golang.org/pkg/fmt/
http://stackoverflow.com/questions/14680255/whats-the-difference-between-fmt-println-and-println-in-go