为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的元组赋值

Go 中的元组赋值

Go
婷婷同学_ 2023-06-05 19:39:42
从规格:元组分配将多值运算的各个元素分配给变量列表。有两种形式。第一种,右侧操作数是单个多值表达式,例如函数调用、通道或映射操作或类型断言。左侧操作数的数量必须与值的数量相匹配。例如,如果 f 是一个返回两个值的函数,x, y = f()则将第一个值分配给 x,将第二个值分配给 y。在第二种形式中,左边的操作数的个数必须等于右边的表达式的个数,每个表达式必须是单值的,右边的第n个表达式赋值给左边的第n个操作数:one, two, three = '一', '二', '三'任务分两个阶段进行。首先,左边的索引表达式和指针间接(包括选择器中的隐式指针间接)和右边的表达式的操作数都按通常的顺序求值。其次,分配是按从左到右的顺序进行的。使用此代码(i, n = i+2, n-1内部 for 循环):package mainimport (    "fmt"    "math")func main() {    p := &Prime{}    p.Generate(1000000)    fmt.Println(p.Last()) // 15485863}func (p *Prime) Generate(n uint) {    p.Primes = make([]uint64, 1, n)    p.Primes[0] = 2next:    for i := uint64(3); n > 1; i, n = i+2, n-1 {        q := uint64(math.Sqrt(float64(i)))        for _, v := range p.Primes[1:] {            if v > q {                break            }            if i%v == 0 {                continue next            }        }        p.Primes = append(p.Primes, i)        // n--    }}type Prime struct {    Primes []uint64}func (p *Prime) Last() uint64 {    return p.Primes[len(p.Primes)-1]}输出是:1999993这不是正确的结果。这段代码:func (p *Prime) Generate(n uint) {    p.Primes = make([]uint64, 1, n)    p.Primes[0] = 2next:    for i := uint64(3); n > 1; i += 2 {        q := uint64(math.Sqrt(float64(i)))        for _, v := range p.Primes[1:] {            if v > q {                break            }            if i%v == 0 {                continue next            }        }        p.Primes = append(p.Primes, i)        n--    }}输出是正确的:15485863go version go1.11.5 linux/amd64我在 Go 的元组分配中遗漏了什么吗?提前致谢。
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

不,给出错误结果的不是元组赋值。

两个代码之间存在细微差别,这导致了错误。在 playgound 代码中,每次迭代循环时都会运行i,n = i+2,n-1make ,而 github 代码仅在是质数时运行(如果运行则跳过)。n = n-1n = n-1in--continue next


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信