您跳过了JSON解码步骤。
您将以字符串形式从postgres获取jsonb字段。然后,您必须将
json.Unmarshal其放入
&p.Children:
func selectChildrenAndJob(db *sql.DB) { p := &Person{} var children string err := db.QueryRow("SELECT children, job FROM mytable LIMIT 1").Scan(&children, &p.Job) switch { case err == sql.ErrNoRows: fmt.Println("No rows.") case err != nil: fmt.Println("cannot retrieve child + job rows", err) default: err = json.Unmarshal([]byte(children), &p.Children) if err != nil { fmt.Printf("Failed to unmarshal children: %sn", err) return } childlist := make([]Child, 0) for _, c := range p.Children { childlist = append(childlist, *c) } fmt.Printf("children %v; job %vn", childlist, p.Job) }}如果其他字段不是字符串类型,您也会在其他字段上注意到这一点。
您可以认为它与您插入数据时所采取的步骤相反:
c, e := json.Marshal(person.Children)... "VALUES ($1,$2,$3)", person.Name, string(c), // ...
childlist和最后的相应循环只是为了满足您的打印格式并打印值而不是指针。如果您不介意打印指针,另一种选择是跳过该指针
fmt.Printf("Person with children and job: %vn", p)


