Go基础面试常问

今天总结一些基础面试常问问题

1.数组与切片

     相同点:

  • 都可以用来存储一组相同类型的元素。
  • 都可以通过索引访问和修改元素。
  • 都可以使用内置的len()函数获取长度。

不同点:

  1.数组是固定长度;切片是不固定长度可以动态增长或缩小

func main() {
	s := make([]int, 5, 8)//定义s的cap为8
	s = append(s, 4)
	s = append(s, 1)
	s = append(s, 9)
	s = append(s, 10)
	fmt.Println("cap", cap(s))//输出cap为16
}

  2.传递方式:数组作为函数参数传递的时候是值传递,会进行只拷贝;切片作为函数参数传递的时候是引用传递;修改切片的初始值会影响原始数据。

数组:

func i(a [5]int) {
	a[1] = 8
	fmt.Println("i中a=", a)//在i中尝试修改
}

func main() {
	a := [5]int{0, 1, 2, 3, 4}
	i(a)
	fmt.Println("main函数中a=", a)
}
i中a= [0 8 2 3 4]
main函数中a= [0 1 2 3 4]

切片:

func Init(num []int) {
	for i := 0; i < len(num); i++ {
		num[i] = i
	}
	num[1] = 8 //修改值
}
func main() {
	s := make([]int, 10) //创建好s但并没有初始化
	Init(s)

	fmt.Println("s=", s) //输出s= [0 8 2 3 4 5 6 7 8 9]

}

3.初始化方式:数组可以使用数组字面量或for循环,切片可以使用切片字面量,make()函数或其他切片中截取等方式进行初始化。

数组:

func main() {
	//1.
	var a1 [3]int
	a1[0] = 10
	a1[1] = 20
	a1[2] = 30
	//2.
	var a2 [3]int = [3]int{10, 20, 30}
	//3.
	a3 := [3]int{10, 20, 3}
	//4.
	a4 := [...]int{10, 20, 30}
	//5.
	a5 := [3]int{10}
	//6.
	a6 := [3]int{2: 10}
}

切片:

func main() {
	//1.
	var a []int
	//2.
	a1 := [5]int{1, 2, 3, 4, 5}
	var b []int = a[1:4] //基于数组a1创建切片包括元素a[1-3]左闭右开区间
	//3.
	c := []int{6, 7, 8} //创建一个数组并返回一个切片
	//4.
	d := make([]int, 5, 8) //5为长度8为容量
}

4.长度信息:数组长度是固定的,可以通过len()函数获取;切片的长度可以动态改变,也可以通过len()获取

总结:数组适合长度固定的场景。如果长度较大建议使用切片,值拷贝对性能开销过高;切片适合长度可变的场景,例如在网络爬虫时接收网页返回数据等;在实际开发中,切片更常用,具有更多的操作和更方便的扩展能力。

切片的遍历

1.使用for循环和索引:可以使用普通的for循环结合遍历切片

2.也可以使用for range循环切片;返回对应的索引和下标

3.使用slice[start:end]可以遍历start到end-1的元素

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值