iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0

What is Map?

Map即是一種利用Key-Value方式來對應的資料格式,有點類似於Python的dict

映射 Map

意指裡頭的資料結構皆是由一組關鍵字對應一個(Key-Value)的方式存在。

var Variable = map[Type]Type{}

可以像這樣bool對應到string

package main

import "fmt"

func main() {
	var prize = map[int]string{
	1: "First",
	2: "Second",
	}
	fmt.Println(prize[1])
}

運行後可得以下結果

First

用for迭代遍

透過for range關鍵字,遍歷造訪結構內的每個元素

package main

import "fmt"

func main() {
	var prize = map[int]string{
	1: "First",
	2: "Second",
	}
	for key, value := range prize {
	fmt.Println(key, value)
}
}

運行後可得以下結果

1 First
2 Second

What is Struct?

Struct就是種有著類似物件導向觀念的物件集合體,你可以定義該資料集合內資料組成的結構與型別,與Python中的class類似。

結構 Struct

結構裡面可以放多個變數(intstringslicemap..etc)、物件甚至是結構。

首先介紹一個簡單的範例:

package main
 
import (
    "fmt"
)
 
type Point struct {
    x float64
    y float64
}
 
func main() {
    p := Point{x: 3.0, y: 4.0}
 
    fmt.Println(p.x)
    fmt.Println(p.y)
    
    n := new(Point)
    fmt.Println(n)
    fmt.Println(n.x)
    fmt.Println(n.y)
    
}

運行後得以下結果

3
4
&{0 0}
0
0

我們可以得知使用struct的宣告與取值相當的簡單,此外new一個新的struct object之後,若無賦予裡頭變數值,會依照他的type給預設值。

此外,幾種宣告Struct的方式如下:

package main

import "fmt"

type Res struct {
	Status string     `json:"status"`
	Msg string        `json:"msg"`
}

func main()  {
	res1 := new(Res)

	var res2 = new(Res)

	var res3 *Res

	res4 := &Res{
		Status: "failed",
	}

	fmt.Println(res1, res2, res3, res4)
	fmt.Printf("%+v %+v %+v %+v",res1, res2, res3, res4)
}

運行後可得以下結果

&{ } &{ } <nil> &{failed }
&{Status: Msg:} &{Status: Msg:} <nil> &{Status:failed Msg:}

Nested Structure 巢狀結構

package main
 
import (
    "fmt"
)
 
type Box struct {
    Pencil string
    Eraser string
}

type Bag struct {
    Box
    Book string
}
 
func main() {
    var bag = Bag{
	Box{Pencil: "Big Pencil", Eraser: "White White"},
	"Ironman-2021-Go",
}
    fmt.Printf("%+v", bag)
    
}

運行後得以下結果

{Box:{Pencil:Big Pencil Eraser:White White} Book:Ironman-2021-Go}

我們可以利用struct做到多層次的巢狀結構!

指標、結構、位址

如果將main()中的var Bag改成 &Bag

package main
 
import (
    "fmt"
)
 
type Box struct {
    Pencil string
    Eraser string
}

type Bag struct {
    Box
    Book string
}
 
func main() {
    var bag = &Bag{
	Box{Pencil: "Big Pencil", Eraser: "White White"},
	"Ironman-2021-Go",
}
    fmt.Printf("%+v", *bag)
    
}

印出bag 就要透過*來取值

{Box:{Pencil:Big Pencil Eraser:White White} Book:Ironman-2021-Go}

如果將Bag裡的Box改成*Box

package main
 
import (
    "fmt"
)
 
type Box struct {
    Pencil string
    Eraser string
}

type Bag struct {
    *Box
    Book string
}
 
func main() {
    var bag = Bag{
	&Box{Pencil: "Big Pencil", Eraser: "White White"},
	"Ironman-2021-Go",
}
    fmt.Printf("%+v", bag)
    
}

這樣子就會印出bag的位址

{Box:0xc000054020 Book:Ironman-2021-Go}

Summary

這章節為大家演繹了兩種經常使用的資料結構,分別為mapstruct,那在下個章節會在介紹functioninterface給大家認識,敬請期待。


上一篇
Day6 Array and Slice
下一篇
Day8 Function and Interface
系列文
fmt.Println("從零開始的Golang生活")30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言