Posted at

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

More than 3 years have passed since last update.


はじめに

以前、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