---
# System prepended metadata

title: Golang 基本概念集合
tags: [Golang, ' 定義一個物件']

---

---
tags: Golang, 定義一個物件
---
# Golang 基本概念集合
>  C:\Users\yichenho\go\src\example> go run hello.go
### &sect; 文件架構
```
package main

import {
  "fmt"
  list 不用加,
}

func main(){
 
  var x int = 5 
  x := 5    簡寫

  fmt.Println(x)
}
```
###  &sect; 給予型別之方法
1. var x **int** = 5 
2. x **:=** 5

###  &sect; 每個type都有zero value

int 0

string ''

###  &sect; Array
1. var a [5]int
```
fmt.Println(a)  // [0 0 0 0 0]

a[2]= 7   // [0 0 7 0 0]
```

2. a :=[5]int{5,4,3,2,1}   // [5,4,3,2,1]
```
a :=[5]int{5,4,3,2,1}   // [5,4,3,2,1]
```

3. a :=[]int{5,4,3,2,1} 
  a=append(a, 13)
  
  
 ###  &sect; map 型別
 > 無序的鍵值對的集合。Map 最重要的一點是通過 key 來快速檢索資料，key 類似於索引，指向資料的值。
 > map是一個引用型別,必須初始化才能使用，否則會panic
 做一個map key值是string value是number
 ```

 vertices := make(map[string]int)
 
 vertices["triangle"]= 2
 vertices["square"]= 3
 vertices["dodecagon"]=12
 
 
 
 // get value
 fmt.Pringln(vertices["triangle"])  //2 
 
 //delete value
delete(vertices,"triangle")
       mapName   keyName
 
 
 
```

### for 迴圈寫法
```
func main (){
  for i :=0; i<5 ; i++{
      fmt.Println(i)   // 0 1 2 3 4
  }
}
 
```

### while 迴圈寫法
```
 i := 0
 
  for i<5 {
     fmt.Println(i)   // 0 1 2 3 4
     i++
  }
```


### &sect; array迴圈
 ```
arr := []string{"a","b","c"}
 
 for index,value := range arr {
     fmt.Println("index", index, "val", value)
 }
```

### &sect; map迴圈
 ```
m := make(map[]string{"a","b","c"}
 
 for key, value := range m {
     fmt.Println("key", key, "val", value)
 }
```


### 字串單雙引號的差別
在C語言中
單引號是給單一字元使用
例如'C'
'\n'


大於一個字元的屬於字串 要使用雙引號""



### &sect; fn
1. (x int) int<回傳變數的型別>                   
```
func sum(x int, y int) int {

return x+y 
}
```

2. 多樣的return 值定義

```
func sqrt(x float64) (float64, error){
 if x<0 {
  return 0, errors.New("Undefined or negative numbers")
 }
 return math.Sqrt(x),nil 
}
```

引用方法
```
func main(){
    result, err := sqrt(-16)

    if err != nil{
      fmt.Println(err)
    }else{
     fmt.Println(result)
    }
 }
```


>> null 在golang 是 nil

>> errors 是一個library 需要import先
```
import {
  "fmt"
  "errors"
}
```
### struct  (golang的obj)
* 定義模板(像是class)
```
type person struct{
 name string
 age int
}
```
* 使用

```
func main() {
    p := person{name:"Iris", age:"30"}
    fmt.Println(p)  // {name:Iris, age:30}
    fmt.Println(p.name)  // Iris
}
```

### 定義一個物件指給一個參數
`form :=struct {Name string; ID string} {Name:"Test",ID:"A123456789"}`

### &sect; pointer 記憶體位置

```
func main(){
 i:= 7
 fmt.Println(i)  //7
  fmt.Println(&i)  // 位置0xc0000100a0
}
```


### &sect; 針對某記憶體位置操作裡面的值
```
func main(){
    i:=7
    inc(&i) // 傳i的記憶體過去
	fmt.Println(i)  // 神奇 不用接變數直接變成8
}
```

```
func inc(x *int){
    //* 表示取記憶體的值
    *x++
}
```


[教學影片出處-12mins](https://www.youtube.com/watch?v=C8LgvuEBraI)

[教學影片出處-6hrs](https://www.youtube.com/watch?v=YS4e4q9oBaU&t=650s)