--- 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)