Pengenalan Template Action
Tidak hanya teks saja kita bisa render dalam template tetapi kita juga bisa mendukung perintah action seperti percabangan if
, perulangan for
dan lain-lain.
Contoh misalkan kita menggunakan percabangan if
seperti ini
Percabangan dengan satu kondisi
{{if .Value}} A1 {{ end }}
Jika Value
tidak kosong, maka A1
akan dieksekusi dan jika kosong tidak ada yang akan di eksekusi
Percabangan dengan 2 kondisi
{{if .Value}} A1 {{ else }} A2 {{ end }}
Jika Value
tidak kosong, maka A1
akan dieksekusi dan jika kosong akan mengeksekusi A2
.
Percabangan dengan 3 Kondisi
{{if .Value1}} A1 {{else if .Value2}} A2 {{ else }} A3 {{ end }}
Jika Value1
tidak kosong, maka A1
akan dieksekusi dan jika Value2
tidak kosong maka akan mengeksekusi A2
dan jika tidak semuanya maka A3
akan dieksekusi.
Implementasi Template If Statement
Berikut ini contoh implementasi template jika kita menggunakan kondisi If
statement pada file if.html
<html>
<body>
{{if .Name}}
<h1>Hello {{.Name}}</h1>
{{else}}
<h1>Hai</h1>
{{ end }}
</body>
</html>
Lalu kita lanjutkan dengan membuat handler fungsi untuk menampilkan halaman yg sudah kita buat.
func TemplateActionIfHandler(w http.ResponseWriter, r *http.Request) {
t := template.Must(template.ParseFiles("./templates/if.html"))
t.ExecuteTemplate(w, "if.html", map[string]interface{}{
"Name": "Santekno",
})
}
Pada handler ini kita menggunakan map[string]interface{}
untuk mengirim data dari handler. Selanjutnya jangan lupa kita tambahkan juga pada route
pada file main.go
agar halaman yang sudah kita buat bisa di akses pada browser.
mux.HandleFunc("/template-action-if",TemplateActionIfHandler)
Implementasi Template Operator Statement
Selain mendukung kondisi, operator perbandingan pun sudah didukung oleh golang template sehingga kita bisa gunakan untuk membandingkan numer di if statement
berikut contoh operator-nya.
Operator | Contoh |
---|---|
eq | arg1 == arg2 |
ne | arg1 != arg2 |
lt | arg1 < arg2 |
le | arg1 <= arg2 |
gt | arg1 > arg2 |
ge | arg1 >= arg2 |
Baiklah kita akan coba implementasikan operator yang ada dengan menggunakan if
statement. Anda bisa buat file baru dengan nama file comparator.html
dengan isi html seperti dibawah ini.
<html>
<body>
{{if ge .Value 80}}
<h1>Good</h1>
{{else if ge .Value 60}}
<h1>Nice Try</h1>
{{else}}
<h1>Try Again</h1>
{{end}}
</body>
</html>
Kenapa operatornya di depan?
Hal ini dikarenakan operator perbandingan ini sebuah function
atau sering kita dengar function programming
. Jadi saat kita menggunakan {{eq First Second}}
sebenarnya dia akan memanggil fungsi eq
dengan parameter First
dan Second
atau lebih fammiliarnya seperti ini eq(First,Second)
.
Selanjutnya kita buat fungsi handler dengan nama TemplateActionComparatorHandler
pada file http_handler.go
dengan detailnya seperti ini.
func TemplateActionComparatorHandler(w http.ResponseWriter, r *http.Request) {
t := template.Must(template.ParseFiles("./templates/comparator.html"))
t.ExecuteTemplate(w, "comparator.html", map[string]interface{}{
"Name": "Santekno",
"Value": 100,
})
}
Dan yang terakhir kita tambahkan juga fungsi handler-nya pada file main.go
.
mux.HandleFunc("/template-action-comparator", TemplateActionComparatorHandler)
Selesai, kita jalankan program kita dan akan menampilkan nama dan value Good
karena nilainya dari variabel value
adalah 100. Coba kita ganti menjadi 60 apa yang akan terjadi? Maka akan keluar Nice Try
.
Operasi Perulangan menggunakan Range
Range
adalah operasi perulangan atau iterasi yang dilakukan pada data template. Dalam Golang template perulangan ini tidak bisa menggunakan for
. Biasanya perulangan data ini menggunakan range untuk iterasi tiap data array, slice, map ataupun channel. Contohnya
{{ range $index, $element := .Value }}
A1
{{ end }}
Jika Value
memiliki data, maka A1
akan dieksekusi sebanyak element value dan kita bisa menggunakan $index
untuk mengakses index dan $element
untuk mengakses elementnya.
Contoh lagi misalkan seperti ini
{{ range $index, $element := .Value }}
A1
{{ else }}
A2
{{ end }}
Pada contoh kedua ini sebenarnya sama seperti halnya contoh yang pertama namun jika ada value
tidak memiliki element apapun maka A2
yang akan dieksekusi.
Kita coba langsung dengan membuat file range.html
dengan isi kode html seperti dibawah ini.
<html>
<body>
{{range $index, $element := .Hobbies}}
<h1>{{ $element }}</h1>
{{else}}
<h1>Anda tidak punya hobi</h1>
{{end}}
</body>
</html>
Dan selanjutnya kita akan membuat handler dengan template yang sudah dibuat diatas.
func TemplateActionRangeHandler(w http.ResponseWriter, r *http.Request) {
t := template.Must(template.ParseFiles("./templates/range.html"))
t.ExecuteTemplate(w, "range.html", map[string]interface{}{
"Hobbies": []string{
"Gaming", "Reading", "Coding",
},
})
}
Dilanjutkan dengan membuat fungsi handler seperti dibawah ini.
mux.HandleFunc("/template-action-range", TemplateActionRangeHandler)
Jalankan program dan akses browser maka akan menampilkan seperti dibawah ini.
Gaming
Reading
Coding
Operasi With
Kaadang kala kita sering membuat suatu nested struct
yang mana jika menggunakan template kita bisa mengaksesnya dengan menggunakan .Value.NestedValue
dalam template action With
dengan mengubah scope dot menjadi onject yang ingin kita mau.
Contoh halnya seperti ini
{{with .Value}}
A1{{ end }}
berarti jika value tidak kosong, diA1
semua dot akan merefer ke value{{with .Value}}
A1{{ else }}
A2{{ end }}
berarti sama halnya seperti sebelumnya namun jika value kosong makaA2
yang akan dieksekusi
Kita akan mencobanya dengan membuat file template-nya terlebih dahulu seperti ini
<html>
<body>
{{/* contoh komentar */}}
Name : {{.Name}} <br>
{{with .Address}}
Address Street : {{.Street}}<br>
Address City : {{.City}}<br>
{{end}}
</body>
</html>
Selanjutnya kita akan membuat fungsi handler baru untuk membaca file template diatas seperti ini.
func TemplateActionWithHandler(w http.ResponseWriter, r *http.Request) {
t := template.Must(template.ParseFiles("./templates/address.html"))
t.ExecuteTemplate(w, "address.html", map[string]interface{}{
"Name": "Santekno",
"Address": map[string]interface{}{
"Street": "Jalan Padjadjaran",
"City": "Bogor",
},
})
}
Lalu jangan lupa juga untuk memanggil fungsi handler tersebut pada file main.go
untuk inisialisasi endpoint-nya.
mux.HandleFunc("/template-action-with", TemplateActionWithHandler)
Build ulang dan coba jalankan kembali programnya.
go build && ./learn-golang-web
Setelah di buld dan dijalankan akan tampak tampilan pada halaman browser setelah diakses seperti dibawah ini
Name : Santekno
Address Street : Jalan Padjadjaran
Address City : Bogor