---
tags: Golang, 定義一個物件
---
# Golang 基本概念集合
> C:\Users\yichenho\go\src\example> go run hello.go
### § 文件架構
```
package main
import {
"fmt"
list 不用加,
}
func main(){
var x int = 5
x := 5 簡寫
fmt.Println(x)
}
```
### § 給予型別之方法
1. var x **int** = 5
2. x **:=** 5
### § 每個type都有zero value
int 0
string ''
### § 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)
### § 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++
}
```
### § array迴圈
```
arr := []string{"a","b","c"}
for index,value := range arr {
fmt.Println("index", index, "val", value)
}
```
### § map迴圈
```
m := make(map[]string{"a","b","c"}
for key, value := range m {
fmt.Println("key", key, "val", value)
}
```
### 字串單雙引號的差別
在C語言中
單引號是給單一字元使用
例如'C'
'\n'
大於一個字元的屬於字串 要使用雙引號""
### § 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"}`
### § pointer 記憶體位置
```
func main(){
i:= 7
fmt.Println(i) //7
fmt.Println(&i) // 位置0xc0000100a0
}
```
### § 針對某記憶體位置操作裡面的值
```
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)