Senin, 15 Desember 2014

FUNGSI



Fungsi

          Fungsi merupakan bagian independen kode map nol atau lebih pada input parameter  ke nol atau lebih parameter output. Fungsition juga dikenal sebagai prosedur atau subrutin dan sering digambarkan sebagai black box. Fungsi (Function) merupakan blok dari kode yang dirancang untuk

 melaksanakan tugas khusus. Kegunaan dari fungsi ini adalah untuk:
- Mengurangi pengulangan penulisan program yang berulangan atau sama.
- Program menjadi lebih terstruktur, sehingga mudah dipahami dan dapat lebih dikembangkan.



Sekarang kita akan mulai menulis program yang menggunakan lebih dari satu fungsi dengan cara kerjanya yaitu menghitung sejumlah rata-rata angka. fungsi average adalah mengambil slice float64.

func main() {
    xs := []float64{98,93,77,82,83}
   
    total := 0.0
    for _, v := range xs {
        total += v
    }
    fmt.Println(total / float64(len(xs))) // xs parameter fungis
}


Memulai fungsi dengan keyword func dengan di ikuti dengan nama fungsi. Fungsi mulai dengan func kata kunci, diikuti dengan nama fungsi. Parameter (input) dari fungsi didefinisikan seperti : name type, name type, dan lain sebagainya. dalam program tersebut fungsi built-in dipanggil yang disebut panik yang mana dapat menyebabkan kesalahan run time. Contoh  mengambil code dari main fungsi dan  dan fungsi ini akan memindahkanya ke dalama rata-rata :

func average(xs []float64) float64 {
        total := 0.0    for _, v := range xs {
        total += v
    } 
    return total / float64(len(xs))
}

         Perhatikan bahwa kita mengubah fmt.Println menjadi return sebagai gantinya. Pernyataan return menyebabkan fungsi untuk menghentikan dan mengembalikan nilai setelah satu  panggilan fungsi. Modifikasinya seperti ini

func main() {
    xs := []float64{98,93,77,82,83}
    fmt.Println(average(xs))
}

Dalam menjalanka program ini ada beberapa yang harus di perkatikan yaitu
1.   nama parameter tidak harus sesuai dengan fungsi yang di panggil misalnya
     func main() {
          someOtherName := []float64{98,93,77,82,83}
          fmt.Println(average(someOtherName))
     }

22   fungsi tidak mempuyai akses untuk apa pun di pemanggilan fungsi. Hal ini tidak akan bekerja:
func f() {
    fmt.Println(x)
}
func main() {
    x := 5
    f()
}
Karena tidak bekerja program diatas  maka kita mencari solusi yaitu dengan membutuhkan salah satu fungsi

func f(x int) {
    fmt.Println(x)
}
func main() {
    x := 5
    f(x)
}

atau



var x int = 5
func f() {
    fmt.Println(x)
}
func main() {
    f()
}

3.  Fungsi yang dibangun di "stack". Misalkan kita memiliki program ini:
 
func main() {
    fmt.Println(f1())
}
func f1() int {
    return f2()
}
func f2() int {
    return 1
}
Maka bentunya seperti ini




Variabel Function

             MakeEvenGenerator mengembalikan fungsi yang menghasilkan angka genap. Setiap kali dipanggil akan ditambahkan 2 variabel dengan batasan sampai ke lokal i variabel which – unlike normal local variables – persists anara panggilan.
Ada bentuk khusus yang tersedia untuk last  parameter dalam fungsi Go:

 func add(args ...int) int {
    total := 0    for _, v := range args {
        total += v 
    }
    return total}func main() {
    fmt.Println(add(1,2,3))
}

Menambah 1 variabel x yang didefenisiskan dalam fungsi scope. Variabel x ini dapat diakses dan dimodifikasi oleh fungsi increment. inilah sebabnya mengapa pertama kalianya kita buat incrument saat melihat 1 tampilan.fungsi seperti ini sama dengan fariabel non local pada referensi yang di kenal sebagai close. dalam hal ini variabel x membentuk closure. salah satu cara menggunakan closure adalah  dengan menulis fungsi yang mengembalikan fungsi lain pada saat dipanggil sehingga menghasilkan urutan angka. sebgai contoh bagaimana kita mengasilkan semua nomor .

func makeEvenGenerator() func() uint {
    i := uint(0)
    return func() (ret uint) {
        ret = i
        i += 2
        return
    }
}
func main() {
    nextEven := makeEvenGenerator()
    fmt.Println(nextEven()) // 0
    fmt.Println(nextEven()) // 2
    fmt.Println(nextEven()) // 4
}


 

Recursi
Dalam pembahasan Recursi ini  factorial akan memanggil dirinya sendiri. Closure and recursion adalah tekini pemograman yang kuat yang menjadi dasar paradigm yang dikenal sebagai pemograman fungsional. Salah satu cara menghitung pengfaktorial nomor adalah
 
func factorial(x uint) uint {
    if x == 0 {
        return 1
    }
 
    return x * factorial(x-1)
}

Defer, Panic & Recover

Go memiliki pernyataan khusus yang disebut defer dengan pemanggilan fungsi yang akan dijalankan setelah fungsi selesai. Perhatikan contoh berikut:
package main
 
import "fmt"
 
func first() {
    fmt.Println("1st")
}
func second() {
    fmt.Println("2nd")
}
func main() {
    defer second()
    first()
}
  

     Defer sering digunakan ketika membutuhkan beberapa cara. Misalnya ketika kita membuka file kita perlu memastikan untuk menutup nanti. Dengan defer yaitu
f, _ := os.Open(filename)
defer f.Close()

Panic & Recover

Sebelumnya telah dibahasa tentang panic dan dalam panic itu sebenarnya dapat menyebabkan kesalahan run time, solusi lain untuk mengangani kesalahan run time tersebut adalah dengan memulihkan fungsi “built-in”. cara kerjanya yaitu menghentikan panic dan mengemebalikan nilai yangn dilewatkan pada panic call dank arena panic akan segera berhenti maka sebaliknya kita harus memasangkan defer

package main
import "fmt"
 
func main() {
    defer func() {    
        str := recover()
        fmt.Println(str)
    }()
    panic("PANIC")
}
Pendukung dari fungsi ini : https://golang.org/ref/spec

Tidak ada komentar:

Posting Komentar