查询结果是内存地址

时间:2017-11-23 14:23:32

标签: go

我是新手,仍然对指针感到困惑,但我已按照指令查询多行,但我得到的结果是一系列内存地址而不是实际值。

这个相同的结构,减去rows.Next()对单个用户来说效果很好,所以我对这里问题的根源感到困惑。

最终我试图在模板中使用函数的结果,但我正在试图找出它的结构,所以我可以用我的HTML来区分它。

例如,如果我尝试运行下面的代码,我会得到类似:&{[0xc... 0xc... 0xc...]}

的内容
type User struct {
    Id   int    `json:"int"`
    Name string `json:"name"`
    Role string `json:"role"`
}

type Users struct {
    Users []*User
}

func getUsers(company string) *Users {
    users := Users{}

    rows, err := db.Query("SELECT Id, Name, Role...")
    // Check err

    defer rows.Close()

    for rows.Next() {
        user := &User{}

        err = rows.Scan(&user.Id, &user.Name, &user.Role)
        // Check err

        users.Users = append(users.Users, user)
    }

    err = rows.Err()
    // Check err

    return &users
}

这就是我试图使用函数

的方法
func userView(w http.ResponseWriter, r *http.Request) {
    res := getUsers("test") // Should return 3 results

    fmt.Println(res.Users)
}

2 个答案:

答案 0 :(得分:1)

问题不在于提取数据,而是在数据显示中。 fmt.Println()在给定指针时打印内存地址 - 因此它的行为完全符合预期。

如果您改为:

fmt.Printf("%+v", res.Users)

你会得到不同的结果,可能更接近你的期望。

如果您计划使用模板,那么您应该这样做 - 您的模板应该能够访问每个User的字段。

但简短的回答是:您的测试方法无效。

答案 1 :(得分:0)

类型@ContainsTransformerMethods public class HttpToUserTransformer { @Transformer public User stringToUser(@Payload String s, @InboundHeaders("*") Map<String, String> headers) { User user = new User(); user.setName(headers.get("name")); return user; } } 是指针的一部分。如果您打印返回值Users,它看起来像一堆内存地址。还行吧。

如果要打印更有意义的内容,请为getUsers编写String()方法,在其中取消引用每个指针并构建包含结构字段的字符串。