当前位置: 首页 > 面试题库 >

Golang将数组传递给函数并对其进行修改

葛阳
2023-03-14
问题内容

在大多数语言(如c ++)中,传递数组会导致通过引用隐式传递它,因此对函数中传递的数组进行的任何更改都将导致更改原始数组。我正在学习Golang,在Alan
AA Donovan和Brian W. Kernighan撰写的《 Go编程语言》一书中,它的行为不同于其他语言-不会隐式地通过引用传递数组。

这让我有些困惑-这是否意味着在没有引用的情况下传递数组不应该修改数组本身?让我说明一下:

func main() {
    tab := []int{1, 2, 3}
    fmt.Println(tab)
    // Results in [1 2 3]
    reverse(tab)
    fmt.Println(tab)
    // Results in [3 2 1]
}

func reverse(tab []int) {
    for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 {
        tab[i], tab[j] = tab[j], tab[i]
    }
}

在上面的代码中,数组不是由引用传递的,但是反向函数会修改原始数组,因此它的工作方式有点像C ++程序那样。谁能解释我的区别?

PS:很抱歉,如果这是一个假的问题,我对Golang完全陌生,并且试图很好地理解基本知识。


问题答案:

解释很简单: 在上面的代码中 没有
声明或明确使用单个数组
。您的tab局部变量和tab参数是
slices

在Go语言中,数组的长度是该类型的一部分,例如[3]int(在一定程度上是正确的,[2]int并且[3]int是2种不同/不同的数组类型)。如果长度不存在([2]int在复合文字中
像显式一样或隐式一样[...]int{1, 2, 3}),则该长度不是数组类型,而是切片类型。

是的,当您阅读时,数组值表示其所有元素,并且在传递(或分配)时会复制其所有元素。切片不过是小的描述符,标头,描述了数组的连续部分。当切片被传递(或分配)时,仅复制此标头(包括指针),该标头指向相同的基础数组。因此,如果您修改切片副本的元素,则更改将反映在原始切片中,因为只有一个支持该元素的后备阵列。

如果您想确切地了解切片头中的内容,则可以检查reflect.SliceHeader类型:它struct包含指向切片第一个元素的指针,切片的长度和容量。

请阅读以下博客文章,其中详细说明了这一点:

切成薄片:用法和内部html" target="_blank">原理

数组,切片(和字符串):“追加”的机制



 类似资料:
  • 要将数组参数传递给函数,需指定不带方括号的数组名。例如,如果数组hourlyTemperatures声明如下: int hourlyTemperatures[24]; 则下列函数调用语句: modifyArray(hourlyTemperatutes,24); 将数组 hourlyTemperatures 及其长度传递给函数 modifyArray。将数组传递给函数时,通常也将其长度传递给函数,使

  • 我创建了一个Author对象,用于构造函数的方法签名:public Book但是,我所做的赋值要求将Author(实例变量)更改为。当然,现在我以前的构造函数不行了。这是密码 如果我上传的方式不令人满意,我对任何不便表示歉意。我还没有学会使用堆栈溢出。 谢谢!

  • 问题内容: 哦,我的话我是个傻瓜。 调用函数时,我只是省略了第二个和第三个参数。像个傻瓜。因为那就是我。原来愚蠢的问题如下: 这似乎是它必须做一个很平常的事,但是我无法找到相关的教程,我太无知了约,并弄明白自己。 我的文件中有一个C函数。 (您可能会猜到,我最初的参数为double 而不是void ,但无法弄清楚在Python方面该怎么做。我当然很想将其改回来,但我并不挑剔只要有效。) 我用它制作

  • C++ 数组 C++ 中您可以通过指定不带索引的数组名来传递一个指向数组的指针。 C++ 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。 如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。 方式 1 形式参数是一个指针:

  • 问题内容: 我有一个用express编写的node.js服务器,并在某个时刻将一个数组发送到某个.jade页面。问题在于,渲染Jade页面时,Jade编译器将数组呈现为,而Chrome上的JavaScript编译器则抱怨说“意外标识符”。 这是Jade代码: 如您所见,这确实很简单,我只是将由node.js传递给Jade 的变量内所给的信息填充到div中。第二行的警报不会触发,因为一旦我尝试分配变

  • 我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说是一个问题。在下面的此示例代码中,我想通过使用函数“changeNum”来修改变量“num”的值。但是,当然,科特林不允许我修改它。我该如何解决这个问题?如何使用“更改数字”函数来修改变量“num”?