上例程序太简单了,只用到了整数型和字符串,所以我们将写一个稍微复杂一点的。首先添加一个slice(切片类型)的指针到 main 函数,并保存生成的 pair,我们后面将用到它。
var pairs []*pair
for i := 0; i < 10; i++ {
p := handleNumber(i)
fmt.Printf("%+v\n", p)
pairs = append(pairs, p)
fmt.Println("looping")
}
现在我们来检查生成出来的 slice 或 pairs,首先���们用转换成数组来看一下这个 slice。因为 handleNumber 返回的是一个 *pair 类型,我们需要引用这个指针来访问 struct(结构)的属性。
(gdb) b main.go:18
Breakpoint 1 at 0x400e14: file /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go, line 18.
(gdb) run
Starting program: /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/gdb_sandbox &{x:0 y:0}
Breakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:18
18 fmt.Println("looping")
(gdb) p pairs
$1 = []*main.pair = {0xc82000a3a0}
(gdb) p pairs[0]
Structure has no component named operator[].
(gdb) p pairs.array
$2 = (struct main.pair **) 0xc820030028
(gdb) p pairs.array[0]
$3 = (struct main.pair *) 0xc82000a3a0
(gdb) p *pairs.array[0]
$4 = {x = 0, y = 0}
(gdb) p (*pairs.array[0]).x
$5 = 0
(gdb) p (*pairs.array[0]).y
$6 = 0
(gdb) continue
Continuing.
looping
&{x:1 y:1}
Breakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:18
18 fmt.Println("looping")
(gdb) p (pairs.array[1][5]).y
$7 = 1
(gdb) continue
Continuing.
looping
&{x:2 y:6}
Breakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:18
18 fmt.Println("looping")
(gdb) p (pairs.array[2][6]).y
$8 = 6
(gdb)
你会发现这里 gdb 并不确定 pairs 是一个 slice 类型,我们不能直接访问它的属性,为了访问它的成员我们需要使用 pairs.array 来转换成数组,然后我们就可以检查 slice 的 length(长度)和 capacity(容量):
(gdb) p $len(pairs)
$12 = 3
(gdb) p $cap(pairs)
$13 = 4
这时我们可以让它循环几次,并透过这个 slice 不用的成员方法监听增加的 x 和 y 的值,要注意的是,这里的 struct 属性可以通过指针访问,所以 p pairs.array[2].y 一样可行。
Goroutines现在我们已经可以访问 struct 和 slice 了,下面再来更加复杂一点的程序吧。让我们添加一些goroutines 到 mian 函数,并行处理每一个数字,返回的结果存入信道(chan)中:
pairs := []*pair{}
pairChan := make(chan *pair)
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(val int) {
p := handleNumber(val)
fmt.Printf("%+v\n", p)
pairChan <- p
wg.Done()
}(i)
}
go func() {
for p := range pairChan {
pairs = append(pairs, p)
}
}()
wg.Wait()
close(pairChan)