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的部份就好,某程度是減少重工的情形產生。
就類似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
一句話,傳址(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二種型態,等後面的文章會一併提到~~