Bagaimana saya bisa mencetak (di konsol) yang Id
, Title
, Name
, dll dari struct ini di 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"`
}
fmt.Println
.Jawaban:
Untuk mencetak nama bidang dalam sebuah struct:
Dari
fmt
paket :Itu seandainya Anda memiliki instance dari Proyek (dalam '
yourProject
')Artikel JSON dan Go akan memberikan rincian lebih lanjut tentang cara mengambil nilai dari struct JSON.
Halaman Go by example ini menyediakan teknik lain:
Itu akan mencetak:
Jika Anda tidak memiliki instance, maka Anda perlu menggunakan refleksi untuk menampilkan nama bidang struct yang diberikan, seperti dalam contoh ini .
sumber
Saya ingin merekomendasikan go-spew , yang menurut github mereka "Menerapkan printer yang cukup dalam untuk struktur data Go untuk membantu debugging"
contoh penggunaan:
keluaran:
sumber
2 sen saya akan digunakan
json.MarshalIndent
- terkejut ini tidak disarankan, karena ini adalah yang paling mudah. sebagai contoh:tidak ada deps eksternal dan menghasilkan output yang diformat dengan baik.
sumber
"\t"
dengan" "
jika Anda menginginkan indentasi ruangMarshal()
hanya serialisasi bidang yang diekspor dari struct - namun sangat cocok untuk peta.Saya pikir akan lebih baik untuk menerapkan stringer kustom jika Anda ingin semacam output yang diformat dari
struct
sebagai contoh
sumber
sumber
fmt.Printf(%#v, p)
, melempar sayamain.struct
denganstruct type
apa perbedaan antara"%#v"
dan"%+v"
@cokebolAtau, coba gunakan fungsi ini
PrettyPrint()
Untuk menggunakan ini, Anda tidak perlu paket tambahan dengan pengecualian
fmt
danencoding/json
, hanya referensi, pointer ke, atau literal dari struct yang telah Anda buat.Untuk menggunakan, ambil saja struct Anda, inisialisasinya dalam paket utama atau apa pun yang Anda masuki dan berikan
PrettyPrint()
.Keluarannya adalah
Main-main dengan kode di sini .
sumber
Saya suka sampah .
Dari readme mereka:
Sdump
sangat berguna dalam tes:sumber
Saya merekomendasikan untuk menggunakan Perpustakaan Pretty Printer . Anda dapat mencetak struct dengan sangat mudah.
Instal Perpustakaan
https://github.com/kr/pretty
atau
Sekarang lakukan seperti ini dalam kode Anda
Anda juga bisa mendapatkan perbedaan antara komponen melalui perpustakaan ini dan banyak lagi. Anda juga dapat melihat pustaka Documents di sini.
sumber
pretty.Formatter
Ketika Anda memiliki struktur yang lebih kompleks, Anda mungkin perlu mengonversi ke JSON sebelum mencetak:
Sumber: https://gist.github.com/tetsuok/4942960
sumber
Kunjungi di sini untuk melihat kode lengkap. Di sini Anda juga akan menemukan tautan untuk terminal daring tempat kode lengkap dapat dijalankan dan program tersebut menunjukkan cara mengekstraksi informasi struktur (beri isian jenis & nilainya). Di bawah ini adalah cuplikan program yang hanya mencetak nama bidang.
sumber
Ada juga go-render , yang menangani rekursi pointer dan banyak pemilahan kunci untuk string dan peta int.
Instalasi:
Contoh:
Yang mencetak:
sumber
Ini adalah cara dasar untuk mencetak detail
sumber
Cara lain adalah, buat fungsi
toString
yang membutuhkan struct, format bidang seperti yang Anda inginkan.sumber
Stringer
antarmuka. Akan terlihat seperti ini:func (t T) String() string { return fmt.Sprintf("SomeT{TID: %d, TField: %d, SomeTField: %s, SomeAnotherField: %s}", t.ID, t.Field, t.SomeTField, t.SomeAnotherField) }
Tanpa menggunakan perpustakaan eksternal dan dengan baris baru setelah setiap bidang:
sumber
sumber
sangat sederhana Saya tidak memiliki struktur Data dan Komit. Jadi saya mengubah
Untuk belajar, Anda dapat mengambil bantuan dari sini: https://gobyexample.com/structs
sumber
Mungkin ini seharusnya tidak diterapkan untuk permintaan produksi tetapi jika Anda berada pada mode debugging saya sarankan Anda mengikuti pendekatan di bawah ini.
Ini menghasilkan format data dalam format json dengan peningkatan keterbacaan.
sumber
Sebagian besar paket-paket ini mengandalkan paket refleksi untuk memungkinkan hal-hal seperti itu terjadi.
fmt.Sprintf () menggunakan -> func (p * pp) printArg (antarmuka arg {{, verba rune) dari lib standar
Pergi ke baris 638 -> https://golang.org/src/fmt/print.go
Refleksi:
https://golang.org/pkg/reflect/
Kode contoh:
https://github.com/donutloop/toolkit/blob/master/debugutil/prettysprint.go
sumber
Cara yang lebih baik untuk melakukan ini adalah membuat konstanta global untuk string "% + v" dalam paket yang disebut "commons" (mungkin) dan menggunakannya di mana saja dalam kode Anda
sumber
Println
fungsinya tidak menerima argumen format string. Anda mengatakan konstanta global lebih baik tetapi belum membenarkan mengapa itu lebih baik daripada jawaban yang ditandai. Anda telah membuat label tidak standar untuk string format yang terkenal. Label jauh lebih lama, lebih sulit untuk diingat dan tidak ada orang lain yang bekerja pada kode Anda yang akan menggunakannya. Ini menggunakan ALL_CAPS dan garis bawah yang akan dikeluhkan oleh setiap golang. Konvensi ini adalahmixedCaps
golang.org/doc/effective_go.html#mixed-caps Mungkin yang terbaik untuk menghapus jawaban ini.