a

Câu hỏi Làm thế nào để in các biến struct trong giao diện điều khiển?


Làm thế nào tôi có thể in (trong giao diện điều khiển) Id, Title, Name, vv của cấu trúc này ở Golang?

type Project struct {
    Id int64 `json:"project_id"`
    Title string `json:"title"`
    Name string `json:"name"`
    Data Data `json:"data"`
    Commits Commits `json:"commits"`
}

174
2017-07-01 13:57


gốc


Tất cả chúng, để gỡ lỗi? Thử fmt.Println. - Ry-♦


Các câu trả lời:


Để in tên của các trường trong cấu trúc:

fmt.Printf("%+v\n", yourProject)

Từ fmt gói:

khi in cấu trúc, cờ cộng (%+v) thêm tên trường

Điều đó cho thấy bạn có một thể hiện của dự án (trong 'yourProject')

Bài viết JSON và Go sẽ cung cấp thêm chi tiết về cách lấy các giá trị từ một cấu trúc JSON.


Điều này Đi theo trang mẫu cung cấp một kỹ thuật khác:

type Response2 struct {
  Page   int      `json:"page"`
  Fruits []string `json:"fruits"`
}

res2D := &Response2{
    Page:   1,
    Fruits: []string{"apple", "peach", "pear"}}
res2B, _ := json.Marshal(res2D)
fmt.Println(string(res2B))

Điều đó sẽ in:

{"Page":1,"Fruits":["apple","peach","pear"]}

Nếu bạn không có bất kỳ cá thể nào, thì bạn cần sử dụng sự phản chiếu để hiển thị tên của trường của một cấu trúc cụ thể, như trong ví dụ này.

type T struct {
    A int
    B string
}

t := T{23, "skidoo"}
s := reflect.ValueOf(&t).Elem()
typeOfT := s.Type()

for i := 0; i < s.NumField(); i++ {
    f := s.Field(i)
    fmt.Printf("%d: %s %s = %v\n", i,
        typeOfT.Field(i).Name, f.Type(), f.Interface())
}

312
2017-07-01 14:00



Cảm ơn câu trả lời của bạn nhưng có một điều nữa. Các tệp JSON của tôi có liên quan đến một API ... do đó tôi không muốn đặt Id hoặc Tên, tôi chỉ muốn lấy nó qua API và in nó trong bảng điều khiển. Làm thế nào tôi có thể làm điều đó? - fnr
@fnr Nếu bạn có một tài liệu JSON, bạn sẽ cần phải unmarshall nó, trước khi có thể in lĩnh vực của nó. - VonC
Cảm ơn bạn VonC! - fnr
Đã bỏ phiếu! Khiếu nại của tôi là lệnh% + v không in đẹp! Tôi vẫn hài lòng với hiệu quả của dòng này. - Shadoninja


Tôi muốn giới thiệu go-spew, mà theo github của họ "Thực hiện một máy in khá sâu cho các cấu trúc dữ liệu Go để hỗ trợ gỡ lỗi"

go get -u github.com/davecgh/go-spew/spew

ví dụ sử dụng:

package main

import (
    "github.com/davecgh/go-spew/spew"
)

type Project struct {
    Id      int64  `json:"project_id"`
    Title   string `json:"title"`
    Name    string `json:"name"`
    Data    string `json:"data"`
    Commits string `json:"commits"`
}

func main() {

    o := Project{Name: "hello", Title: "world"}
    spew.Dump(o)
}

đầu ra:

(main.Project) {
 Id: (int64) 0,
 Title: (string) (len=5) "world",
 Name: (string) (len=5) "hello",
 Data: (string) "",
 Commits: (string) ""
}

63
2017-12-27 11:33



bạn có thể thêm tính năng dereference mà go-spew có. Nó cho phép bạn in giá trị của cấu trúc trong đó một con trỏ đang tham chiếu và không phải con trỏ của nó - 0x13a


Tôi nghĩ sẽ tốt hơn nếu bạn thực hiện một dấu gạch ngang tùy chỉnh nếu bạn muốn một số loại đầu ra được định dạng của struct

ví dụ

package main

    import "fmt"

    type Project struct {
        Id int64 `json:"project_id"`
        Title string `json:"title"`
        Name string `json:"name"`
    }

    func (p Project) String() string {
        return fmt.Sprintf("{Id:%d, Title:%s, Name:%s}", p.Id, p.Title, p.Name)
    }

    func main() {
        o := Project{Id: 4, Name: "hello", Title: "world"}
        fmt.Printf("%+v\n", o)
    }

