Go语言入门(12)-更大的切片

发布于:2025-08-30 ⋅ 阅读:(16) ⋅ 点赞:(0)

数组在定义时就已经确定了大小,之后不可变,所以通过append函数添加的内容被存到了其他地方。

package main

import (
	"fmt"
)

func dump(label string, slice []string) {
	fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice),
		cap(slice), slice) //cap(xx):读取xx的容量
}

func main() {
    dwarfs := []string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}

    dump("dwarfs", dwarfs)
    dump("dwarfs[1:2]", dwarfs[1:2])
}

三个索引的切分操作:

该操作可以限制新建切片容量,例程如下

package main

import (
	"fmt"
)

func dump(label string, slice []string) {
	fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice),
		cap(slice), slice) //cap(xx):读取xx的容量
}

func main() {
    planets := []string{
    "Mercury","Venus","Earth","Mars",
    "Jupiter","Saturn","Uranus","Neptune"
    }
    
    terrestrial := planets[0:4:4]
    worlds := append(terrestrial,"Ceres")

    dump("planets",planets)
    dump("worlds",worlds)
        
}

使用make函数对slice进行预分配

当slice的容量不足以执行append操作时,Go必须创建新数组并复制旧数组中的内容。但通过内置的make函数,可以对slice进行预分配策略(尽量避免额外的内存分配和数组复制操作)

下面再看一个简单的案例:

package main

import (
	"fmt"
)

func dump(label string, slice []string) {
	fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice),
		cap(slice), slice) //cap(xx):读取xx的容量
}

func main() {
    //make():内置函数,可以对slice进行预分配策略。
	dwarfs := make([]string, 0, 10) //当分配的容量小于要存储的容量时,系统会自动增加分配
    dump("dwarfs",dwarfs)

    dwarfs = append(dwarfs,"Ceres","Pluto","Haumea","Makemake","Eris")
    dump("dwarfs",dwarfs)
        
}

注意,若想声明Printf、apeend这样的可变参数函数,需要在函数的最后一个参数前面加上“...”符号。以下是一个自定义函数的示例,里面的“worlds”变量就是可变参数,可以通过一系列操作改变worlds的值

package main

import (
	"fmt"
)

// 声明Printf、apeend这样的可变参数函数,需要在函数的最后一个参数前面加上...符号
func terraform(prefix string, worlds ...string) []string {
	newWorlds := make([]string, len(worlds))

	for i := range worlds {
		newWorlds[i] = prefix + " " + worlds[i]
	}
	return newWorlds
}

func main() {
    planets := []string{"Venus", "Mars", "Jupiter"}
	newPlanets := terraform("New", planets...) 

	fmt.Println(newPlanets)
}

运行结果如下:


网站公告

今日签到

点亮在社区的每一天
去签到