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


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

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

    在这里插入图片描述

    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])
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    答:运行报错,因为我们试图访问切片 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])
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    func main() {
    
    	mySlice := []int{1, 2, 3, 4, 5}
    	myOtherSlice := []int{6, 7, 8, 9}
    
    	mySlice = append(mySlice, myOtherSlice...)
    
    	fmt.Println(mySlice)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    解释一下这三个点:…操作符被用于切片参数的函数调用,它可以将一个切片的元素作为变参传递给函数。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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    答案是:false、true、false

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

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

    func main() {
    	student := []string{}
    	students := [][]string{}
    	student[0] = "Todd"
    	fmt.Println(student)
    	fmt.Println(students)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    答:这段代码创建了一个空切片 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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    来看看一个正确的实例:

    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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

  • 相关阅读:
    用scikit-learn学习谱聚类
    【数据结构】堆的创建
    无人机的发展
    笔试强训Day(一)
    SCI论文高效写作:Citespace、vosviewer和R语言在文献调研与论文撰写中的应用
    C++极速掌握,只需这一篇就够了
    Seata概述基础
    Day1 ARM基础
    nmap各种扫描的注意事项
    洛谷P3369 【模板】普通平衡树 红黑树实现
  • 原文地址:https://blog.csdn.net/qq_44386537/article/details/133876535