从规格:
元组分配将多值运算的各个元素分配给变量列表。有两种形式。第一种,右侧操作数是单个多值表达式,例如函数调用、通道或映射操作或类型断言。左侧操作数的数量必须与值的数量相匹配。例如,如果 f 是一个返回两个值的函数,
x, y = f()
则将第一个值分配给 x,将第二个值分配给 y。在第二种形式中,左边的操作数的个数必须等于右边的表达式的个数,每个表达式必须是单值的,右边的第n个表达式赋值给左边的第n个操作数:one, two, three = '一', '二', '三'
任务分两个阶段进行。首先,左边的索引表达式和指针间接(包括选择器中的隐式指针间接)和右边的表达式的操作数都按通常的顺序求值。其次,分配是按从左到右的顺序进行的。
使用此代码(i, n = i+2, n-1
内部 for 循环):
package main
import (
"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] = 2
next:
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] = 2
next:
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--
}
}
输出是正确的:
15485863
go version go1.11.5 linux/amd64
我在 Go 的元组分配中遗漏了什么吗?
提前致谢。
繁星淼淼
相关分类