本次实验是对数组切片的,目的就是为了加深理解,一起来看看吧。
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)
}
那么以上就是本次的内容了,在学习的过程中,可以多去敲敲代码,熟悉一下。也可以去菜鸟教程上面多看看,对新人挺友好的,也是我的公司同事推荐的教程网站。
后续也会不定期更新学习记录和一些学习实验。