<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Moch. Lutfi</title>
    <description>The latest articles on DEV Community by Moch. Lutfi (@lumochift).</description>
    <link>https://dev.to/lumochift</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F20622%2F13848c32-517b-4615-afbc-b3d5f3bfd5dc.jpeg</url>
      <title>DEV Community: Moch. Lutfi</title>
      <link>https://dev.to/lumochift</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lumochift"/>
    <language>en</language>
    <item>
      <title>Binary Operator Hack and Tricks</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Sun, 30 Aug 2020 11:00:00 +0000</pubDate>
      <link>https://dev.to/lumochift/binary-operator-hack-and-tricks-2nj5</link>
      <guid>https://dev.to/lumochift/binary-operator-hack-and-tricks-2nj5</guid>
      <description>&lt;p&gt;A binary operator is a way to manipulate binary data. We already know there are &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;, &lt;code&gt;^&lt;/code&gt;, &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; operators, but not all of us know the secret of each operator. Let's explore what tricks behind those operators using go language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiply or Divide By 2
&lt;/h2&gt;

&lt;p&gt;Multiply 2 using &lt;code&gt;* 2&lt;/code&gt; or divide using &lt;code&gt;/ 2&lt;/code&gt; is the normal way, but how we can achieve the same with the binary operator?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;divide by 2&lt;/td&gt;
&lt;td&gt;shift right by 1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;someNumber &amp;gt;&amp;gt; 1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multiply by 2&lt;/td&gt;
&lt;td&gt;shift left by 1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;someNumber &amp;lt;&amp;lt; 1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="c"&gt;// multiply by 2&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Output: 8&lt;/span&gt;

    &lt;span class="c"&gt;// divide by 2&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Output: 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Change case of character
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;
    &lt;span class="c"&gt;// to upper case char&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="sc"&gt;'c'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="sc"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c"&gt;// Output: C&lt;/span&gt;

    &lt;span class="c"&gt;// to lower case char&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'A'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c"&gt;// Output: a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Invert case of character
&lt;/h2&gt;

&lt;p&gt;Invert char can be achieved by &lt;code&gt;xor&lt;/code&gt; with space&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'A'&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'b'&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c"&gt;// Output: a B&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Get letter position
&lt;/h2&gt;

&lt;p&gt;Get a letter's position in the alphabet (1-26) using &lt;code&gt;and with 31&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'z'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Output: 26&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Check number odd or even
&lt;/h2&gt;

&lt;p&gt;Simple check if the number is odd/even using &lt;code&gt;and with 1&lt;/code&gt;, if the number is odd will return true&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="c"&gt;// odd number return true&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Output: true&lt;/span&gt;

    &lt;span class="c"&gt;// even number return false&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Output: false&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Try it yourself at &lt;a href="https://play.golang.org/p/-wsIlDgBTmF"&gt;https://play.golang.org/p/-wsIlDgBTmF&lt;/a&gt;&lt;/p&gt;

</description>
      <category>golang101</category>
      <category>programming</category>
      <category>go</category>
    </item>
    <item>
      <title>Membuat Benchmark di Golang</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Sun, 02 Sep 2018 01:00:00 +0000</pubDate>
      <link>https://dev.to/lumochift/membuat-benchmark-di-golang-1j1n</link>
      <guid>https://dev.to/lumochift/membuat-benchmark-di-golang-1j1n</guid>
      <description>&lt;p&gt;Ketika membuat suatu aplikasi tidak dipungkiri salah satu faktor yang sangat penting yaitu kecepatan. Baik kecepatan load data, kecepatan dalam menjalankan suatu perintah ataupun ketika membuka dan menutup aplikasi. Tentunya perlu instrument untuk mengetahui seberapa cepat kode kita, dalam hal ini perasaan tidak dapat digunakan sebagai tolak ukur. Menariknya pada bahasa pemrograman golang sudah ada &lt;em&gt;library&lt;/em&gt; standar untuk mengukur seberapa cepat perintah dalam kode yang sering disebut &lt;em&gt;benchmarking&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Kali ini contoh kasus untuk komparasi performa saya menggunakan 2 sorting sederhana yaitu &lt;em&gt;bubble sort&lt;/em&gt; dan &lt;em&gt;shell sort&lt;/em&gt;. Kira-kira mana yang lebih cepat ya? Ah iya, jangan pake perasaan tapi pake hasil &lt;em&gt;benchmark&lt;/em&gt; untuk menentukan siapa yang paling cepat. Berikut contoh 2 sorting tersebut.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// sort.go
package benchmark

import "math/rand"

// BubbleSort sorting array of integer using bubble sort
func BubbleSort(arr []int) []int {
    tmp := 0
    for i := 0; i &amp;lt; len(arr); i++ {
        for j := 0; j &amp;lt; len(arr)-1-i; j++ {
            if arr[j] &amp;gt; arr[j+1] {
                tmp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = tmp
            }
        }
    }
    return arr
}

// ShellSort sorting int using shell sort
func ShellSort(arr []int) []int {
    for d := int(len(arr) / 2); d &amp;gt; 0; d /= 2 {
        for i := d; i &amp;lt; len(arr); i++ {
            for j := i; j &amp;gt;= d &amp;amp;&amp;amp; arr[j-d] &amp;gt; arr[j]; j -= d {
                arr[j], arr[j-d] = arr[j-d], arr[j]
            }
        }
    }
    return arr
}

