iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
1
DevOps

欸你這週GO了嘛系列 第 5

[DAY5]認識GO-下

struct 結構

struct簡單來說,類似c#的class一樣,裡面可以有各種屬性,也像是json一樣,也可單純當資料的載體

package main

import "fmt"

func main() {
	var a string
	var b string
	var c int
	var d float64
	a = "my"
	b = "weight"
	c = 85
	d = 0.5
	test(a, b, c, d)
	testStruct(qq{a: a, b: b, c: c, d: d})
}

type qq struct {
	a string
	b string
	c int
	d float64
}

func test(a string, b string, c int, d float64) {
	fmt.Println(a, b, c, d)
}
func testStruct(t qq) {
	fmt.Println(t.a, t.b, t.c, t.d)
}

當FUNCTION的參數一多時,除非寫到很煩外,也很容易遇到如果參數增減或是改型態時,
會有改不完的地方,使用STRUCT當參數就只要動STRUCT的部份就好,某程度是減少重工的情形產生。

map 映射

就類似c#字典檔,以key value的方式儲存的資料結構,使用map有一個好處,如果知道key值的話,不用跑for loop去取得對應的value值

package main

import (
	"fmt"
)

func main() {
	//產生map並初始化map要使用make語法
	//map[key值的型態]value的型態
	mp := make(map[string]string)

	//新增map key與value值
	mp["BMW"] = "330i"
	mp["BENZ"] = "C300"
	mp["LEXUS"] = "IS300T"

	fmt.Println(mp)
    
    //知道key值就可以直接取value
	car, found := mp["BMW"]
	if found {
		fmt.Println(car)
	}
}
map[BENZ:C300 BMW:330i LEXUS:IS300T]
330i

如果用slice與map的比較

package main

import (
	"fmt"
)

func main() {
	//產生map並初始化map要使用make語法
	//map[key值的型態]value的型態
	mp := make(map[string]string)

	//新增map key與value值
	mp["BMW"] = "330i"
	mp["BENZ"] = "C300"
	mp["LEXUS"] = "IS300T"

	type car struct {
		brand string
		model string
	}
	car1 := car{"BMW", "330i"}
	car2 := car{"BENZ", "C300"}
	car3 := car{"LEXUS", "IS300T"}

	//如果運氣不好,要查詢的條件是最後一筆時,等於陣列全跑完...
	ss := []car{car1, car2, car3}
	for _, s := range ss {
		if s.brand == "BMW" {
			fmt.Println(s.model)
		}
	}

	//知道key值就可以直接取value
	value, found := mp["BMW"]
	if found {
		fmt.Println(value)
	}
}
330i
330i

pointer 指標

一句話,傳址(call by address)非傳值(call by value),如果定義成pointer型態時,如果丟進func裡面,
func對此變數進行更動時,func return後,此變數也會跟著異動。
golang對pointer型態的效能是優於傳值

package main

import (
	"fmt"
)

func main() {
	a := "GG"

	//傳值,bb func裡面有對a有做異動,但對go來說只是複製一份資料進func,不會異動到原變數
	bb(a)
	fmt.Println(a)
    //值址,qq func裡面有對a有做異動,因為是使用同個記憶體位址,所以會異動到原變數
 	qq(&a)
	fmt.Println(a)

}

func qq(a *string) {
	*a = "台GG NO.1"
}
func bb(a string) {
	a = "taiwan no.1"
}

GG
台GG NO.1

目前還剩下channel、func二種型態,等後面的文章會一併提到~~

https://ithelp.ithome.com.tw/upload/images/20200913/20129515FgzZWbAnwT.png


上一篇
[DAY4]認識GO-上
下一篇
[DAY6]開始寫GO啦~~認識變數
系列文
欸你這週GO了嘛30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言