6
2018-03-29 08:53





p = Project{...}
fmt.Printf("%+v", p)
fmt.Printf("%#v", p) //with type

6
2018-06-03 03:09



fmt.Printf(%#v, p) , ném tôi main.struct với struct type  sự khác biệt giữa "%#v" và "%+v" @cokebol - muthukumar


Chuyến thăm đây để xem mã hoàn chỉnh. Ở đây bạn cũng sẽ tìm thấy một liên kết cho một thiết bị đầu cuối trực tuyến nơi mã hoàn chỉnh có thể được chạy và chương trình đại diện cho cách trích xuất thông tin của cấu trúc (tên của trường loại và giá trị của chúng). Dưới đây là đoạn mã chương trình chỉ in tên trường.

package main

import "fmt"
import "reflect"

func main() {
    type Book struct {
        Id    int
        Name  string
        Title string
    }

    book := Book{1, "Let us C", "Enjoy programming with practice"}
    e := reflect.ValueOf(&book).Elem()

    for i := 0; i < e.NumField(); i++ {
        fieldName := e.Type().Field(i).Name
        fmt.Printf("%v\n", fieldName)
    }
}

/*
Id
Name
Title
*/

3
2017-12-18 04:14





2cents của tôi sẽ được sử dụng json.MarshalIndent - ngạc nhiên điều này không được đề xuất, vì nó là đơn giản nhất. ví dụ:

func prettyPrint(i interface{}) string {
    s, _ := json.MarshalIndent(i, "", "\t")
    return string(s)
}

không có deps bên ngoài và kết quả đầu ra được định dạng độc đáo.


2
2017-07-10 16:24



Tùy chọn thú vị. +1 - VonC


Cũng có đi làm, xử lý đệ quy con trỏ và nhiều phân loại khóa cho chuỗi và bản đồ int.

Cài đặt:

go get github.com/luci/go-render/render

Thí dụ:

type customType int
type testStruct struct {
        S string
        V *map[string]int
        I interface{}
}

a := testStruct{
        S: "hello",
        V: &map[string]int{"foo": 0, "bar": 1},
        I: customType(42),
}

fmt.Println("Render test:")
fmt.Printf("fmt.Printf:    %#v\n", a)))
fmt.Printf("render.Render: %s\n", Render(a))

Bản in nào:

fmt.Printf:    render.testStruct{S:"hello", V:(*map[string]int)(0x600dd065), I:42}
render.Render: render.testStruct{S:"hello", V:(*map[string]int){"bar":1, "foo":0}, I:render.customType(42)}

1
2018-06-15 20:42





Tôi muốn giới thiệu Ví dụ Stuct Chương trình ngôn ngữ GO với một ví dụ về Struc Type.

gói chính

nhập khẩu (
"fmt"
)

func main () {
    loại Salary struct {
        Cơ bản, HRA, TA float64
    }

    type Employee struct {
        FirstName, LastName, Chuỗi email
        Tuổi int
        MonthlySalary [] Mức lương
    }

    e: = Nhân viên {
        FirstName: "Đánh dấu",
        Họ: "Jones",
        Email: "mark@gmail.com",
        Tuổi: 25,
        MonthlySalary: [] Mức lương {
            Mức lương {
                Cơ bản: 15000.00,
                HRA: 5000,00,
                TA: 2000,00,
            },
            Mức lương {
                Cơ bản: 16000.00,
                HRA: 5000,00,
                TA: 2100,00,
            },
            Mức lương {
                Cơ bản: 17000.00,
                HRA: 5000,00,
                TA: 2200,00,
            },
        },
    }
    fmt.Println (e.FirstName, e.LastName)
    fmt.Println (e.Age)
    fmt.Println (e.Email)
    fmt.Println (e.MonthlySalary [0])
    fmt.Println (e.MonthlySalary [1])
    fmt.Println (e.MonthlySalary [2])
}

1
2018-06-16 14:54



Vui lòng thêm một số văn bản để giải thích câu trả lời của bạn - EBH


Một cách khác là tạo một func gọi là toString có cấu trúc, định dạng các trường như bạn muốn.

import (
    "fmt"
)

type T struct {
    x, y string
}

func (r T) toString() string {
    return "Formate as u need :" + r.x + r.y
}

func main() {
    r1 := T{"csa", "ac"}
    fmt.Println("toStringed : ", r1.toString())
}

0
2018-04-18 10:22