使用 GDB 工具调试 Go(3)

上例程序太简单了,只用到了整数型和字符串,所以我们将写一个稍微复杂一点的。首先添加一个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 不用的成员方法监听增加的 xy 的值,要注意的是,这里的 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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8a0741e1279c3f128596ebdad24eba19.html