1. Home
  2. Docs
  3. 带着问题来学习Golang
  4. 数据类型-array与slice
  5. 一个函数传参一个slice,先append再赋值和另一个函数先赋值再append,哪个会发生变化?

一个函数传参一个slice,先append再赋值和另一个函数先赋值再append,哪个会发生变化?

涉及知识点

  • 函数参数调用中的引用传递和值传递区别
  • Slice扩容规则
  • append函数

引用传递和值传递的区别

  • 传值:函数调用时会对参数进行拷贝,被调用方和调用方两者持有不相关的两份数据;
  • 传引用:函数调用时会传递参数的指针,被调用方和调用方两者持有相同的数据,任意一方做出的修改都会影响另一方。
  1. 如何知道参数变量是引用还是值传递呢? 打印变量地址判断如果是一致就是引用传递,否则就是值传递
  2. 如何把值传递改成引用传递呢?参数类型前加*号, 传入的变量前加&
  3. 是否可以把slice变成值传递呢?
func main() {
    a := []int{1,2,3}
    b := "hello"
    fmt.Printf("a-p: %p b-p: %p \n", a, &b)
    a1(a, &b)
}

func a1(a []int, b *string) {
    fmt.Printf("a-p: %p b-p: %p \n", a, b)
}

Slice扩容规则

append函数

练习部分

Q: 一个函数传参一个slice,先append再赋值和另一个函数先赋值再append,哪个会发生变化?

相关资料

Go 语言设计与实现-4.1 函数调用

gopl-4.2. Slice

函数的引用和值传递 by google

Go语言中的值类型和引用类型

Go语言参数传递是传值还是传引用

通过append之后得到的切片更改元素值到底对原切片有没有影响?

golang slice在其他函数中修改,易错点

Was this article helpful to you? Yes No

How can we help?