如何获取/打印一片数组指针的内容?

时间:2019-12-05 18:42:07

标签: go go-gorm

我具有以下结构和功能:

type RayTrace struct {
    gorm.Model
    Var1   float64 `json:"var1"`
    Var2   float64 `json:"var2"`
    Var3   float64 `json:"var3"`
    UserID uint    `json:"user_id"`
}

...

// GetRaytracesFor function
func GetRaytracesFor(id uint) []*RayTrace {
    raytraces := make([]*RayTrace, 0)
    err := GetDB().Table("ray_traces").Where("user_id = ?", id).Last(&raytraces).Error
    if err != nil {
        return nil
    }
    return raytraces
}

如何获取/打印从db调用返回的数据?

谢谢!

1 个答案:

答案 0 :(得分:0)

我假设您要问的是如何打印指针切片的,而不是地址。在这种情况下,使用fmt.Println(raytraces)fmt.Printf("%v", raytraces) // or %+v or %#v将返回地址。

您可能希望看到类似的问题golang how to print struct value with pointer

基本上,您需要手动打印字段。这是一些不同的方法:

  1. 遍历切片,并通过取消引用元素来打印
func GetRaytracesFor(id uint) []*RayTrace {
    raytraces := make([]*RayTrace, 0)
    err := GetDB().Table("ray_traces").Where("user_id = ?", id).Last(&raytraces).Error
    if err != nil {
        return nil
    }

    for _, raytrace := range raytraces {
        // before dereferencing pointer, check if nil
        if raytrace == nil {
            fmt.Println("<nil>")
            continue
        }
        // notice the * before raytrace
        fmt.Printf("%+v\n", *raytrace)
    }
    return raytraces
}
  1. 使类型RayTrace实现fmt.Stringer
// implements fmt.Stringer
func (r RayTrace) String() string {
    return fmt.Sprintf("RayTrace{Var1:%v Var2:%v Var3:%v UserID:%v}", r.Var1, r.Var2, r.Var3, r.UserID)
}

func GetRaytracesFor(id uint) []*RayTrace {
    raytraces := make([]*RayTrace, 0)
    err := GetDB().Table("ray_traces").Where("user_id = ?", id).Last(&raytraces).Error
    if err != nil {
        return nil
    }

    // now we can print anywhere without need to loop each element
    fmt.Println(raytraces)

    return raytraces
}

更多阅读内容:

golang how to print struct value with pointer

https://golang.org/pkg/fmt/#Printf

https://golang.org/pkg/fmt/#Stringer