Golang可变参数(Variadic Parameters)使用示例 - https://play.golang.org/p/l6pbuFDz_eP

Golang可变参数(Variadic Parameters)使用示例 - https://play.golang.org/p/l6pbuFDz_eP https://play.golang.org/p/l6pbuFDz_eP

我不太确定该如何提问,但我会尝试一下。

上述代码输出: [2 3 4 5 6 7 8 9] []int 索引位置0处的元素,现在将2加到总和,当前总和为2 索引位置1处的元素,现在将3加到总和,当前总和为5 索引位置2处的元素,现在将4加到总和,当前总和为9 索引位置3处的元素,现在将5加到总和,当前总和为14 索引位置4处的元素,现在将6加到总和,当前总和为20 索引位置5处的元素,现在将7加到总和,当前总和为27 索引位置6处的元素,现在将8加到总和,当前总和为35 索引位置7处的元素,现在将9加到总和,当前总和为44 总和为44 总和为44

我的第一个问题是:fmt.Println("The total is", x) 执行的是哪部分代码?

另外,fmt.Println("The total is", sum)return sum 执行的是哪部分代码?


更多关于Golang可变参数(Variadic Parameters)使用示例 - https://play.golang.org/p/l6pbuFDz_eP的实战教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

因为第一个是参数的类型,第二个是返回值的类型。

更多关于Golang可变参数(Variadic Parameters)使用示例 - https://play.golang.org/p/l6pbuFDz_eP的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


"调用者"指的是谁或什么

现在我开始明白了,因为之前我没有注意到这部分

sum += v

更多:上述结果中哪部分来自

fmt.Println("The total is", sum)
return sum

在此上下文中,它指的是代码中调用该函数的位置。

func sum(x …int) int {

为什么需要写两次"int"?

为什么 x := sum(2, 3, 4, 5, 6, 7, 8, 9) 会创建一个字符串切片?

更多内容:上述结果中哪部分来自

fmt.Println("The total is", sum)
return sum

这部分不用在意。我已经明白了。

以下是同一主题的更多代码: https://play.golang.org/p/OwhQgVOTg7J

我有几个问题。

  1. 代码的哪一部分产生了:"[]int"
  2. 这部分代码是否必要?如果必要,为什么?“return sum”
  1. fmt.Printf("%T\n", x) 此处打印变量 x 的类型
  2. 返回总和意味着希望调用方接收函数调用的结果
func main() {
    fmt.Println("hello world")
}

这确实很有帮助,而且你理解得很对。我觉得我需要反复研读这个内容。这是个非常有趣的表述。

否则,传递的值是一个类型为 []T 的新切片,其底层是一个新的数组,该数组的连续元素是实际的参数,这些参数都必须能够赋值T

以下是更多代码:

https://play.golang.org/p/doo199ZzYtT

我不理解

xi := []int{2, 3, 4, 5, 6, 7, 8, 9}

这段代码的作用。它似乎与之前代码中的

x := sum(2, 3, 4, 5, 6, 7, 8, 9)

没有产生不同的结果。

xi := []int{2, 3, 4, 5, 6, 7, 8, 9}

这声明并初始化了一个int类型的切片,然后将其赋值给变量xi。 这等同于

var xi []int
xi = []int{2, 3, 4, 5, 6, 7, 8, 9}

第一行可以理解为:“变量xi是一个int类型的切片”(将[]读作"切片")。第二行只是切片的初始化方式。

在你的代码第9行,你将切片传递给函数的方式是:

x := sum(xi...)

因为sum()是一个可变参数函数,切片被传递给sum()的方式与以下代码相同:

sum(2, 3, 4, 5, 6, 7, 8, 9)

在每种情况下,底层机制都是sum()接收一个切片。只是在代码中看起来不同。

不知道这是否有帮助,但这在规范中有说明:

https://golang.org/ref/spec#Passing_arguments_to_…_parameters

在您提供的代码中,fmt.Println("The total is", x) 是在 main 函数中执行的,其中 x 是调用 sum 函数后返回的结果。具体来说,x := sum(2, 3, 4, 5, 6, 7, 8, 9) 这一行调用了 sum 函数,该函数计算并返回可变参数的总和,然后 x 存储这个返回值,并通过 fmt.Println 打印出来。

fmt.Println("The total is", sum)return sum 是在 sum 函数内部执行的。sum 函数接收一个可变参数 nums(类型为 ...int),遍历每个元素并累加到局部变量 sum 中。在循环结束后,fmt.Println("The total is", sum) 打印出函数内部计算的总和,然后 return sum 将这个总和返回给调用者(即 main 函数)。

以下是代码的简要解释和示例,基于您提供的输出:

package main

import "fmt"

// sum 函数接收可变参数 nums,计算总和并返回
func sum(nums ...int) int {
    total := 0
    for i, num := range nums {
        total += num
        fmt.Printf("索引位置%d处的元素,现在将%d加到总和,当前总和为%d\n", i, num, total)
    }
    fmt.Println("总和为", total) // 这是在 sum 函数内部打印的
    return total
}

func main() {
    x := sum(2, 3, 4, 5, 6, 7, 8, 9) // 调用 sum 函数,x 接收返回值
    fmt.Println("总和为", x) // 这是在 main 函数中打印的,使用 x
}

输出与您描述的一致:

索引位置0处的元素,现在将2加到总和,当前总和为2
索引位置1处的元素,现在将3加到总和,当前总和为5
索引位置2处的元素,现在将4加到总和,当前总和为9
索引位置3处的元素,现在将5加到总和,当前总和为14
索引位置4处的元素,现在将6加到总和,当前总和为20
索引位置5处的元素,现在将7加到总和,当前总和为27
索引位置6处的元素,现在将8加到总和,当前总和为35
索引位置7处的元素,现在将9加到总和,当前总和为44
总和为44
总和为44

第一个 “总和为44” 来自 sum 函数内部的 fmt.Println,第二个来自 main 函数中的 fmt.Println("总和为", x)。这解释了为什么总和被打印了两次。

回到顶部