📜  如何将切片传递给 Golang 中的函数?

📅  最后修改于: 2021-10-24 13:11:48             🧑  作者: Mango

Slice 是一个可变长度的序列,它存储相似类型的元素,不允许在同一个切片中存储不同类型的元素。它就像一个具有索引值和长度的数组,但是切片的大小是调整大小的,它们不像数组那样是固定大小的。在 Go 语言中,您可以将切片传递给函数,这意味着函数获取切片的副本。
切片与切片容量、长度一起按值传递给函数,切片的指针始终指向底层数组。因此,如果我们对按值传递给函数的切片进行了一些更改,则会反映在函数外部的切片中。让我们借助一个例子来讨论这个概念:

示例 1:

// Go program to illustrate how to
// pass a slice to the function
package main
  
import "fmt"
  
// Function in which slice
// is passed by value
func myfun(element []string) {
  
    // Modifying the given slice
    element[2] = "Java"
    fmt.Println("Modified slice: ", element)
}
  
// Main function
func main() {
  
    // Creating slice
    slc := []string{"C#", "Python", "C", "Perl"}
      
    fmt.Println("Initial slice: ", slc)
  
    // Passing the slice to the function
    myfun(slc)
      
    fmt.Println("Final slice:", slc)
  
}

输出:

Initial slice:  [C# Python C Perl]
Modified slice:  [C# Python Java Perl]
Final slice: [C# Python Java Perl]

说明:在上面的例子中,我们有一个名为slc的切片。该切片在myfun()函数传递。正如我们所知,切片指针始终指向相同的引用,即使它们传入了一个函数。因此,当我们将值 C 更改为出现在索引值 2 处的Java时。此更改也反映了存在于函数外部的切片,因此修改后的最终切片是[C# Python Java perl]

示例 2:

// Go program to illustrate how to
// pass a slice to the function
package main
  
import "fmt"
  
// Function in which slice
// is passed by value
func myfun(element []string) {
  
    // Here we only modify the slice
    // Using append function
    // Here, this function only modifies
    // the copy of the slice present in 
    // the function not the original slice
    element = append(element, "Java")
    fmt.Println("Modified slice: ", element)
}
  
// Main function
func main() {
  
    // Creating a slice
    slc := []string{"C#", "Python", "C", "Perl"}
      
    fmt.Println("Initial slice: ", slc)
  
    // Passing the slice
    // to the function
      
    myfun(slc)
    fmt.Println("Final slice: ", slc)
  
}

输出:

Initial slice:  [C# Python C Perl]
Modified slice:  [C# Python C Perl Java]
Final slice:  [C# Python C Perl]