Golang中"foo ...int"和"foo []int"的区别

Golang中"foo …int"和"foo []int"的区别 大家好,

我想了解以下两段代码之间的区别:

func main() {
	s := []int{1, 2, 3, 4, 5, 6, 7, 8}
	t := sumall(s)
	fmt.Println(t)
}
func sumall(x []int) int { 
	n := 0
	for _, v := range x {
		n += v
	}
	return n
}

和这段:

func main() {
	s := []int{1, 2, 3, 4, 5, 6, 7, 8}
	t := sumall( s...)
	fmt.Println(t)
}

func sumall(x ...int) int {
	n := 0
	for _, v := range x {
		n += v
	}
	return n
}

在第一段代码中,我将切片传递给函数“sumall”,而在第二段中,我传递的是“s…”,并且在函数中是“x …int”。 两者返回相同的结果,那么使用其中一种或另一种会有很大区别吗?

提前感谢


更多关于Golang中"foo ...int"和"foo []int"的区别的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

区别在于调用函数的方式。 第一个函数接受一个整数切片作为输入,而第二个函数接受可变数量的整数值。

例如,你可以这样调用第二个函数:

sumall(1, 2, 3, 4)

更多关于Golang中"foo ...int"和"foo []int"的区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果您没有预分配的切片,而是只想调用一个函数,这种区别就尤为重要……想象一下,如果没有可变参数,使用 fmt.Printf 会是多么笨拙……

fmt.Printf("%v %v", "foo", "bar")

# 对比

fmt.Printf("%v %v", []interface{}{"foo", "bar"})

在Go语言中,...int作为参数类型表示可变参数(variadic parameter),而[]int表示切片参数。两者在底层实现上相似,但在使用上有重要区别。

核心区别

  1. 可变参数 (...int)

    • 可以接受零个或多个int参数
    • 调用时可以直接传递多个值或使用切片展开语法
    • 函数内部接收到的始终是切片
  2. 切片参数 ([]int)

    • 必须传递一个切片
    • 不能直接传递多个值

示例代码对比

// 可变参数版本
func sumVariadic(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

// 切片参数版本  
func sumSlice(nums []int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {
    // 可变参数函数的多种调用方式
    fmt.Println(sumVariadic())           // 0 - 可以接受零个参数
    fmt.Println(sumVariadic(1, 2, 3))    // 6 - 直接传递多个值
    fmt.Println(sumVariadic([]int{4, 5, 6}...)) // 15 - 切片展开
    
    // 切片参数函数的调用方式
    // fmt.Println(sumSlice())          // 编译错误:需要切片参数
    // fmt.Println(sumSlice(1, 2, 3))   // 编译错误:不能直接传递多个值
    fmt.Println(sumSlice([]int{7, 8, 9})) // 24 - 必须传递切片
    
    s := []int{10, 11, 12}
    fmt.Println(sumVariadic(s...))       // 33 - 切片展开
    fmt.Println(sumSlice(s))             // 33 - 直接传递切片
}

性能考虑

两者在性能上没有显著差异,因为可变参数在函数内部也是作为切片处理的。编译器会将可变参数转换为切片:

// 可变参数函数
func sumVariadic(nums ...int) int
// 编译器处理后的等效形式
func sumVariadic(nums []int) int

使用场景建议

  • 使用...int当:

    • 函数需要接受零个或多个参数
    • 希望调用方可以直接传递值而不必创建切片
    • 设计通用工具函数时
  • 使用[]int当:

    • 明确要求必须传递切片
    • 函数语义上需要集合类型参数
    • 与其他切片处理函数保持一致性

在你的例子中,两种方式都能工作,但可变参数版本提供了更灵活的调用方式。

回到顶部