はじめに
以前、fmtパッケージにて提供されるprint系の関数についての投稿を行いました。
【Go】print系関数の違い
こちらの投稿にて、ビルトイン関数の print
, println
についても紹介してみては?とコメントをいただいたので、調べてみました。
ビルトイン関数のprint
, println
については私自身の実用経験がないので、単純に調べたことをまとめただけになります。
間違い等あればご指摘ください。
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
また、接尾辞にf
がついたfmt.Printf
などはフォーマットを指定できます。
- ビルトイン関数 print()
一方、ビルトイン関数のprint
では、フォーマットの指定はできないようです。
The print built-in function formats its arguments in an implementation-specific way
とあり、訳すと「実装固有の方法でフォーマットする」という感じのようですが、
正直なところ、この辺りは理解しきれていないです。。
(詳しい方教えていただけるとありがたいです )
まとめ
ざっと調べたところ、
fmtパッケージ Print系関数 | ビルトイン関数 print | |
---|---|---|
パッケージの import | fmt パッケージの import | 無 |
書き込み先 | 標準出力(Fprint系は書き込み先の設定が可能) | 標準エラー |
フォーマット | 「%v」で指定されるデフォルトのフォーマット(Printf系はフォーマットの指定が可能) | 「an implementation-specific way」実装固有の方法? |
の3点が違いのようです。
補足・間違いなどご指摘ください。
参考
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