// RandArray helper for create random array
func RandArray(n int) []int {
    arr := make([]int, n)
    for i := 0; i &amp;lt;= n-1; i++ {
        arr[i] = rand.Intn(n)
    }
    return arr
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Pada artikel sebelumnya tentang &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; sudah dibahas tentang bagaimana caranya membuat unit test pada suatu package, penggunaan &lt;em&gt;benchmark&lt;/em&gt; juga tetap menggunakan &lt;em&gt;package&lt;/em&gt; &lt;em&gt;testing&lt;/em&gt; namun menggunakan variabel &lt;code&gt;B&lt;/code&gt; bukan &lt;code&gt;T&lt;/code&gt; seperti yg digunakan pada &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt;. Langsung saja pada penggunaanya dalam kode berikut.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package benchmark_test

import (
    "testing"

    "github.com/h4ckm03d/blog-codes/golang101/benchmark"
)

func BenchmarkBubbleSorting(b *testing.B) {
    arr := benchmark.RandArray(100)
    for n := 0; n &amp;lt; b.N; n++ {
        benchmark.BubbleSort(arr)
    }
}

func BenchmarkShellSorting(b *testing.B) {
    arr := benchmark.RandArray(100)
    for n := 0; n &amp;lt; b.N; n++ {
        benchmark.ShellSort(arr)
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Untuk menjalankan &lt;em&gt;benchmark&lt;/em&gt; sama dengan unit test, hanya saja menggunakan parameter tambahan &lt;code&gt;-bench=.&lt;/code&gt; untuk semua &lt;em&gt;benchmark&lt;/em&gt;. Jika ingin menjalankan salah satu bisa menggunakan &lt;code&gt;-bench=ShellSort&lt;/code&gt;, menggunakan nama fungsi &lt;em&gt;benchmark&lt;/em&gt; tanpa menggunakan kata &lt;code&gt;Benchmark&lt;/code&gt;. Berikut hasil &lt;em&gt;benchmark&lt;/em&gt; dari 2 fungsi sorting diatas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;➜ benchmark git:(master) ✗ go test -bench=.
goos: darwin
goarch: amd64
pkg: github.com/h4ckm03d/blog-codes/golang101/benchmark
BenchmarkBubbleSorting-12 300000 4181 ns/op
BenchmarkShellSorting-12 3000000 433 ns/op
PASS
ok github.com/h4ckm03d/blog-codes/golang101/benchmark 3.049s
➜ benchmark git:(master) ✗ go test -bench=BubbleSort
goos: darwin
goarch: amd64
pkg: github.com/h4ckm03d/blog-codes/golang101/benchmark
BenchmarkBubbleSorting-12 300000 4188 ns/op
PASS
ok github.com/h4ckm03d/blog-codes/golang101/benchmark 1.306s
➜ benchmark git:(master) ✗

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Pada hasil perintah &lt;code&gt;go test -bench=.&lt;/code&gt; diatas menghasilkan 3 kolom:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nama benchmark, contohnya &lt;code&gt;BenchmarkBubbleSorting-12&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total operasi yg dijalankan, &lt;code&gt;300000&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;waktu yang dibutuhkan untuk menjalankan 1 fungsi dalam nanoseconds. &lt;code&gt;4181 ns/op&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Jadi &lt;code&gt;BubbleSort&lt;/code&gt; perlu &lt;code&gt;4181 ns/op&lt;/code&gt; dan &lt;code&gt;ShellSort&lt;/code&gt; memerlukan &lt;code&gt;433 ns/op&lt;/code&gt;. Sudah jelas kalau pemenangnya adalah &lt;code&gt;ShellShort&lt;/code&gt;. Mudah bukan?&lt;/p&gt;

&lt;p&gt;Sampai jumpa lagi di tulisan selanjutnya.&lt;/p&gt;

&lt;p&gt;Code lengkapnya ada di &lt;a href="https://github.com/h4ckm03d/blog-codes/tree/master/golang101/benchmark"&gt;github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>Tips dan trik unit test di Go</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Thu, 01 Feb 2018 14:54:00 +0000</pubDate>
      <link>https://dev.to/lumochift/tips-dan-trik-unit-test-di-go-4cd0</link>
      <guid>https://dev.to/lumochift/tips-dan-trik-unit-test-di-go-4cd0</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; memang tidak bisa dilepaskan dari proses pengembangan &lt;em&gt;software&lt;/em&gt;. Namun seringkali dalam pembuatan &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; di Go terjadi banyak repetisi yang tidak perlu dan &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; yang tidak dikelola dengan baik. Salah satu contoh kasus yang paling banyak ditemui dalam pembuatan &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; yaitu tidak dipisahkannya &lt;em&gt;logic&lt;/em&gt; dan data sehingga ketika penambahan data test terdapat penambahan pula &lt;em&gt;logic&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Contoh Kode
&lt;/h1&gt;

&lt;p&gt;Sebelum memulai lebih lanjut berikut adalah contoh kode untuk membantu memahami tulisan ini.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Struktur direktori
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ tree .
├── add.go
└── add_test.go

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;File &lt;code&gt;add.go&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Tambah&lt;/span&gt; &lt;span class="n"&gt;merupakan&lt;/span&gt; &lt;span class="n"&gt;fungsi&lt;/span&gt; &lt;span class="n"&gt;sederhana&lt;/span&gt; &lt;span class="n"&gt;penjumlahan&lt;/span&gt;
&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Tambah&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;File &lt;code&gt;add_test.go&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="s2"&gt;"testing"&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestBasic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;Tambah&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;!= 2{
&lt;/span&gt;        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"seharusnya 2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;Tambah&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;!= 3{
&lt;/span&gt;        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"seharusnya 3"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;kode&lt;/span&gt; &lt;span class="n"&gt;berulang&lt;/span&gt; &lt;span class="n"&gt;sebanyak&lt;/span&gt; &lt;span class="n"&gt;jumlah&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Hasil running &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go test -v
=== RUN TestBasic
--- PASS: TestBasic (0.00s)
PASS
ok github.com/h4ckm03d/blog-codes/golang101/6-tips-trik-unit-test 0.002s

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Memanfaatkan &lt;em&gt;array of struct&lt;/em&gt;
&lt;/h1&gt;

&lt;p&gt;Contoh &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; diatas merupakan contoh paling sederhana, jika yang sederhana saja sudah terlalu verbose dan susah dikelola bagaimana jika kode dalam suatu &lt;code&gt;package&lt;/code&gt; semakin besar? Salah satu cara untuk memisahkan &lt;em&gt;logic&lt;/em&gt; unit test dengan data yaitu menggunakan unit test &lt;em&gt;array of struct&lt;/em&gt; untuk data dan tinggal menambahkan looping data ketika pengecekan. Tambahkan fungsi dibawah ini ke dalam &lt;code&gt;add_test.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func TestB(t *testing.T) {
    testData := []struct {
        name string
        inputA int
        inputB int
        result int
    }{
        {"1+1", 1, 1, 2},
        {"1+2", 1, 2, 3},
        {"1+3", 1, 3, 4},
    }

    for _, tc := range testData {
        t.Run(tc.name, func(t *testing.T) {
            if Tambah(tc.inputA, tc.inputB) != tc.result {
                t.Errorf("Seharusnya %d", tc.result)
            }
        })
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Jika &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; dijalankan maka hasilnya seperti berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go test -v
=== RUN TestBasic
--- PASS: TestBasic (0.00s)
=== RUN TestB
=== RUN TestB/1+1
=== RUN TestB/1+2
=== RUN TestB/1+3
--- PASS: TestB (0.00s)
    --- PASS: TestB/1+1 (0.00s)
    --- PASS: TestB/1+2 (0.00s)
    --- PASS: TestB/1+3 (0.00s)
PASS
ok github.com/h4ckm03d/blog-codes/golang101/6-tips-trik-unit-test 0.002s

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Dalam &lt;code&gt;TestB&lt;/code&gt; diatas ketika data test bertambah, kita hanya perlu menambahkan kedalam &lt;code&gt;array&lt;/code&gt; &lt;code&gt;testData&lt;/code&gt; tanpa perlu merubah &lt;em&gt;logic&lt;/em&gt; sehingga kode lebih mudah dibaca dan dimodifikasi. &lt;code&gt;struct&lt;/code&gt; dalam peubah &lt;code&gt;testData&lt;/code&gt; terdiri dari 3 bagian label test(&lt;code&gt;name&lt;/code&gt;), input data (&lt;code&gt;inputA&lt;/code&gt;, &lt;code&gt;inputB&lt;/code&gt;), dan output dari fungsi (&lt;code&gt;result&lt;/code&gt;). Untuk input data dan output bisa diganti sesuai dengan fungsi yang ditest. Hasil running dari unit test juga lebih jelas jika menggunakan metode ini karena penggunaan label membantu tracking ketika ada kesalahan. Misalkan &lt;code&gt;testData&lt;/code&gt; 1 ditambah 1 diubah menjadi 7 untuk mengetahui contoh jika unit test menghasilkan error, hasilnya sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go test -v
=== RUN TestBasic
--- PASS: TestBasic (0.00s)
=== RUN TestB
=== RUN TestB/1+1
=== RUN TestB/1+2
=== RUN TestB/1+3
--- FAIL: TestB (0.00s)
    --- FAIL: TestB/1+1 (0.00s)
        add_test.go:34: Seharusnya 7
    --- PASS: TestB/1+2 (0.00s)
    --- PASS: TestB/1+3 (0.00s)
FAIL
exit status 1
FAIL github.com/h4ckm03d/blog-codes/golang101/6-tips-trik-unit-test 0.005s

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Karena output diubah menjadi 7 sehingga unit testnya fail, akan tetapi karena menggunakan label kita segera mengetahui data apa yang salah sehingga bug fix lebih mudah.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fatal VS Error
&lt;/h1&gt;

&lt;p&gt;Pada fungsi &lt;code&gt;TestBasic&lt;/code&gt; diatas menggunakan &lt;code&gt;t.Error("seharusnya 2")&lt;/code&gt;, kenapa menggunakan &lt;code&gt;t.Error&lt;/code&gt; bukan menggunakan &lt;code&gt;t.Fatal&lt;/code&gt; ? Penggunaan &lt;em&gt;error&lt;/em&gt; diatas karena ketika terjadi kesalahan misalkan output salah atau tidak sesuai maka unit test tidak akan berhenti tetapi melanjutkan sampai semua proses dalam fungsi tersebut selesai. Jika menggunakan &lt;em&gt;fatal&lt;/em&gt; maka ketika &lt;code&gt;t.Fatal&lt;/code&gt; atau &lt;code&gt;t.Fatalf&lt;/code&gt; dipanggil maka proses dihentikan. Dalam hal ini ketika 1 + 1 terjadi error maka proses berhenti dan tidak dilanjutkan pengecekan 1 + 2. Berikut contoh perbedaan penggunaan &lt;em&gt;fatal&lt;/em&gt; dan &lt;em&gt;error&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func TestBasicFatal(t *testing.T) {
    if Tambah(1, 1) != 3 {
        t.Error("seharusnya 2")
    }

    if Tambah(1, 2) != 4 {
        t.Error("seharusnya 3")
    }

    // kode berulang sebanyak jumlah data test
}

func TestBasicError(t *testing.T) {
    if Tambah(1, 1) != 3 {
        t.Error("seharusnya 2")
    }

    if Tambah(1, 2) != 4 {
        t.Error("seharusnya 3")
    }

    // kode berulang sebanyak jumlah data test
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Hasil &lt;code&gt;go test -v&lt;/code&gt; sebagai berikut&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go test -v
=== RUN TestBasic
--- PASS: TestBasic (0.00s)
=== RUN TestBasicFatal
--- FAIL: TestBasicFatal (0.00s)
        add_test.go:21: seharusnya 2
=== RUN TestBasicError
--- FAIL: TestBasicError (0.00s)
        add_test.go:33: seharusnya 2
        add_test.go:37: seharusnya 3
=== RUN TestB
=== RUN TestB/1+1
=== RUN TestB/1+2
=== RUN TestB/1+3
--- PASS: TestB (0.00s)
    --- PASS: TestB/1+1 (0.00s)
    --- PASS: TestB/1+2 (0.00s)
    --- PASS: TestB/1+3 (0.00s)
FAIL
exit status 1
FAIL github.com/h4ckm03d/blog-codes/golang101/6-tips-trik-unit-test 0.004s

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ketika &lt;code&gt;TestBasicFatal&lt;/code&gt; dijalankan maka ketika ada error proses berhenti berbeda dengan &lt;code&gt;TestBasicError&lt;/code&gt;, meskipun ada error proses dilanjutkan sampai selesai.&lt;/p&gt;

&lt;p&gt;Dengan pemisahan kode &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Unit Test&lt;/a&gt; dan penggunaan error/fatal yang tepat kita bisa lebih optimal memanfaatkan unit test. Semoga bermanfaat dan sampai jumpa lagi di tulisan selanjutnya.&lt;/p&gt;

</description>
      <category>go</category>
      <category>unittest</category>
    </item>
    <item>
      <title>Golang Test Coverage</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Wed, 03 Jan 2018 13:10:36 +0000</pubDate>
      <link>https://dev.to/lumochift/golang-test-coverage-5cmg</link>
      <guid>https://dev.to/lumochift/golang-test-coverage-5cmg</guid>
      <description>&lt;p&gt;Tulisan ini adalah lanjutan dari &lt;a href="https://dev.to/h4ckm03d/golang-unit-test-3fmh-temp-slug-2651667"&gt;Golang Unit Test&lt;/a&gt;. Kali ini membahas tentang &lt;em&gt;test coverage&lt;/em&gt;, yaitu untuk mengetahui apakah unit test sudah memenuhi semua jalur logika dari sistem yang kita uji. Contoh sederhana sebagai berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suatu fungsi untuk menentukan nilai maksimal dari dua integer input.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Input didefinisikan dalam variabel &lt;code&gt;a&lt;/code&gt; dan &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jika &lt;code&gt;a&lt;/code&gt; lebih besar atau sama dengan &lt;code&gt;b&lt;/code&gt; maka return &lt;code&gt;a&lt;/code&gt;, sebaliknya jika &lt;code&gt;b&lt;/code&gt; lebih besar maka return &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sample code sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

func Max(a, b int) int {
    if a &amp;gt;= b {
        return a
    }

    return b
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Kemudian &lt;em&gt;unit test&lt;/em&gt; sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import "testing"

func TestMax(t *testing.T) {
    if Max(1, 3) != 3 {
        t.Error("error, seharusnya 3")
    }

    // Jika pengecekan dibawah ini dihilangkan maka test coverage jadi 66.67%
    if Max(4, 3) != 4 {
        t.Error("error, seharusnya 4")
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Jika &lt;em&gt;test coverage&lt;/em&gt; dijalankan menggunakan perintah &lt;code&gt;go test --cover&lt;/code&gt; di cli maka hasilnya sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go test --cover
PASS
coverage: 100.0% of statements
ok github.com/h4ckm03d/blog-codes/test-coverage 0.002s

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Coba kita review &lt;em&gt;unit testing&lt;/em&gt; diatas.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fungsi Max mempunya 2 cabang logika dan terdiri dari 3 statement &lt;code&gt;if a &amp;gt;= b&lt;/code&gt;, &lt;code&gt;return a&lt;/code&gt;, dan &lt;code&gt;return b&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Max(1, 3)&lt;/code&gt; ini menghasilkan nilai 3, jika dirunut dari fungsi Max akan melewati 2 statement &lt;code&gt;if a &amp;gt;= b&lt;/code&gt; dan karena kondisi tidak terpenuh maka langsung ke &lt;code&gt;return b&lt;/code&gt;. Jadi hanya tercover 2 statement sehingga test coverage jika pengecekan &lt;code&gt;Max(4,3)&lt;/code&gt; dihilangkan maka hasilnya &lt;strong&gt;66.67%&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Karena pemanggilan fungsi &lt;code&gt;Max(4,3)&lt;/code&gt; menghasilkan jalur yang berbeda dengan proses pada no.2 yaitu &lt;code&gt;if a &amp;gt;= b&lt;/code&gt; dan &lt;code&gt;return a&lt;/code&gt;. Maka semua cabang logika dilewati, karena itulah hasil &lt;em&gt;test coverage&lt;/em&gt; keseluruhan jadi &lt;strong&gt;100%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Semoga yang sedikit ini bisa membantu pemahaman tentang &lt;em&gt;test coverage&lt;/em&gt; menggunakan golang. Sampai jumpa lagi di tulisan selanjutnya.&lt;/p&gt;

</description>
      <category>go</category>
      <category>test</category>
      <category>coverage</category>
    </item>
    <item>
      <title>Golang Om Telolet Om Server</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Wed, 03 Jan 2018 01:49:20 +0000</pubDate>
      <link>https://dev.to/lumochift/golang-om-telolet-om-server-2b4p</link>
      <guid>https://dev.to/lumochift/golang-om-telolet-om-server-2b4p</guid>
      <description>&lt;p&gt;Tahun 2016 lalu ramai sekali tentang om telolet om, dan disalah satu website e-commerse di Indonesia menambahkan &lt;code&gt;x-om-telolet-om&lt;/code&gt; di response header. Mungkin banyak yang tidak mengetahuinya, karena hanya tambahan response header dan tidak terlihat di tampilan website.&lt;/p&gt;

&lt;h1&gt;
  
  
  Golang Om Telolet Om Server
&lt;/h1&gt;

&lt;p&gt;Pertanyaannya bagaimana menambahkan respon http header menggunakan golang? Jawabnya tentu bisa dan sangat mudah sekali bahkan tidak perlu menggunakan eksternal dependensi tambahan.&lt;/p&gt;

&lt;p&gt;Pertama perlu kita buat web server sederhana menggunakan &lt;code&gt;net/http&lt;/code&gt; package seperti dibawah ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s2"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;helloWorldHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;helloWorldHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt; &lt;span class="n"&gt;dengan&lt;/span&gt; &lt;span class="n"&gt;perintah&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Kita tes menggunakan &lt;code&gt;curl&lt;/code&gt; hasilnya seperti di bawah ini masih tanpa ada tambahan om telolet om di header dan &lt;em&gt;response body&lt;/em&gt; menampilkan string &lt;code&gt;Hello World!&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$curl -X HEAD -I localhost:8080
HTTP/1.1 200 OK
Date: Wed, 03 Jan 2018 02:13:14 GMT
Content-Length: 12
Content-Type: text/plain; charset=utf-8

$curl localhost:8080
Hello World!

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Cara sederhana menambahkan header x-telolet hanya dengan menambahkan code &lt;code&gt;w.Header().Add("x-telolet", "OM telolet OM")&lt;/code&gt; sebelum &lt;code&gt;fmt.Fprint(w, "Hello World!")&lt;/code&gt; sehingga jadi seperti ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s2"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;helloWorldHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"x-telolet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"OM telolet OM"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;helloWorldHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Jika dicek menggunakan curl hasilnya sudah berubah.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$curl -X HEAD -I localhost:8080
HTTP/1.1 200 OK
X-Telolet: OM telolet OM
Date: Wed, 03 Jan 2018 02:18:58 GMT
Content-Length: 12
Content-Type: text/plain; charset=utf-8

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Middleware
&lt;/h2&gt;

&lt;p&gt;Kemudian muncul pertanyaan bagaimana jika handlernya banyak tidak hanya &lt;code&gt;HelloWorldHandler&lt;/code&gt; saja? Untuk keperluan seperti ini bisa menggunakan &lt;code&gt;middleware&lt;/code&gt;. Jadi menjalankan satu atau lebih fungsi tertentu sebelum menjalankan handler utama seperti &lt;code&gt;helloWorldHandler&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Struktur &lt;code&gt;middleware&lt;/code&gt; yang akan kita buat menggunakan &lt;code&gt;func(w http.ResponseWriter, r *http.Request)&lt;/code&gt; sebagai tipe data. Jadi passing fungsi kedalam fungsi dan return fungsi lagi. Lebih jelasnya kita lihat code dibawah ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s2"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;OmTeloletOm&lt;/span&gt; &lt;span class="n"&gt;middleware&lt;/span&gt;
&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;OmTeloletOm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"x-telolet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"OM telolet OM pake middleware"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;helloWorldHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OmTeloletOm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helloWorldHandler&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Jika kita cek lagi dengan curl hasilnya seperti ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$curl -X HEAD -I localhost:8080
HTTP/1.1 200 OK
X-Telolet: OM telolet OM pake middleware
Date: Wed, 03 Jan 2018 02:34:48 GMT
Content-Length: 12
Content-Type: text/plain; charset=utf-8

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sangat mudah ternyata menambahkan custom header menggunakan golang. Sampai jumpa lagi di tulisan selanjutnya.&lt;/p&gt;

</description>
      <category>go</category>
      <category>header</category>
      <category>webserver</category>
    </item>
    <item>
      <title>Golang Unit Test</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Tue, 02 Jan 2018 01:00:00 +0000</pubDate>
      <link>https://dev.to/lumochift/golang-unit-test-bgn</link>
      <guid>https://dev.to/lumochift/golang-unit-test-bgn</guid>
      <description>&lt;p&gt;&lt;em&gt;Unit test&lt;/em&gt; merupakan salah satu cara untuk validasi sebuah unit terkecil dalam suatu aplikasi, misalnya &lt;em&gt;global variable&lt;/em&gt;, fungsi, fungsi dalam suatu &lt;em&gt;class&lt;/em&gt; (dalam &lt;em&gt;context&lt;/em&gt; golang fungsi dalam &lt;code&gt;struct&lt;/code&gt;). Adanya &lt;em&gt;unit test&lt;/em&gt; ini juga mempermudah pengujian suatu aplikasi/&lt;em&gt;library&lt;/em&gt; yang secara terus menerus/diperlukan repetisi pengujian sehingga tidak perlu membuat aplikasi yang lain untuk menggunakan &lt;em&gt;library&lt;/em&gt; kemudian dicek satu-persatu secara manual output program sudah sesuai atau belum.&lt;/p&gt;

&lt;h1&gt;
  
  
  Golang Unit Test
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;GOLANG&lt;/code&gt; sudah mempunyai &lt;em&gt;standard library&lt;/em&gt; untuk &lt;em&gt;unit testing&lt;/em&gt;, jadi tidak perlu menggunakan &lt;em&gt;third-party&lt;/em&gt; untuk &lt;em&gt;unit test&lt;/em&gt;. Meskipun demikian untuk kenyamanan bisa menggunakan &lt;em&gt;third-party tools&lt;/em&gt; misalkan untuk penyederhanaan unit test menggunakan assert bisa menggunakan &lt;code&gt;github.com/stretchhr/testify/assert&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Untuk demonstrasi penggunaan &lt;em&gt;unit test&lt;/em&gt; dan cara penggunaannya, disini menggunakan 2 berkas yaitu &lt;code&gt;SimpleMath.go&lt;/code&gt; dan untuk unit test menggunakan &lt;code&gt;SimpleMath_test.go&lt;/code&gt;.&lt;em&gt;Unit test&lt;/em&gt; dalam golang diletakkan dalam package yang sama dan nama yg sama dengan nama berkas yang akan ditest dengan menambahkan &lt;code&gt;_test&lt;/code&gt; pada nama berkas. Berikut adalah contoh sederhana penggunaan unit test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;math_test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"testing"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;kotak&lt;/span&gt;
    &lt;span class="n"&gt;kotak&lt;/span&gt; &lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;NewKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Luas&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;!= 32{
&lt;/span&gt;        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Seharusnya 32"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Untuk memastikan apakah &lt;em&gt;unit test&lt;/em&gt; berjalan lancar bisa digunakan &lt;code&gt;go test&lt;/code&gt; di &lt;code&gt;console&lt;/code&gt;. Misalkan letak berkas di &lt;code&gt;$GOPATH/src/math&lt;/code&gt;. Maka &lt;code&gt;~cd $GOPATH/src/math &amp;amp;&amp;amp; go test&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Contoh yang lebih realistis yaitu dengan membuat aplikasi untuk menghitung kotak dengan spesifikasi seperti berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Input merupakan variabel &lt;code&gt;panjang&lt;/code&gt; dan &lt;code&gt;lebar&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Menghitung luas dengan mengalikan &lt;code&gt;panjang&lt;/code&gt; dengan &lt;code&gt;lebar&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Menghitung keliling kotak dengan &lt;code&gt;2 * (panjang + lebar)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mengecek apakah kotak merupakan persegi atau bukan dengan membandingkan panjang dengan lebar, jika sama merupakan persegi.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spesifikasi sudah ditentukan sekarang saatnya mengubahnya menjadi code seperti dibawah ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;SimpleMath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Kotak&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Panjang&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;Lebar&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Kotak&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Luas&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Panjang&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lebar&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Kotak&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Keliling&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Panjang&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lebar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Kotak&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;IsPersegi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Panjang&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lebar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Kotak&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Kotak&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sedangkan untuk &lt;em&gt;unit test&lt;/em&gt; lengkapnya seperti dibawah ini. Untuk penamaan fungsi menggunakan prefix Test dan parameter argumen &lt;code&gt;t *testing.T&lt;/code&gt;. Contoh di bawah ini menggunakan &lt;em&gt;standard library&lt;/em&gt; dan &lt;em&gt;third-party&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;SimpleMath_test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"testing"&lt;/span&gt;

    &lt;span class="s2"&gt;"github.com/stretchr/testify/assert"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;NewKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsPersegi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Seharusnya false"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Luas&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;!= 32 {
&lt;/span&gt;        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Seharusnya 32"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Keliling&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;!= 24 {
&lt;/span&gt;        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"seharusnya 24"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;persegi&lt;/span&gt; &lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;NewKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;persegi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsPersegi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"seharusnya true"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestKotakPakeAssert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;NewKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsPersegi&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"seharusnya false"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Luas&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"seharusnya 32"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Keliling&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"seharusnya 24"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;persegi&lt;/span&gt; &lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;NewKotak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;persegi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Luas&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"seharusnya 16"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;persegi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Keliling&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"seharusnya 16"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;persegi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsPersegi&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"seharusnya true"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Untuk menjalankan unit test bisa menggunakan perintah &lt;code&gt;go test&lt;/code&gt; di &lt;em&gt;command line&lt;/em&gt;, kalau misalkan perlu verbose bisa ditambahkan flag &lt;code&gt;-v&lt;/code&gt; seperti ini &lt;code&gt;$ go test -v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cukup mudah bukan penggunaan unit test di Golang? Selanjutnya mungkin akan membahas &lt;em&gt;test coverage&lt;/em&gt; dan &lt;em&gt;benchmark&lt;/em&gt; menggunakan golang. Sampai jumpa lagi di tulisan selanjutnya.&lt;/p&gt;

</description>
      <category>go</category>
      <category>unittest</category>
    </item>
    <item>
      <title>Struct</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Sun, 17 Dec 2017 10:39:49 +0000</pubDate>
      <link>https://dev.to/lumochift/struct-4c8c</link>
      <guid>https://dev.to/lumochift/struct-4c8c</guid>
      <description>&lt;p&gt;Dalam pemrograman berorientasi object tentunya kita pasti mengenal apa itu &lt;em&gt;class&lt;/em&gt;, &lt;em&gt;enkapsulasi&lt;/em&gt;, &lt;em&gt;inheritance&lt;/em&gt;, &lt;em&gt;polimorfisme&lt;/em&gt;, dan lain sebagainya. Apakah semuanya masih bisa kita pakai dalam &lt;em&gt;golang&lt;/em&gt;? Tentu tidak, tapi sebelum membahas lebih lanjut tentang konsep OOP sebaiknya kita perlu mengetahui tipe data dasar untuk OOP di golang yaitu &lt;em&gt;struct&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;em&gt;Struct&lt;/em&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;tidak ada &lt;code&gt;class&lt;/code&gt;, adanya &lt;code&gt;struct&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tidak ada &lt;code&gt;inheritance&lt;/code&gt;, tapi menggunakan komposisi&lt;/li&gt;
&lt;li&gt;tidak ada &lt;code&gt;konstruktor&lt;/code&gt;, tapi menggunakan &lt;code&gt;return [pointer] function&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;public access modifier menggunakan nama fungsi/peubah huruf besar&lt;/li&gt;
&lt;li&gt;public access modifier menggunakan nama fungsi/peubah huruf kecil&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Struct&lt;/em&gt; merupakan tipe data dasar yang digunakan untuk menggantikan fungsi dari &lt;em&gt;class&lt;/em&gt; di bahasa pemrograman lain seperti C#, Java, C++, dll. Perlu kita tahu bahwa konsep OOP golang merupakan versi sederhana dari OOP itu sendiri. Mengapa sederhana? Karena dalam golang tidak ada konsep &lt;code&gt;inheritance&lt;/code&gt; tapi lebih pada &lt;code&gt;composition&lt;/code&gt;. Jadi menghilangkan konsep &lt;em&gt;inheritance&lt;/em&gt; untuk mengurangi kompleksitas dari suatu &lt;code&gt;struct&lt;/code&gt; dan jika ingin menggunakan &lt;code&gt;struct&lt;/code&gt; lain bisa menggunakan konsep komposisi. Untuk lebih jelasnya seperti contoh kode dibawah ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Persegi struct{
    S float64
}

type Kubus struct{
    Alas Persegi
    Tinggi float64
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Fungsi dalam struct
&lt;/h2&gt;

&lt;p&gt;Dalam contoh diatas dalam bahasa pemrograman seperti Java, kelas kubus bisa didefinisikan sebagai turunan dari &lt;code&gt;Persegi&lt;/code&gt; sedangkan dalam &lt;code&gt;golang&lt;/code&gt; menggunakan tipe data &lt;code&gt;Persegi&lt;/code&gt; untuk membuat suat peubah sebagai penyusun &lt;code&gt;struct Kubus&lt;/code&gt;. Untuk method seperti contoh dibawah ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// contoh public method dalam struct Persegi
func(p *Persegi) Luas() float64{
    return p.S * p.S
}

// contoh private method dalam struct Persegi
func(p *Persegi) jumlahSisi() int {
    return 4
}

func(k *Kubus) Volume() float64 {
    return k.Alas.Luas() * k.Tinggi
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Penggunaan peubah &lt;code&gt;p&lt;/code&gt; dalam &lt;code&gt;func(p *Persegi)&lt;/code&gt; boleh diganti dengan apa saja, tentunya harus sesuai dengan konteks agar tidak membingungkan saat &lt;em&gt;ngoding&lt;/em&gt;. Peubah &lt;code&gt;p&lt;/code&gt; ini berfungsi sebagai &lt;code&gt;this&lt;/code&gt; jika kita melihat dari sisi &lt;code&gt;Java&lt;/code&gt; atau &lt;code&gt;C#&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Access Modifier
&lt;/h2&gt;

&lt;p&gt;Apa yang membedakan &lt;code&gt;access modifier&lt;/code&gt; dalam kedua fungsi diatas? Iyap, benar sekali perbedaan huruf kapital nama fungsi. Didalam &lt;code&gt;golang&lt;/code&gt; penggunaan &lt;strong&gt;huruf kapital&lt;/strong&gt; merepresentasikan &lt;strong&gt;public&lt;/strong&gt; akses sedangkan nama fungsi yang &lt;strong&gt;diawali&lt;/strong&gt; dengan &lt;strong&gt;huruf kecil&lt;/strong&gt; merepresentasikan &lt;strong&gt;private&lt;/strong&gt; akses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konstruktor
&lt;/h2&gt;

&lt;p&gt;Lalu bagaimana untuk inisialisasi &lt;code&gt;struct&lt;/code&gt;? Perlu diketahui didalam golang juga tidak ada konstruktor. Jika tidak ada konstruktor bagaimana untuk inisialisasi &lt;code&gt;struct&lt;/code&gt;? Pastinya sudah ada cara tersendiri untuk inisialisasi &lt;code&gt;struct&lt;/code&gt; yaitu menggunakan fungsi yang mengembalikan nilai &lt;a href="https://dev.to/h4ckm03d/pointer-4nin-temp-slug-4199032"&gt;pointer&lt;/a&gt; dari suatu &lt;code&gt;struct&lt;/code&gt;. Lebih jelasnya seperti berikut.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func NewPersegi(s float64) *Persegi{
    return &amp;amp;Persegi{S: s}
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Berikut contoh lengkap kode terkait dengan &lt;code&gt;struct&lt;/code&gt; persegi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "fmt"
)

type Persegi struct {
    S float64
}

func (p *Persegi) Luas() float64 {
    return p.S * p.S
}

// contoh private method dalam struct Persegi
func (p *Persegi) jumlahSisi() int {
    return 4
}

func NewPersegi(s float64) *Persegi {
    return &amp;amp;Persegi{S: s}
}

func main() {
    a := NewPersegi(4)
    fmt.Println(a.Luas())
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Struct dan Pointer
&lt;/h2&gt;

&lt;p&gt;Dalam contoh fungsi diatas menggunakan &lt;a href="https://dev.to/h4ckm03d/pointer-4nin-temp-slug-4199032"&gt;pointer&lt;/a&gt; untuk deklarasi &lt;code&gt;func(p *Persegi)&lt;/code&gt;,apa bedanya jika tidak menggunakan &lt;a href="https://dev.to/h4ckm03d/pointer-4nin-temp-slug-4199032"&gt;pointer&lt;/a&gt;? Kita gunakan eksperimen untuk mengubah nilai &lt;code&gt;S&lt;/code&gt; dalam &lt;code&gt;struct&lt;/code&gt; &lt;code&gt;Persegi&lt;/code&gt;, satu menggunakan &lt;a href="https://dev.to/h4ckm03d/pointer-4nin-temp-slug-4199032"&gt;pointer&lt;/a&gt; satunya tidak menggunakan. Berikut contoh kodenya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (p *Persegi) UbahS(s float64){
    p.S = s
}

func (p Persegi) UbahS2(s float64) {
     p.S = s
}

func main() {
    a := NewPersegi(4)
    fmt.Println(a.Luas(), a.S)
    a.UbahS(5)
    fmt.Printf("ubah dengan [pointer] %f\n", a.S)

    a.UbahS2(10)
    fmt.Printf("ubah tanpa [pointer] %f\n", a.S)
}
// Hasilnya
// 16 4
// ubah dengan [pointer] 5.000000
// ubah tanpa [pointer] 5.000000

// Program exited.

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Jika penasaran hasilnya, anda bisa mencoba sendiri &lt;a href="https://play.golang.org/p/0UKYzn6R_A"&gt;contoh&lt;/a&gt; di play.golang.org. Dari contoh diatas bahwa fungsi yang menggunakan &lt;a href="https://dev.to/h4ckm03d/pointer-4nin-temp-slug-4199032"&gt;pointer&lt;/a&gt; akan berpengaruh ke &lt;code&gt;struct&lt;/code&gt; asal sedangkan fungsi &lt;code&gt;UbahS2&lt;/code&gt; tidak berpengaruh pada nilai &lt;code&gt;S&lt;/code&gt; karena jika tanpa menggunakan &lt;a href="https://dev.to/h4ckm03d/pointer-4nin-temp-slug-4199032"&gt;pointer&lt;/a&gt; maka akses peubah &lt;code&gt;p&lt;/code&gt; merupakan &lt;code&gt;copy struct&lt;/code&gt; bukan sebagai reference dari &lt;code&gt;struct&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sampai jumpa di tulisan selanjutnya…&lt;/p&gt;

</description>
      <category>go</category>
      <category>struct</category>
    </item>
    <item>
      <title>Pointer</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Sun, 05 Nov 2017 08:36:49 +0000</pubDate>
      <link>https://dev.to/lumochift/pointer-201l</link>
      <guid>https://dev.to/lumochift/pointer-201l</guid>
      <description>&lt;p&gt;Pointers gave me some nostalgic moment when learning C++ on first semester. They become a source of headache on my day. Pointers are one of the main tools to achieve high-performance code in non-garbage-collected languages. So what about pointers in Go? Luckily Go’s pointer has achieved the best of both worlds by providing high-performance pointers with garbage-collector capabilities and easiness.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pointers in real world
&lt;/h1&gt;

&lt;p&gt;Unconsciously we already know the main concept of pointers in the real world. Nowadays online markets are popular, we’d like to shopping using a smartphone or computers. After checkout, if you want to receive the package in your house, it’s far easier to simply send the address of your house(pointer) instead of sending the entire house to the seller so that your package is deposited inside. The problem is if you send the wrong address of yours. You will not get the package.&lt;/p&gt;

&lt;p&gt;Let’s back to the programming world. For example, I have a simple program to convert mp3 files to another format. In the first step, I must read the mp3 files and save to the variable, let’s say the variable size is 1GB and I need to pass it to another function. Without a pointer, the entire variable is cloned to the scope of the function that is going to use it. So I will have 2GB of memory occupied by using this variable twice. If the second function will pass again to another function, the memory occupied will raise.&lt;/p&gt;

&lt;p&gt;If I use a pointer to pass a very small reference to another function so that just the small reference is cloned and I can keep memory usage low.&lt;/p&gt;

&lt;p&gt;Different from C or C++ pointers, in GO very limited. We can’t use pointer arithmetic nor can we create a pointer to reference an exact position in the stack.&lt;/p&gt;

&lt;p&gt;Here the basic of &lt;a href="%5Bhttps://play.golang.org/p/FqVdZ6ntLN%5D(https://play.golang.org/p/FqVdZ6ntLN)"&gt;Example&lt;/a&gt; of pointers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "fmt"
    "unsafe"
)

type Music struct {
    SongName string
    TrackNo int
    Singer string
}

func main() {
    // declare a variable
    music := Music{"November Rain", 20, "Gun n Roses"}
    // set pointer of music to variable p
    p := &amp;amp;music
    fmt.Printf("music data %v\n", music)
    fmt.Printf("Pointer of music %p\n", p)
    // access original value using pointer
    fmt.Printf("Get music from pointer %v\n", *p)

    fmt.Printf("Original size: %T, %d\n", music, unsafe.Sizeof(music))
    fmt.Printf("Pointer size: %T, %d\n", p, unsafe.Sizeof(p))
}

// output:
// music data {November Rain 20 Gun n Roses}
// Pointer of music 0x10444240
// Get music from pointer {November Rain 20 Gun n Roses}
// Original size: main.Music, 20
// Pointer size: *main.Music, 4

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;music := Music{"November Rain", 20, "Gun n Roses"}&lt;/code&gt; code represent our 1GB variable and &lt;code&gt;p&lt;/code&gt; contains the reference with value &lt;code&gt;0x10444240&lt;/code&gt; (represented by an ampersand). We can use asterisk &lt;code&gt;*&lt;/code&gt; to take value from referenced by the pointer. With that example we have an original size of music data is 20 bytes and pointer only 4 bytes. Pointer size has the same size as int variable in Go. Even if I increase the size of the struct/variable the pointer remains the same size.&lt;/p&gt;

&lt;p&gt;I hope you can understand. See ya on the next post…&lt;/p&gt;

</description>
      <category>go</category>
      <category>pointer</category>
    </item>
    <item>
      <title>Computer Science for Humanities</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Tue, 25 Nov 2014 13:02:21 +0000</pubDate>
      <link>https://dev.to/lumochift/computer-science-for-humanities-f9f</link>
      <guid>https://dev.to/lumochift/computer-science-for-humanities-f9f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Computer science is no more about computers than astronomy is about telescopes, biology about microscopes, or chemistry about beakers and test tubes. Science is not about tools. It is about how we use them, and what we find out when we do.— &lt;strong&gt;Michael Fellows and Ian Parberry&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine if today without computer technology, maybe we still doing everything in a manual way and paper everywhere without a gadget, internet connection, smart device, and many things. We are living in the computer era with a new lifestyle and the computer is really helpful to human being. But if you hear the computer science degree what are you thinking about at first? During my first semester in college, I imagine if I will learn software like photoshop, flash, fixing computer hardware, and game. I was wrong because I meet mathematics, programming, basic natural science, and other unexpected subjects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Computer science is a liberal art. It’s something everyone should know how to use and harness in their life.— &lt;strong&gt;Steve Jobs&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My heart just rebel, why I got all of this. For what? Why I must enroll biology, physic, chemistry, calculus, linear algebra, numerical method, operation research, statistics, probability theorem, discrete mathematics and mathematics stuff which not related at all with computer science. Slow but sure finally I know if computer science is just tools which connected to other disciplines. Before goes to another discipline area, I want to share a story about basic mathematics in computer science. I’m too naive to hate mathematics at first then I realize every computer science subject base on mathematics.&lt;/p&gt;

&lt;p&gt;Why learn calculus? because to calculate in advance subject at CS you will need them such as &lt;code&gt;digital image processing&lt;/code&gt; you will face the integral, derivation. You must learn calculus and numerical method because the computer is finite and not continuous you must convert calculation from continuous to discrete so the computer can help you in computation.&lt;/p&gt;

&lt;p&gt;If we want to create computer games, we must know about psychic, art, history, mathematics dan optimization. Like angry birds games, it converts the annoying parabolic theorems into the beautiful and funny computer game.&lt;/p&gt;

&lt;p&gt;Bioinformatics, medical records, information systems, everything can be connected to computer science even the economic area like prediction stocks using &lt;code&gt;artificial intelligence&lt;/code&gt;. Before we can do that we must learn about natural science, artificial intelligence, information systems, little accounting or every subject which supports what you do.&lt;/p&gt;

&lt;p&gt;So computer science does not end up with calculation or computer itself but spread all across the different areas which unlimited scenarios that we can imagine.If you already put yourself into the computer science world, I hope we can support each other and make computer science easy to understand and fun to learn because computer science for humanity.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>opinion</category>
    </item>
    <item>
      <title>Am I Lost?</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Mon, 24 Nov 2014 13:02:21 +0000</pubDate>
      <link>https://dev.to/lumochift/am-i-lost-265a</link>
      <guid>https://dev.to/lumochift/am-i-lost-265a</guid>
      <description>&lt;p&gt;I’m proud to be a software engineer, programmer, code saint, or whatever you call it 😄. Do you know before I choose Computer Science degree I don’t know what the hell Computer Science is? Here the short history about the path of my adventure of code. :p&lt;/p&gt;

&lt;h1&gt;
  
  
  Junior High School Arch
&lt;/h1&gt;

&lt;p&gt;In this era, I don’t know what I’m doing and I hate to enter Junior High School 1 Malang because I wanted to enter another school. Every day just went to school, learn, play, and made some trouble. Just some trouble, not so many I think. haha… I still remember the day I was touch the computer, yeah MS-DOS. Use it like a hacker and I always remember the fun moment when I’m trying to execute command &lt;code&gt;del *.*&lt;/code&gt; on MS-DOS then everything going dark.&lt;/p&gt;

&lt;p&gt;After that &lt;strong&gt;great&lt;/strong&gt; experiment I’m afraid to explore that &lt;code&gt;black thing&lt;/code&gt; again. Besides of that, I don’t like computer stuff because pricey thing that I couldn’t afford to buy it. Do you know I hate Mathemathic subject and love to learn biology. This arch doesn’t have good memories for me. Everything so flat and had a bad memory with MS-DOS.&lt;/p&gt;

&lt;h1&gt;
  
  
  Senior High School Arch
&lt;/h1&gt;

&lt;p&gt;In previous arch so boring huh. My real-life begins in this arch, the first time of my life I love learning Accounting subjects. What? Really? Accounting? Yes, besides physics and chemistry. But that’s not a long story, everything turns 180 degrees after my class move near the computer laboratory. Everyday I always in the lab, yes just play the game. That era counter strike is the one of phenomenal game beside the starcraft. And I had a computer in second-year life on my senior high school life, the fact still not change every day always playing game. After that, I choose computer science degree in Brawijaya University because of the campus location near with my home. But the decision about really went to college was after I failed in selection to join Navy Academy.&lt;/p&gt;

&lt;h1&gt;
  
  
  Undergraduate Arch
&lt;/h1&gt;

&lt;p&gt;YES, final arch. Welcome to Mathematic Major, eh. Math? What? I hate math, but this is the path I choose, I must survive. In my first year I meet the C++ world and piss off with pointer stuff. I’m mastered C++? not yet mastered just know it. Then the second year meet java and also with another mathematics subject such as algebra, linear algebra, numerical method, operation research, statistics, automata, and etc. Haha… If you hate mathematics like me, you have two choice: learn how to love it maybe at least hardwork to learn it or leave. :p&lt;/p&gt;

&lt;p&gt;Back to java story, start from C++ is easy to print out to screen just &lt;code&gt;cout&amp;lt;&amp;lt;"bla bla bla";&lt;/code&gt; but java have more complex for IO. But it just story of my first week meet the java, everyday going a good day with java until my last year in college. C# invasion, I can’t avoid because easy and better than java (IMHO). I finish my application for my final year project just in 2 weeks, but I learn to solve my the problem for 6 months. And my story of undergraduate arch closed with C# as main language to do programming stuff.&lt;/p&gt;

&lt;h1&gt;
  
  
  Postgraduate arch
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;null pointer exception&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Programmer Arch
&lt;/h1&gt;

&lt;p&gt;There is bonus arch, the short story as a programmer. Start as C# programmer with first project interfacing microcontroller, then medical software. One year with C# then intensive using python with tornado package to build website and using backbonejs as front end scripting. Only just one year also, and now still using Golang as main programming language. Such a long, boring story about my adventure.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;At first hate math then end up with the same condition. Now I’m realized I’m not lost to choose computer science. And for everyone who decide join the hellish world that I choose. Two message for you, just love what you do and never give up. All programmer around the world will be your best friend don’t forget them. I love you all. :p&lt;/p&gt;

</description>
      <category>diary</category>
      <category>myjourney</category>
    </item>
    <item>
      <title>Konsep synchronous dan asynchronous</title>
      <dc:creator>Moch. Lutfi</dc:creator>
      <pubDate>Sat, 12 Oct 2013 13:02:21 +0000</pubDate>
      <link>https://dev.to/lumochift/konsep-synchronous-dan-asynchronous-2fck</link>
      <guid>https://dev.to/lumochift/konsep-synchronous-dan-asynchronous-2fck</guid>
      <description>&lt;p&gt;Dalam postingan pertama ini saya akan sedikit mengulas tentang konsep asynchronous dalam analogi sederhana sehingga bisa memudahkan pembaca dalam memahaminya.&lt;/p&gt;

&lt;p&gt;Sebelum itu perlu kita ketahui ada proses synchronous dan asynchronous, apa bedanya? Mari kita simak analogi sederhana berikut.&lt;/p&gt;

&lt;p&gt;Untuk penjelasan selanjutnya saya menggunakan istilah sync untuk proses synchronous dan async untuk proses asynchronous.&lt;/p&gt;

&lt;p&gt;Pertama-tama akan saya gambarkan dalam bentuk proses yg berurutan:&lt;/p&gt;

&lt;h2&gt;
  
  
  State awal
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Kondisi awal, sedang main DOTA 2. Lagi seru-serunya nih, dapet hero favorit juga.&lt;/li&gt;
&lt;li&gt;Perut udah dangdutan gara-gara seharian belum makan dan di dapur semua makan ludes, apesnya lagi sendiri juga dirumah.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  proses sync
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Demi kesehatan akhirnya meninggalkan peperangan dan pergi ke toko terdekat beli mie instant (kira-kira butuh waktu 10 menit, maklum jalan kaki cuy).&lt;/li&gt;
&lt;li&gt;Sesampainya dirumah langsung masak mie (butuh waktu 10 menit), udah dicacat-cacatin temen nih di chat T_T&lt;/li&gt;
&lt;li&gt;Akhirnya bisa makan juga, meski dengan penuh pengorbanan 1 match. :(&lt;/li&gt;
&lt;li&gt;Setelah makan balik ngadep PC dan memelas serta minta maaf ke anggota clan. Maaf ane leave gan.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Proses async
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Disaat lapar pun tetap tenang dan dengan sigap ambil hape trus pesen makanan cepat saji, dan diakhir pembicaraan dengan lantang bilang “ga pake lama ya mbak :3”. (ga sampai 1 menit)&lt;/li&gt;
&lt;li&gt;Lanjut main DOTA deh sambil nunggu pesenan datang.&lt;/li&gt;
&lt;li&gt;Ting tong bunyi bel rumah bunyi. Alhamdulillah pesenan dah dateng dan pas match baru aja selesai.&lt;/li&gt;
&lt;li&gt;Ambil pesenan dan ga lupa bayar. Trus makan deh.&lt;/li&gt;
&lt;li&gt;Setelah makan balik WAR lagi. uyeaah.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Dari cuplikan proses diatas dapat diambil kesimpulan pada saat proses sync, tiap proses harus diselesaikan terlebih dahulu agar bisa melanjutkan ke proses selanjutnya dan harus berurutan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Berbeda dengan async proses, pada async proses masih tetap bisa pada state awal tetapi dalam kondisi menunggu proses yang berjalan diluar system seperti proses masak makanan cepat saji sampai makanan sampai di rumah. Dan pada saat proses lain tersebut selesai ia akan memberi tanda bahwa proses sudah selesai.&lt;/p&gt;

&lt;p&gt;Dalam konteks async diatas, notifikasi atau tanda jika proses lain adalah bel rumah berbunyi berarti tanda kurir makanan cepat saji sudah datang. Notifikasi seperti ini dalam bahasa pemrograman disebut callback yang berisi informasi proses dan proses tambahan seperti mbayar makanan. :p&lt;/p&gt;

&lt;p&gt;Semoga sedikit kisah ga jelas tersebut bisa membantu memahami konsep asynchronous.&lt;/p&gt;

</description>
      <category>async</category>
    </item>
  </channel>
</rss>
