# Socket
## Go Basic
### `for`
Statement `for` syntax:
```go
for ekspresi_1, ekspresi_2; eksprtesi_3 {
// ...
}
```
Contoh:
```go
package main
import "fmt"
func main() {
sum := 0;
for index := 0; index < 10; index++ {
sum += index
}
fmt.Println("sum = ", sum)
}
```
Output:
```
sum = 45
```
Kita dapat tidak menuliskan `ekspresi_1` dan `ekspresi_2`:
```go
sum := 1
for ; sum < 1000; {
sum += sum
}
```
Kita dapat juga tidak menuliskan `;`. Ini sama seperti `while`:
```go
sum := 1
for sum < 1000 {
sum += sum
}
```
Loop `for` dapat membaca data dari `array`, `slice`, `map`, dan `string` ketika digunakan bersama dengan `range`:
```go
for k, v := range map {
fmt.Println("map's key: ", k)
fmt.Println("map's value: ", v)
}
```
Karena Go mendukung nilai kembali lebih dari satu dan memberikan error kompilasi ketika kita tidak menggunakan nilai-nillai yang dikembalikan, kita dapat menggunakan `_` untuk mengabaikan nilai kembali tertentu:
```go
for _, v := range map {
fmt.Println("map's val: ", v)
}
```
Kita dapat menuliskan loop infinite yang ekuivalen dengan `while true { ... }` di bahasa lain:
```go
for {
// statement
}
```
## 3.5 Object Oriented
### Method
Misalkan kita mendefinisikan sebuah struct "rectangle" dan kita ingin menghitung luasnya. Kita dapat menggunakan kode berikut untuk mencapai tujuan ini:
```go
package main
import "fmt"
type Rectangle struct {
width, height float64
}
func area(r Rectangle) float64 {
return r.width * r.height
}
func main() {
r1 := Rectangle{12, 2}
r2 := Rectangle{9, 4}
fmt.Println("Area r1 = ", area(r1))
fmt.Println("Area r2 = ", area(r2))
}
```
Kode di atas menggunakan sebuah fungsi bernama `area` yang menerima sebuah argument berupa struct `Rectangle` dan mengembalikan sebuah nilai `float64`.
Kita dapat menuliskan method untuk kode di atas. Syntax dari method:
```go
func (r ReceiverType) namaFungsi(parameter...) (nilaiReturn)
```
Kode di atas jika dituliskan menggunakan method:
```go
package main
import {
"fmt"
"math"
}
type Circle struct {
radius float64
}
type Rectangle struct {
width, height float64
}
// method
func (c Circle) Area() float64 {
return c.radius * c.radius * math.Pi
}
// method
func (r Rectangle) Area() float64 {
return r.width * r.height
}
func main() {
c1 := Circle{10}
}
```
## 8.1 Socket