A.38. Layout Format String

Pada pembahasan-pembahasan sebelumnya kita telah banyak memanfaatkan layout format string, contohnya seperti %s, %d, %.2f, dan lainnya. Layout format string tersebut digunakan untuk keperluan formatting string untuk dimunculkan ke layar ataupun untuk disimpan ke variabel.

Layout format string digunakan dalam konversi data ke bentuk string. Contohnya seperti %.3f yang untuk konversi nilai double ke string dengan 3 digit desimal.

A.38.1. Persiapan

Pada chapter ini kita akan mempelajari satu per satu layout format string yang tersedia di Golang. Kode berikut adalah sample data yang akan kita digunakan sebagai contoh.

type student struct {
    name        string
    height      float64
    age         int32
    isGraduated bool
    hobbies     []string
}

var data = student{
    name:        "wick",
    height:      182.5,
    age:         26,
    isGraduated: false,
    hobbies:     []string{"eating", "sleeping"},
}

A.38.2. Layout Format %b

Digunakan untuk memformat data numerik, menjadi bentuk string numerik berbasis 2 (biner).

fmt.Printf("%b\n", data.age)
// 11010

A.38.3. Layout Format %c

Digunakan untuk memformat data numerik yang merupakan kode unicode, menjadi bentuk string karakter unicode-nya.

fmt.Printf("%c\n", 1400)
// ո

fmt.Printf("%c\n", 1235)
// ӓ

A.38.4. Layout Format %d

Digunakan untuk memformat data numerik, menjadi bentuk string numerik berbasis 10 (basis bilangan yang kita gunakan).

fmt.Printf("%d\n", data.age)
// 26

A.38.5. Layout Format %e atau %E

Digunakan untuk memformat data numerik desimal ke dalam bentuk notasi numerik standar Scientific notation.

fmt.Printf("%e\n", data.height)
// 1.825000e+02

fmt.Printf("%E\n", data.height)
// 1.825000E+02

1.825000E+02 maksudnya adalah 1.825 x 10^2, dan hasil operasi tersebut adalah sesuai dengan data asli = 182.5.

Perbedaan antara %e dan %E hanya pada bagian huruf besar kecil karakter e pada hasil.

A.38.6. Layout Format %f atau %F

%F adalah alias dari %f. Keduanya memiliki fungsi yang sama.

Berfungsi untuk memformat data numerik desimal, dengan lebar desimal bisa ditentukan. Secara default lebar digit desimal adalah 6 digit.

fmt.Printf("%f\n", data.height)
// 182.500000

fmt.Printf("%.9f\n", data.height)
// 182.500000000

fmt.Printf("%.2f\n", data.height)
// 182.50

fmt.Printf("%.f\n", data.height)
// 182

A.38.7. Layout Format %g atau %G

%G adalah alias dari %g. Keduanya memiliki fungsi yang sama.

Berfungsi untuk memformat data numerik desimal, dengan lebar desimal bisa ditentukan. Lebar kapasitasnya sangat besar, pas digunakan untuk data yang jumlah digit desimalnya cukup banyak.

Bisa dilihat pada kode berikut perbandingan antara %e, %f, dan %g.

fmt.Printf("%e\n", 0.123123123123)
// 1.231231e-01

fmt.Printf("%f\n", 0.123123123123)
// 0.123123

fmt.Printf("%g\n", 0.123123123123)
// 0.123123123123

Perbedaan lainnya adalah pada %g, lebar digit desimal adalah sesuai dengan datanya, tidak bisa dicustom seperti pada %f.

fmt.Printf("%g\n", 0.12)
// 0.12

fmt.Printf("%.5g\n", 0.12)
// 0.12

A.38.8. Layout Format %o

Digunakan untuk memformat data numerik, menjadi bentuk string numerik berbasis 8 (oktal).

fmt.Printf("%o\n", data.age)
// 32

A.38.9. Layout Format %p

Digunakan untuk memformat data pointer, mengembalikan alamat pointer referensi variabel-nya.

Alamat pointer dituliskan dalam bentuk numerik berbasis 16 dengan prefix 0x.

fmt.Printf("%p\n", &data.name)
// 0x2081be0c0

A.38.10. Layout Format %q

Digunakan untuk escape string. Meskipun string yang dipakai menggunakan literal \ akan tetap di-escape.

fmt.Printf("%q\n", `" name \ height "`)
// "\" name \\ height \""

A.38.11. Layout Format %s

Digunakan untuk memformat data string.

fmt.Printf("%s\n", data.name)
// wick

A.38.12. Layout Format %t

Digunakan untuk memformat data boolean, menampilkan nilai bool-nya.

fmt.Printf("%t\n", data.isGraduated)
// false

A.38.13. Layout Format %T

Berfungsi untuk mengambil tipe variabel yang akan diformat.

fmt.Printf("%T\n", data.name)
// string

fmt.Printf("%T\n", data.height)
// float64

fmt.Printf("%T\n", data.age)
// int32

fmt.Printf("%T\n", data.isGraduated)
// bool

fmt.Printf("%T\n", data.hobbies)
// []string

A.38.14. Layout Format %v

Digunakan untuk memformat data apa saja (termasuk data bertipe interface{}). Hasil kembaliannya adalah string nilai data aslinya.

Jika data adalah objek cetakan struct, maka akan ditampilkan semua secara property berurutan.

fmt.Printf("%v\n", data)
// {wick 182.5 26 false [eating sleeping]}

A.38.15. Layout Format %+v

Digunakan untuk memformat struct, mengembalikan nama tiap property dan nilainya berurutan sesuai dengan struktur struct.

fmt.Printf("%+v\n", data)
// {name:wick height:182.5 age:26 isGraduated:false hobbies:[eating sleeping]}

A.38.16. Layout Format %#v

Digunakan untuk memformat struct, mengembalikan nama dan nilai tiap property sesuai dengan struktur struct dan juga bagaimana objek tersebut dideklarasikan.

fmt.Printf("%#v\n", data)
// main.student{name:"wick", height:182.5, age:26, isGraduated:false, hobbies:[]string{"eating", "sleeping"}}

Ketika menampilkan objek yang deklarasinya adalah menggunakan teknik anonymous struct, maka akan muncul juga struktur anonymous struct nya.

var data = struct {
    name   string
    height float64
}{
    name:   "wick",
    height: 182.5,
}

fmt.Printf("%#v\n", data)
// struct { name string; height float64 }{name:"wick", height:182.5}

Format ini juga bisa digunakan untuk menampilkan tipe data lain, dan akan dimunculkan strukturnya juga.

A.38.17. Layout Format %x atau %X

Digunakan untuk memformat data numerik, menjadi bentuk string numerik berbasis 16 (heksadesimal).

fmt.Printf("%x\n", data.age)
// 1a

Jika digunakan pada tipe data string, maka akan mengembalikan kode heksadesimal tiap karakter.

var d = data.name

fmt.Printf("%x%x%x%x\n", d[0], d[1], d[2], d[3])
// 7769636b

fmt.Printf("%x\n", d)
// 7769636b

%x dan %X memiliki fungsi yang sama. Perbedaannya adalah %X akan mengembalikan string dalam bentuk uppercase atau huruf kapital.

A.38.18. Layout Format %%

Cara untuk menulis karakter % pada string format.

fmt.Printf("%%\n")
// %