golang 切片学习

  1. package main
    
    //这里只说些自己理解的,当然切片的操作远远不止这些。
    import (
    	"fmt"
    	"reflect"
    )
    
    /**
     *
     * 学习切片首先要明白len和cap的区别。len()是存储数据多少,cap()是容量大小。举个例子一个大会堂可以容纳1000人这是cap,但是实际里面只座了100人这是len
     */
    
    func main() {
    
    	//这里就存在一个比较有意思的事情看 var iStrings [8]string= [8]string{1: "GO", 2: "Python", 4: "Jave", "C", "C++", "PHP"} 这里的cap和len各是多少
    	//代码可以看到都是8, 那么为什么呢?实际我们iStrings 中指存了6个值
    	var iStrings [8]string = [8]string{1: "GO", 2: "Python", 4: "Jave", "C", "C++", "PHP"}
    	fmt.Printf("iStrings len() = %d, cap() = %d\n", len(iStrings), cap(iStrings))
    
    	var vStrings = [8]string{7: "PHP"}
    	fmt.Printf("iStrings len() = %d, cap() = %d\n", len(vStrings), cap(vStrings))
    	//通过上面我们可以看出,len()实际计算的是数组中最后一个元素所在,不管之前的元素是不是为0,都是len()计算的长度
    
    	array1 := []string{"GO", "Python", "Jave", "C", "C++", "PHP"}
    	array1[2] = "Clojure"
    
    	//切片 遵从左闭右开规则[:3] (0, 1, 2)
    	slice := array1[:3]
    	fmt.Println(slice, array1)
    
    	//这里可以看到生成切片的类型
    	fmt.Println("type:", reflect.TypeOf(slice))
    
    	slice[2] = "Hello"
    	fmt.Println(slice, array1)
    
    	//不需要扩容
    	slice = append(slice, "Html", "Scala", "Lua")
    	//需要扩容, 这是切片就是一个新的数组
    	//slice = append(slice, "Html", "Scala", "Lua", "CSS")
    
    	fmt.Println(slice, array1)
    
    	//对切片进行扩容并不会对原数组进行扩容
    	fmt.Printf("len %d\n", len(array1))
    
    	//这时可以看到扩容之后的切片就是一个新的数组不在和原数组有关系
    	slice[2] = "Welcome"
    	fmt.Println(slice, array1)
    
    	var array2 [10]int = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} //[2:6) 左闭右开
    
    	slice1 := array2[2:6]
    	fmt.Println(slice1)
    }
    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章