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

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

这行代码 sum := 0 的目的是什么?

它是不是有点像是一个起始点?

14 回复

你让我笑个不停

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


我不得不重读一遍,因为它实在太令人愉悦了!

我明白了 := 的含义,但我之前不知道为什么要用 0。

初始化:第一次赋值。

因为如果你将 sum 初始化为除 0 以外的任何值,你的结果就会恰好相差那个初始化的数值。

它声明并初始化 sum 为一个值为 0int 类型。

声明:告诉编译器我们想要使用一个具有特定类型的变量。 初始化:首次为其赋值。

让我来分析你的回答。我现在对短声明操作符没有问题。我不理解的是 falsetrue 的用法。

我想我已经明白了。但出于某种原因,我的大脑需要重复才能真正理解并将其融入我的思维。提前感谢您的耐心。

正如我们已经多次告诉过您,:= 用于“声明并初始化”,而 = 用于为已声明的变量赋值。

所以,请尝试用您自己的话来描述,您对这两条语句有什么不理解的地方?

我又读了一遍。

我也理解了你提出的观点。

对我来说,与计算机交流总是更容易些

你真幸运!!!哈哈 我正经历一段困难时期。我的情感不喜欢这样。但我的理智和内心在说:“继续前进”。

因为如果你将 sum 初始化为除 0 之外的任何值,你的结果都会恰好偏差那个量。

是的。

我不确定我需要重复这项研究多少次。如果这让你感到恼火,我很抱歉。我会尽量私下进行。

出于某种未知的原因,我不记得去查看我的笔记。

有趣的是,当你使用短声明操作符时,你不需要指定类型。

它设置了值。关于这几行代码,你的问题是什么?

试着退一步看,不要只盯着那两行代码。看看这个函数的整体。单行代码很少能完成什么重要的事情,只有通过观察代码行之间如何相互作用,它才变得重要且有意义。

如果在函数执行过程中,v 至少有一次等于 num,那么函数结束时 found 的值会是什么?如果它从未等于过,其值又会是什么?

在哪些情况下会打印什么内容?

我们的大脑就是这样工作的。通过重复,事物才能进入长期记忆。

有些人比其他人需要更多的重复。

对我来说,与计算机对话总是比与人对话更容易。对大多数人来说,情况似乎正好相反。

有些人能用一棵树制作桌子或其他家具,而我却几乎无法为我儿子用一根木棍削出一支矛。

有些人能用碎肉、番茄和意大利面做出三道菜的大餐,而我却会把水烧糊,尽管如此,我的孩子们还是喜欢我做的意大利面 🙂

如果某些事情对你来说需要更长的时间,这没关系。坚持下去就好。最终你会“豁然开朗”,或者至少你能做得足够好,让你的孩子(或他们的孩子)开心。

Go Tutorial - Learn Go from the Basics with Code Examples – 8 Jun 19

Go 可变参数函数教程与示例 | golangbot.com

能够接受可变数量参数的函数称为可变参数函数。通过示例学习如何在 Go 中创建可变参数函数。

在以下示例中

package main

import (  
    "fmt"
)

func find(num int, nums ...int) {  
    fmt.Printf("type of nums is %T\n", nums)
    found := false
    for i, v := range nums {
        if v == num {
            fmt.Println(num, "found at index", i, "in", nums)
            found = true
        }
    }
    if !found {
        fmt.Println(num, "not found in ", nums)
    }
    fmt.Printf("\n")
}
func main() {  
    find(89, 89, 90, 95)
    find(45, 56, 67, 45, 90, 109)
    find(78, 38, 56, 98)
    find(87)
}

我不理解这两条语句。

found := false found = true

是的,sum := 0 的作用就是初始化一个累加器,为后续的循环累加操作提供一个起始点(零值)。

在您提供的示例代码中,sumNumbers 函数接收一个可变参数 numbers ...int。函数内部需要计算所有传入整数的总和,因此需要一个变量来保存这个不断累加的结果。sum := 0 就是声明并初始化了这个变量。

如果没有这行初始化代码,sum 变量不存在,后续的 sum += num 操作将无法进行。如果只声明而不初始化(如 var sum int),sum 的初始值默认也是 0,但 sum := 0 是更简洁的写法。

示例代码分析:

package main

import "fmt"

// 函数接收可变数量的int参数
func sumNumbers(numbers ...int) int {
    sum := 0 // 初始化累加器,总和从0开始
    for _, num := range numbers {
        sum += num // 将每个参数值累加到sum
    }
    return sum
}

func main() {
    // 调用函数,传递任意数量的参数
    total := sumNumbers(1, 2, 3, 4, 5)
    fmt.Println("总和是:", total) // 输出:总和是: 15

    // 也可以传递一个切片(使用切片展开语法...)
    nums := []int{10, 20, 30}
    total = sumNumbers(nums...)
    fmt.Println("另一个总和是:", total) // 输出:另一个总和是: 60
}

在这个例子中:

  1. sumNumbers(1, 2, 3, 4, 5) 调用时,可变参数 numbers 在函数内部表现为一个切片 []int{1, 2, 3, 4, 5}
  2. sum := 0 将变量 sum 初始化为 0
  3. 循环中 sum += num 依次执行:0+1=11+2=33+3=66+4=1010+5=15
  4. 最终返回累加结果 15

因此,sum := 0 确实是累加操作的起点,确保每次函数调用都从一个干净的状态(0)开始计算总和。

回到顶部