2022-07-16:以下go语言代码输出什么?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0

2022-07-16:以下go语言代码输出什么?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0 0 0]。

package main

import (
    "fmt"
)

func main() {
    a := make([]int, 0, 5)
    addElem(a, 5)
    fmt.Println(a)
}

func addElem(a []int, i int) {
    a = append(a, 5)
}

答案选A。可以简单的理解切片本身是结构体,参数传递只是结构体复制传递。切片在大多数情况下,只能修改元素,不能删除或者新增元素。

在这里插入图片描述

本作品采用《CC 协议》,转载必须注明作者和本文链接
微信公众号:福大大架构师每日一题。最新面试题,涉及golang,rust,mysql,redis,云原生,算法,分布式,网络,操作系统。
讨论数量: 2

对slice的修改只会改底层的数据,不会修改长度和容量,append后a底层的数据已经添加了5这个元素,只是因为a的长度是0没有显示出来,所以输出[]。

1年前 评论

Go的slice底层其实是结构体:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

addElem()中将 slice 作为参数传递时依然是值传递,因此传入的是该 slice 的拷贝,故addElem中是一个新的 slice

import (
    "fmt"
)

func main() {
    a := make([]int, 0, 5)
    addElem(a, 5)
    fmt.Println(a) // []
}

func addElem(a []int, i int) {
    a = append(a, 5)
    fmt.Println("addElem",a) // [5]
}

所以原来的 a 实际是没执行任何操作,因此打印 a的结果为 [],而 addElem()中 因为是值拷贝,所以在 append()后打印结果为 [5]

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
464
粉丝
21
喜欢
37
收藏
22
排名:461
访问:1.9 万
私信
所有博文
社区赞助商