Golang学习:基础篇练习(二)—— 数组切片小实验

Golang学习:基础篇练习(二)—— 数组切片小实验

本次实验是对数组切片的,目的就是为了加深理解,一起来看看吧。

Golang学习:基础篇练习(二)—— 数组切片小实验_第1张图片

1、下面这段代码有问题吗?为什么

func main() {

	greeting := make([]string, 3, 5)
	// 3 is length - number of elements referred to by the slice
	// 5 is capacity - number of elements in the underlying array

	greeting[0] = "Good morning!"
	greeting[1] = "Bonjour!"
	greeting[2] = "buenos dias!"
	greeting[3] = "suprabadham"

	fmt.Println(greeting[2])
}

答:运行报错,因为我们试图访问切片 greeting 的第4个元素(索引为3),但是该切片的长度只有3。尽管 greeting 的容量为5,但是在创建切片时,只初始化了3个元素。但是我们可以通过 append 函数来添加更多的元素。以下是修改后的代码:

func main() {

	greeting := make([]string, 3, 5)
	// 3 is length - number of elements referred to by the slice
	// 5 is capacity - number of elements in the underlying array

	greeting[0] = "Good morning!"
	greeting[1] = "Bonjour!"
	greeting[2] = "buenos dias!"
	greeting = append(greeting, "suprabadham")

	fmt.Println(greeting[2])
}

2、将一个切片数组的值添加到另一个切片数组中

func main() {

	mySlice := []int{1, 2, 3, 4, 5}
	myOtherSlice := []int{6, 7, 8, 9}

	mySlice = append(mySlice, myOtherSlice...)

	fmt.Println(mySlice)
}

解释一下这三个点:…操作符被用于切片参数的函数调用,它可以将一个切片的元素作为变参传递给函数。append函数接受两个或更多的参数,第一个参数是一个切片,后面的参数是将要添加到切片的元素。当想要将一个切片的所有元素添加到另一个切片时,就需要使用…操作符。

…操作符将myOtherSlice切片展开,然后将其元素作为变参添加到mySlice切片中。如果没有…操作符,代码会报错,因为append函数期望的是一系列的单个元素,而不是一个切片。

3、判断一下下面两个用例中fmt.Println(student == nil)的输出结果

// one
func main() {
	student := []string{}
	students := [][]string{}
	fmt.Println(student)
	fmt.Println(students)
	fmt.Println(student == nil)
}

// two
func main() {
	var student []string
	var students [][]string
	fmt.Println(student)
	fmt.Println(students)
	fmt.Println(student == nil)
}

// three
func main() {
	student := make([]string, 35)
	students := make([][]string, 35)
	fmt.Println(student)
	fmt.Println(students)
	fmt.Println(student == nil)
}

答案是:false、true、false

为什么呢 ?在代码示例中,使用了一个空的切片字面量来初始化student。虽然这个切片没有包含任何元素,但它已经被分配了内存(第三个例子同理)。因此,它不是nil。而第二个声明了一个切片student,但没有给它分配内存,所以它的值是nil

4、下面这段代码能正常运行吗?

func main() {
	student := []string{}
	students := [][]string{}
	student[0] = "Todd"
	fmt.Println(student)
	fmt.Println(students)
}

答:这段代码创建了一个空切片 student。这个切片的长度和容量都是0。尽管切片背后的数组可能会随着元素的添加而增长,但是在添加元素之前,不能访问任何元素。因此,当试图访问 student[0] 时,Go语言会抛出一个运行时错误,因为这个元素并不存在。

所以,我们不能直接访问或修改它的元素,即使试图访问的是第一个元素。如果你想要向空切片中添加元素,应该使用append函数。例如,可以将student[0] = "Todd"这一行修改为student = append(student, “Todd”)

同理,下面这种写法也会报错

func main() {
	var student []string
	var students [][]string
	student[0] = "Todd"
	// student = append(student, "Todd")
	fmt.Println(student)
	fmt.Println(students)
}

来看看一个正确的实例:

func main() {
	//student := make([]string, 35)这一行创建了一个长度为35的字符串切片,所有元素都被初始化为字符串的零值(即空字符串)。
	//所以,当写student[0] = "Todd"时,是在修改切片的第一个元素,这是完全合法的。
	//同样,students := make([][]string, 35)这一行创建了一个长度为35的切片,每个元素都是一个字符串切片。所有元素都被初始化为切片的零值(即nil切片)。
	//所以,代码不会报错,因为没有访问或修改超出切片长度范围的元素
	student := make([]string, 35)
	students := make([][]string, 35)
	// the result is different
	student[0] = "Todd"
	// student = append(student, "Todd")
	fmt.Println(student)
	fmt.Println(students)
}

那么以上就是本次的内容了,在学习的过程中,可以多去敲敲代码,熟悉一下。也可以去菜鸟教程上面多看看,对新人挺友好的,也是我的公司同事推荐的教程网站。

后续也会不定期更新学习记录和一些学习实验。

你可能感兴趣的:(golang,go,golang,学习,开发语言)