[Golang] Slice - range, slicing, append, delete

Golang Slice 

slice range

slicing a slice

append to a slice

deleting from a slice

  • Slice 是個composite literal
    • ​一個 Slice 會儲存同樣 type 的 value
      • ​如果今天我想要存“我最喜歡的數字“,我會使用 a slice of int
      • 如果今天我想要存"我最喜歡的食物",我會使用 a slice of string
  • ​新增 slice
    • ​利用 composite literal
      • ​composite literal 是一個type 後面接著 {},然後將適當的value放在{}中
    • ​範例程式碼:
      func main() {
      	// COMPOSITE LITERAL
      	x := []int{4, 5, 7, 8, 42}
      	fmt.Println(x)
      }
  • 遍歷 Slice - Range
    • ​利用 Range 去取得每個 slice 中的values
    • func main() {
      	x := []int{4, 5, 7, 8, 42}
      	fmt.Println(len(x))
      	fmt.Println(x)
      	fmt.Println(x[0])
      	fmt.Println(x[1])
      	fmt.Println(x[2])
      	fmt.Println(x[3])
      	fmt.Println(x[4])
      	
      	for i, v := range x {
      		fmt.Println(i, v)	
      	} 
      }
  • 連接 Slice - append slice
    • func main() {
      	x := []int{4, 5, 7, 8, 42}
      	fmt.Println(x)
      	x = append(x, 77, 88, 99, 1014)
      	fmt.Println(x)
      
      	y := []int{234, 456, 678, 987}
      	x = append(x, y...)
      	fmt.Println(x)
      }
  • ​分割 Slice - slicing a slice
    package main
    
    import "fmt"
    
    func main() {
    	x := []int{4, 5, 6, 7, 42}
    	fmt.Println(len(x))
    	fmt.Println(x[:])
    	fmt.Println(x[1:])
    	fmt.Println(x[1:3])
    	
    	for i, v := range x {
    		fmt.Println(i, v)
    	}
    	
    	for i := 0; i <= 4; i++ {
    		fmt.Println(i, x[i])
    	}
    }
    
    • ​可以利用冒號將 slice 分割
    • 利用 x[:] 去取得slice內需要的資料
    • 範例程式碼:

 

  • 同樣地 len(x),可以取得 slice 的大小
  • Make Slice:
    • 先make一個slice
      
      func main() {
      	x := make([]int, 10, 12)
      	fmt.Println(x)
      	fmt.Println(len(x))
      	fmt.Println(cap(x))
      	x[0] = 42
      	x[9] = 999
      
      	fmt.Println(x)
      	fmt.Println(len(x))
      	fmt.Println(cap(x))
      
      	x = append(x, 3423)
      
      	fmt.Println(x)
      	fmt.Println(len(x))
      	fmt.Println(cap(x))
      	
      	x = append(x, 3423)
      
      	fmt.Println(x)
      	fmt.Println(len(x))
      	fmt.Println(cap(x))
      	
      	x = append(x, 3423)
      
      	fmt.Println(x)
      	fmt.Println(len(x))
      	fmt.Println(cap(x))
      }
      

       

    • 當capacity滿了之後,會把現有的underlying array 複製到一個 double size的array中
  • multi-dimensional Slice
    • ​多維的Slice
    • 範例code:
    • func main() {
      	jb := []string{"James", "Bond", "Chocolate", "martini"}
      	fmt.Println(jb)
      	mp := []string{"Miss", "Moneypenny", "strawberry", "Hazelnut"}
      	fmt.Println(mp)
      	
      	xp := [][]string{jb, mp}
      	fmt.Println(xp)
      }
      
    • print out result:
      [James Bond Chocolate martini]
      [Miss Moneypenny strawberry Hazelnut]
      [[James Bond Chocolate martini] [Miss Moneypenny strawberry Hazelnut]]
      
      
  • 刪除 Slice - deleting a slice
    • 利用 slice 和 append 去刪除 slice
    • func main() {
      	x := []int{4, 5, 7, 8, 42}
      	fmt.Println(x)
      	x = append(x, 77, 88, 99, 1014)
      	fmt.Println(x)
      
      	y := []int{234, 456, 678, 987}
      	x = append(x, y...)
      	fmt.Println(x)
      
      	x = append(x[:2], x[4:]...)
      	fmt.Println(x)
      
      }

       

  • Sline坑:s:= make([]int, 0, 0) x := append(s, 1) y := append(s, 20)  x,y 都會是[20]
  • End