为什么这两个Go代码的行为不同? [重复]

I have 2 Redis servers (data are diveded to 2 servers) and I should run GET operation to both servers for a given key.

The 1st version of my code:

package main

import (
    "fmt"

    "github.com/garyburd/redigo/redis"
)

var pools []*redis.Pool

func main() {
    readServers := []string{
        "my-redis-server1:6379",
        "my-redis-server2:6379",
    }

    for _, s := range readServers {
        pools = append(pools, &redis.Pool{
            MaxIdle: 5,
            Dial: func() (redis.Conn, error) {
                fmt.Printf("server: %s
", s)
                c, err := redis.Dial("tcp", s)
                if err != nil {
                    panic(err.Error())
                }
                return c, err
            },
        })
    }

    for i, p := range pools {
        c := p.Get()
        defer c.Close()

        res, err := redis.String(c.Do("GET", "key"))
        fmt.Printf("pools[%d] res: %s, err: %s
", i, res, err)
    }
}

my-redis-server2 has data for key key(value: value), so expected output is:

server: my-redis-server1:6379
pools[0] res: , err: redigo: nil returned
server: my-redis-server2:6379
pools[1] res: value, err: %!s(<nil>)

But actual output was:

server: my-redis-server2:6379
pools[0] res: value, err: %!s(<nil>)
server: my-redis-server2:6379
pools[1] res: value, err: %!s(<nil>)

I'd like to know why actual output prints my-redis-server2:6379 for pools[0], not my-redis-server1:6379.

The following code is the 2nd version and this acts as expected:

package main

import (
    "fmt"

    "github.com/garyburd/redigo/redis"
)

var pools []*redis.Pool

func newPool(svr string) *redis.Pool {
    return &redis.Pool{
        MaxIdle: 5,
        Dial: func() (redis.Conn, error) {
            fmt.Printf("server: %s
", svr)
            c, err := redis.Dial("tcp", svr)
            if err != nil {
                panic(err.Error())
            }
            return c, err
        },
    }
}

func main() {
    readServers := []string{
        "my-redis-server1:6379",
        "my-redis-server2:6379",
    }

    for _, s := range readServers {
        pools = append(pools, newPool(s))
    }

    for i, p := range pools {
        c := p.Get()
        defer c.Close()

        res, err := redis.String(c.Do("GET", "key"))
        fmt.Printf("pools[%d] res: %s, err: %s
", i, res, err)
    }
}

What is the main difference between the 1st and 2nd code? I don't understand how extracting a function effects to the result.

</div>