忘れがちなGo言語の書式指定子を例付きでまとめた

忘れがちな書式指定子
いちいち調べるのも面倒臭いので、普段使いそうな書式指定子の使い方を例付きでまとめた

各書式指定子の説明文は、基本的に以下のサイトを引用させていただいている
go fmtパッケージ

各書式指定子の使い方

%v デフォルトフォーマット

%v デフォルトフォーマットを適用した値 構造体を出力する際、+フラグ(%+v)を加えるとフィールド名が表示される

package main

import (
    "fmt"
)

type Person struct {
    Name     string
    Favorite string
}

func main() {
    p := new(Person)
    p.Name = "sekky"
    p.Favorite = "Programming"
    fmt.Printf("構造体 = %v", p)
}

結果

構造体 = &{sekky Programming}

%+v フラグ付き デフォルトフォーマット

フラグ(%+v)を加えるとフィールド名が表示される

package main

import (
    "fmt"
)

type Person struct {
    Name     string
    Favorite string
}

func main() {
    p := new(Person)
    p.Name = "sekky"
    p.Favorite = "Programming"
    fmt.Printf("構造体 = %+v", p)
}

結果

構造体 = &{Name:sekky Favorite:Programming}

%#v Go言語の構文で表現

%#v この値をGo言語の構文で表現する

package main

import (
    "fmt"
)

type Person struct {
    Name     string
    Favorite string
}

func main() {
    p := new(Person)
    p.Name = "sekky"
    p.Favorite = "Programming"
    fmt.Printf("構造体 = %#v\n", p)

    a := [...]string{"Go", "Java", "Python", "Ruby", "Rust"}
    fmt.Printf("配列 = %#v", a)
}

結果

構造体 = &main.Person{Name:"sekky", Favorite:"Programming"}
配列 = [5]string{"Go", "Java", "Python", "Ruby", "Rust"}

%T 値の型

%T この値の型をGo言語の構文で表現する

package main

import (
    "fmt"
)

type Person struct {
    Name     string
    Favorite string
}

func main() {
    p := new(Person)
    p.Name = "sekky"
    p.Favorite = "Programming"
    fmt.Printf("構造体 = %T\n", p)

    a := [...]string{"Go", "Java", "Python", "Ruby", "Rust"}
    fmt.Printf("配列 = %T\n", a)

    s := []int{0, 1, 2}
    fmt.Printf("スライス = %T\n", s)

    n := 7
    fmt.Printf("int = %T\n", n)

    str := "sekky"
    fmt.Printf("string = %T\n", str)

    b := true
    fmt.Printf("bool = %T\n", b)
}

結果

構造体 = *main.Person
配列 = [5]string
スライス = []int
int = int
string = string
bool = bool

%t 単語、trueまたはfalse

%t 単語、trueまたはfalse

package main

import (
    "fmt"
)

type Person struct {
    Name     string
    Favorite string
}

func main() {

    b := true
    fmt.Printf("%t\n", b)

    b = false
    fmt.Printf("%t\n", b)
    
    str := "Go"
    fmt.Printf("%t\n", str)
    
    n := 1
    fmt.Printf("%t\n", n)
    
    p := new(Person)
    p.Name = "sekky"
    fmt.Printf("%t\n", p)
    
    
}

結果

true
false
%!t(string=Go)
%!t(int=1)
&{%!t(string=sekky) %!t(string=)}

%s 文字列、スライス

%s 文字列またはスライスそのまま

package main

import (
    "fmt"
)

func main() {

    str := "Go"
    fmt.Printf("文字列 = %s\n", str)

    s := []string{"Go", "Java"}
    fmt.Printf("スライス = %s", s)

    // 配列では使用できないため、以下のコードはエラーになる
    // s := [2]string{"Go", "Java"}
    // fmt.Printf("配列 = %s", s)

}

結果

文字列 = Go
スライス = [Go Java]

数値系

数値系はまとめて書く
コメント部分は以下を引用
go fmtパッケージ

package main

import (
    "fmt"
)

func main() {

    // %b 基数2
    b := 5
    fmt.Printf("基数2 = %b\n", b)

    // %c 対応するUnicodeコードポイントによって表される文字
    c := '\101'
    fmt.Printf("Unicodeコードポイント = %c\n", c)

    // %d 基数10
    d := 5
    fmt.Printf("基数10 = %d\n", d)

    // %o 基数8
    o := 20
    fmt.Printf("基数8 = %o\n", o)

    // %x 基数16、10以上の数には小文字(a-f)を使用
    x := 2059
    fmt.Printf("基数16、10以上の数には小文字(a-f)を使用 = %x\n", x)

    // %X 基数16、10以上の数には大文字(A-F)を使用
    X := 2059
    fmt.Printf("基数16、10以上の数には大文字(A-F)を使用 = %X\n", X)

    // %U ユニコードフォーマット: U+1234; "U+%x"と同じ。デフォルトは、4桁
    U := '\101'
    fmt.Printf("ユニコードフォーマット = %U\n", U)

}

結果

基数2 = 101
Unicodeコードポイント = A
基数10 = 5
基数8 = 24
基数1610以上の数には小文字(a-f)を使用 = 80b
基数1610以上の数には大文字(A-F)を使用 = 80B
ユニコードフォーマット = U+0041

ポインタ

%p 16進数文字列、先頭に0x

package main

import (
    "fmt"
)

type Person struct {
    Name     string
    Favorite string
}

func main() {
    p := new(Person)
    p.Name = "sekky"
    p.Favorite = "Programming"
    fmt.Printf("構造体 = %p", p)
}

結果

構造体 = 0x1040a130

参考文献

松尾 愛賀 (2016/4/15)『スターティングGo言語』 翔泳社

参考にさせていただいたサイト

go fmtパッケージ