goの出力の話

- golang

golangの出力

最近インターンの影響でgolangなるものを勉強し始めて、今まで静的型付け言語に触れてこず、適当にコードを書いてきたツケを払わされています。

そんなことはさておき、pythonなら出力と言えばprint(), jsならconsole.log()が基本的に使われていて気にすることもなかったのですが、A Tour of Goをやっているといくつか出力の方法があることに気づきます。 そのあたりの違いをまとめていきたいと思います。

ちなみに参考にするリンクはGo言語のPrint・Println・Printfについて | エンジニアへの道Go で値を出力する方法です。 これらを読む方が百倍速く理解できると思います。

fmt.Print()

fmt.Print()はオペランドをデフォルトのフォーマットで標準出力への書き込みを行います。

ちなみにオペランドとは「数式を構成する要素のうち、演算の対象となる値や変数、定数」のことみたいです。

実際に出力すると以下のようにオペランド、つまり"Hello""World!", "Hello""golang!"Pがそのまま出力されていますね。このように改行も半角スペースも入らない出力が得られるのがfmt.Print()の特徴みたいですね

package main

import "fmt"
func main() {
    fmt.Print("Hello", "World!")
    fmt.Print("Hello", "golang!")
}
// HelloWorld!Hellogolang!

fmt.Println()

fmt.Println()はオペランドをデフォルトのフォーマットで標準出力に書き込みますが、この際にオペランドの間に半角スペースが入り、文字列の最後に開業が追加されます。

package main

import "fmt"
func main() {
    fmt.Println("Hello", "World!")
    fmt.Println("Hello", "golang!")
}
// Hello World!
// Hello golang!

これは体感としてpythonのprint()に近いですね

fmt.Printf()

fmt.Printf()では指定されたフォーマットに従い、フォーマットを行い、標準出力に書き込みます。 フォーマットは%dのようなverbと呼ばれる形式で指定することになります。 変数valを10進数表記で出力したい場合はfmt.Printf("%d", val)のように指定します。 verbは様々用意されており、このような出力が可能です。

package main

import "fmt"

func main() {
    val := 123
    fmt.Printf("%d\n", val)   // 10進数
    fmt.Printf("%+d\n", val)  // 10進数・正の整数でも符号を付与
    fmt.Printf("%6d\n", val)  // 10進数・指定した桁数だけ左スペース埋め
    fmt.Printf("%-6d\n", val) // 10進数・指定した桁数だけ右スペース埋め
    fmt.Printf("%06d\n", val) // 10進数・指定した桁数だけ左0埋め
    fmt.Printf("%b\n", val)   // 2進数
    fmt.Printf("%o\n", val)   // 8進数
    fmt.Printf("%#o\n", val)  // 0つき8進数
    fmt.Printf("%x\n", val)   // 16進数(a-fは小文字)
    fmt.Printf("%#x\n", val)  // 0xつき16進数(a-fは小文字)
    fmt.Printf("%X\n", val)   // 16進数(A-Fは大文字)
    fmt.Printf("%#X\n", val)  // 0Xつき16進数(A-Fは大文字)
    fmt.Printf("%U\n", val)   // Unicodeコードポイントに対応する文字
// 123
// +123
//    123
// 123   
// 000123
// 1111011
// 173
// 0173
// 7b
// 0x7b
// 7B
// 0X7B
// U+007B
}

verbについては別の記事で後日まとめようと思います。

まとめ

  • fmt.Print():半角スペース、改行なしのデフォルトのフォーマットで標準出力
  • fmt.Println():半角スペース、改行ありのデフォルトのフォーマットで標準出力
  • fmt.Printf():verbによってフォーマットを指定し、出力(半角スペース、改行なし)