数组的长度不可改变,切片长度是可变的, 相当于可变数组
package main
import (
"log"
"sort"
)
func main() {
// 声明一个数组, 数组需要指定长度
var arr = [10]string{}
// 声明一个切片, 不需要指定长度
var slice = []string{}
log.Println(arr) // [ ]
log.Println(slice) // []
// 使用make方法创建切片, 初始大小为0, 最大大小为10, 设定一个足够大的最大值, 会使得切片获得更高的性能
var a = make([]string, 0, 10)
// 给切片a添加一个对象
a = append(a, "dog")
// 给切片添加多个对象
a = append(a, "cat", "fish", "bird", "menkey")
// 合并两个切片, {}...是解构数组
a = append(a, []string{"dog2", "cat2", "fish2", "bird2", "menkey2"}...)
// 查看切片长度
log.Println(len(a))
// 查看切片的最大长度
log.Println(cap(a))
// 截取切片
a = a[1:6] // 保留a[1], a[2], [3], a[4], a[5]
// 切片删除 a[2], a...是解构数组
a = append(a[:2], a[2+1:]...)
// 切片插入元素 a[2] = "newA2"
var temp = append(a[:2], "newA2")
a = append(temp, a[2+1:]...)
// 切片升序排序
a = append(a, "apple")
sort.Strings(a)
log.Println(a) //[apple cat dog2 fish newA2]
// 切片降序排序
sort.Sort(sort.Reverse(sort.StringSlice(a)))
log.Println(a) //[apple cat dog2 fish newA2]
// 切片的拷贝
tempCopy := make([]string, len(a))
copy(tempCopy, a)
// 切片的遍历
for i, v := range a {
log.Println(i, v)
}
// 切片的去重
a1 := []string{"dog", "cat", "dog", "dog", "fish", "fish"}
a2 := []string{}
for _, v1 := range a1 {
canAdd := true
for _, v2 := range a2 {
if v1 == v2 {
canAdd = false
}
}
if canAdd {
a2 = append(a2, v1)
}
}
log.Println("去重:", a2) //去重: [dog cat fish]
// 切片交集
b_one := []string{"dog", "cat", "dog", "dog", "fish", "fish"}
b_two := []string{"monkey", "fish", "dog"}
b2 := []string{}
for _, v1 := range b_one {
canAdd := false
for _, v2 := range b_two {
if v1 == v2 {
canAdd = true
}
}
if canAdd {
b2 = append(b2, v1)
}
}
log.Println("交集:", b2) //交集: [dog cat fish]
// 切片指针
// 切如果动态修改了大小, go会创建一个新的切片, 地址就变化了, 如果要获得一直获得内存地址, 可以使用切片指针
var b []string
var p = &b
*p = append(*p, "dog")
log.Println(*p)
*p = append(*p, "cat")
log.Println(*p)
}
参考资料:
http://go-tour-zh.appspot.com/
http://www.jb51.net/article/127812.htm
网友评论