iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
Modern Web

還喝不 go系列 第 13

[13th][Day13] slice

  • 分享至 

  • xImage
  •  

在 go 的世界中,沒有 array 這個 keyword ,只有 slice 跟 map
map 有 key / value 的概念

先來說說 slice

之前我們遇到的變數皆為獨特的、單一的,當想要操作多個類似結構的資料時,在 computer science 中,可以用集合來操作多個同一類型的結構,也可以透過 loop 來處理重複性的工作。

可以把 slice 想像成一排藥盒,每個格子中儲存一個資料。slice 的限制在於『只能儲存同一種類型』的資料,而且建立後長度不能改變。

宣告一個長度為 4 ,屬性為 string 的 slice

func main() {
	var langs [4]string

	langs[0] = "Go"
	langs[1] = "GoWorker"
	langs[2] = "GoHttp"
	langs[3] = "GoServer"
    
    fmt.Println(langs)
}

slice 的 index 是從 0 開始,而非從 1 開始

或者 ... 可以用語法糖的方式同時宣告&賦值

func main() {
	langs := [4]string{
		"Go",
		"GoWorker",
		"GoHttp",
		"GoServer",
	}
    fmt.Println(langs)
}

遍歷 for range
Go 的 for 迴圈可以使用 for range 掃過所有元素。

func main() {
    langs := [4]string{
        "Go",
		"GoWorker",
		"GoHttp",
		"GoServer",
    }
 
    for k, v := range langs {
        fmt.Println(fmt.Sprintf("%d: %s", k, v))
    }
}

如果不需要 index ,可以使用底線 _ 代替:

    for _, v := range langs {
        fmt.Println(e)
    }

使用 for k,v := range 時,直接修改 v 的值是沒有效果的

    for _, e := range arr {
        e = e * e
    }
 
     // nothing happened
    for _, e := range arr {
        fmt.Println(e)
    }

把『要修改得值』 塞到指定的位置 才能做到改動


    arr := [5]int{1, 2, 3, 4, 5}
 
    for i := 0; i < len(arr); i++ {
        arr[i] = arr[i] * arr[i]
    }
 
    for _, e := range arr {
        fmt.Println(e)
    }

上一篇
[13th][Day12] struct
下一篇
[13th][Day14] map
系列文
還喝不 go23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
obarisk
iT邦研究生 2 級 ‧ 2021-09-23 09:29:07

golang 還是有 array 吧?
有帶長度的,都是 array

看更多先前的回應...收起先前的回應...
obarisk iT邦研究生 2 級 ‧ 2021-09-23 09:29:41 檢舉

記憶體的配置方式應該不同

感謝提醒 我修正一下 .... 沒有 array 這個 『keyword』

obarisk iT邦研究生 2 級 ‧ 2021-09-24 09:18:56 檢舉

這樣的話

x := [4]string
y := []string

x 是 array
y 是 slice

應該是這樣吧?

指定長度的 slice 可以稱作為 array
我自己是比較常用 y := []string 的方式

另外在宣告時後面要加上{}

我要留言

立即登入留言