はじめに
以前、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