উত্তর:
একটি কাঠামোয় ক্ষেত্রের নাম মুদ্রণ করতে:
fmt.Printf("%+v\n", yourProject)
fmt
প্যাকেজ থেকে :
স্ট্রাক্টগুলি মুদ্রণের সময়, প্লাস পতাকা (
%+v
) ক্ষেত্রের নাম যুক্ত করে
মনে করুন আপনার কাছে প্রকল্পের একটি উদাহরণ রয়েছে (' yourProject
' তে)
JSON এবং Go নিবন্ধটি JSON স্ট্রাক্ট থেকে কীভাবে মানগুলি পুনরুদ্ধার করতে হবে সে সম্পর্কে আরও বিশদ দেবে।
এই উদাহরণ পৃষ্ঠা দ্বারা যান অন্য কৌশল প্রদান করে:
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))
এটি মুদ্রণ করবে:
{"page":1,"fruits":["apple","peach","pear"]}
যদি আপনি কোন দৃষ্টান্ত নেই, তাহলে আপনি প্রয়োজন প্রতিফলন ব্যবহার , একটি প্রদত্ত struct হয় ক্ষেত্রের নাম প্রদর্শন করে এই উদাহরণ হিসাবে ।
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())
}
আমি গো-স্পো সুপারিশ করতে চাই , যা তাদের গিথব অনুসারে "ডিবাগিংয়ে সহায়তা করতে গো ডেটা স্ট্রাকচারের জন্য একটি গভীর সুন্দর প্রিন্টার সরবরাহ করে"
go get -u github.com/davecgh/go-spew/spew
ব্যবহারের উদাহরণ:
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)
}
আউটপুট:
(main.Project) {
Id: (int64) 0,
Title: (string) (len=5) "world",
Name: (string) (len=5) "hello",
Data: (string) "",
Commits: (string) ""
}
আমার 2cents ব্যবহার করা হবে json.MarshalIndent
- অবাক বিস্মিত এটি প্রস্তাবিত নয়, কারণ এটি সবচেয়ে সোজা। উদাহরণ স্বরূপ:
func prettyPrint(i interface{}) string {
s, _ := json.MarshalIndent(i, "", "\t")
return string(s)
}
কোনও বাহ্যিক Deps এবং সুন্দর ফর্ম্যাট আউটপুট ফলাফল।
"\t"
সাথে প্রতিস্থাপন করতে " "
পারেন
আমি মনে করি আপনি যদি কোনও ধরণের ফর্ম্যাট আউটপুট চান তবে একটি কাস্টম স্ট্রিংগার প্রয়োগ করা ভাল struct
উদাহরণ স্বরূপ
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)
}
p = Project{...}
fmt.Printf("%+v", p)
fmt.Printf("%#v", p) //with type
fmt.Printf(%#v, p)
আমার ছোঁড়ার main.struct
সঙ্গে struct type
পার্থক্য কি "%#v"
এবং "%+v"
@cokebol
বিকল্পভাবে, এই ফাংশনটি ব্যবহার করে দেখুন PrettyPrint()
// print the contents of the obj
func PrettyPrint(data interface{}) {
var p []byte
// var err := error
p, err := json.MarshalIndent(data, "", "\t")
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%s \n", p)
}
এই ব্যবহার করার জন্য আপনি বাদ দিয়ে কোনো অতিরিক্ত প্যাকেজ প্রয়োজন হবে না fmt
এবং encoding/json
শুধু একটি রেফারেন্স, এর পয়েন্টার, অথবা struct হয় আপনি তৈরি করেছেন আভিধানিক।
কেবল আপনার কাঠামোটি ব্যবহার করার জন্য, এটি মূল বা আপনি যে প্যাকেজে রয়েছেন তা শুরু করুন এবং এতে প্রবেশ করুন PrettyPrint()
।
type Prefix struct {
Network string
Mask int
}
func valueStruct() {
// struct as a value
var nw Prefix
nw.Network = "10.1.1.0"
nw.Mask = 24
fmt.Println("### struct as a pointer ###")
PrettyPrint(&nw)
}
এটি আউটপুট হবে
### struct as a pointer ###
{
"Network": "10.1.1.0",
"Mask": 24
}
কোডটি সহ এখানে খেলুন ।
আমি লিটার পছন্দ করি ।
তাদের রেডমি থেকে:
type Person struct {
Name string
Age int
Parent *Person
}
litter.Dump(Person{
Name: "Bob",
Age: 20,
Parent: &Person{
Name: "Jane",
Age: 50,
},
})
Sdump
পরীক্ষায় বেশ কার্যকর:
func TestSearch(t *testing.T) {
result := DoSearch()
actual := litterOpts.Sdump(result)
expected, err := ioutil.ReadFile("testdata.txt")
if err != nil {
// First run, write test data since it doesn't exist
if !os.IsNotExist(err) {
t.Error(err)
}
ioutil.Write("testdata.txt", actual, 0644)
actual = expected
}
if expected != actual {
t.Errorf("Expected %s, got %s", expected, actual)
}
}
আমি প্রিটি প্রিন্টার লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি । এতে আপনি যে কোনও স্ট্রাক্ট খুব সহজেই মুদ্রণ করতে পারেন।
লাইব্রেরি ইনস্টল করুন
অথবা
go get github.com/kr/pretty
এখন আপনার কোড এ পছন্দ করুন
package main
import (
fmt
github.com/kr/pretty
)
func main(){
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.Printf("%# v", pretty.Formatter(Project)) //It will print all struct details
fmt.Printf("%# v", pretty.Formatter(Project.Id)) //It will print component one by one.
}
এছাড়াও আপনি এই লাইব্রেরির মাধ্যমে উপাদানগুলির মধ্যে পার্থক্য পেতে পারেন এবং আরও অনেক কিছু। আপনি এখানে লাইব্রেরি ডক্সেও নজর রাখতে পারেন ।
pretty.Formatter
পরিদর্শন এখানে সম্পূর্ণ কোড দেখতে। এখানে আপনি একটি অনলাইন টার্মিনালের জন্য একটি লিঙ্কও পাবেন যেখানে সম্পূর্ণ কোডটি চালানো যায় এবং প্রোগ্রামটি কীভাবে কাঠামোর তথ্য বের করতে হয় তা উপস্থাপন করে (ক্ষেত্রের নামটি তাদের ধরণ এবং মান)। নীচে প্রোগ্রাম স্নিপেট রয়েছে যা কেবলমাত্র ফিল্ডের নাম মুদ্রণ করে।
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
*/
আপনার যদি আরও জটিল কাঠামো থাকে, আপনার মুদ্রণের আগে জেএসএনে রূপান্তর করতে হবে:
// Convert structs to JSON.
data, err := json.Marshal(myComplexStruct)
fmt.Printf("%s\n", data)
এছাড়াও আছে গো-রেন্ডার , যা হ্যান্ডলগুলি পয়েন্টার recursion ও স্ট্রিং এবং int মানচিত্রের জন্য বাছাই কী প্রচুর।
স্থাপন:
go get github.com/luci/go-render/render
উদাহরণ:
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))
কোন মুদ্রণ:
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)}
fmt.Printf("%+v\n", project)
এটি বিশদটি মুদ্রণের প্রাথমিক উপায়
আর একটি উপায় হ'ল, এমন একটি ফানক তৈরি করুন toString
যা স্ট্রাক্ট গ্রহণ করে, ক্ষেত্রগুলি আপনার ইচ্ছামত বিন্যাস করুন।
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())
}
Stringer
ইন্টারফেস বাস্তবায়ন করতে পারে । এটি দেখতে এরকম কিছু লাগবে: 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) }
বাহ্যিক গ্রন্থাগারগুলি ব্যবহার না করে এবং প্রতিটি ক্ষেত্রের পরে নতুন লাইন সহ:
log.Println(
strings.Replace(
fmt.Sprintf("%#v", post), ", ", "\n", -1))
type Response struct {
UserId int `json:"userId"`
Id int `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
func PostsGet() gin.HandlerFunc {
return func(c *gin.Context) {
xs, err := http.Get("https://jsonplaceholder.typicode.com/posts")
if err != nil {
log.Println("The HTTP request failed with error: ", err)
}
data, _ := ioutil.ReadAll(xs`enter code here`.Body)
// this will print the struct in console
fmt.Println(string(data))
// this is to send as response for the API
bytes := []byte(string(data))
var res []Response
json.Unmarshal(bytes, &res)
c.JSON(http.StatusOK, res)
}
}
খুব সহজ আমার কাছে ডেটা এবং কমিটের কাঠামো নেই তাই আমি পরিবর্তন করেছি
package main
import (
"fmt"
)
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() {
p := Project{
1,
"First",
"Ankit",
"your data",
"Commit message",
}
fmt.Println(p)
}
শেখার জন্য আপনি এখান থেকে সহায়তা নিতে পারেন: https://gobyexample.com/structs
সম্ভবত এটি উত্পাদন অনুরোধের জন্য প্রয়োগ করা উচিত নয় তবে আপনি যদি ডিবাগিং মোডে থাকেন তবে আমি আপনাকে নীচের পদ্ধতির অনুসরণ করার পরামর্শ দিই।
marshalledText, _ := json.MarshalIndent(inputStruct, "", " ")
fmt.Println(string(marshalledText))
পঠনযোগ্যতা সহ json ফর্ম্যাটে ডেটা ফর্ম্যাট করার ফলস্বরূপ।
এই প্যাকেজগুলির বেশিরভাগই এ জাতীয় জিনিসগুলি সম্ভব করতে রিফ্লেক্ট প্যাকেজের উপর নির্ভর করে।
fmt.Sprintf () স্ট্যান্ডার্ড লিবের -> ফানক (পি * পিপি) প্রিন্টআরগ (আরগ ইন্টারফেস {}, ক্রিয়া রুনে) ব্যবহার করছে
638 -> https://golang.org/src/fmt/print.go লাইনে যান
প্রতিফলন:
https://golang.org/pkg/reflect/
উদাহরণ কোড:
https://github.com/donutloop/toolkit/blob/master/debugutil/prettysprint.go
fmt.Println("%+v", structure variable)
এটির আরও ভাল উপায় হ'ল "কমন্স" (সম্ভবত) নামে একটি প্যাকেজে "% + v" স্ট্রিংয়ের জন্য একটি গ্লোবাল ধ্রুবক তৈরি করা এবং এটি আপনার কোডের যে কোনও জায়গায় ব্যবহার করা to
//In commons package
const STRUCTURE_DATA_FMT = "%+v"
//In your code everywhere
fmt.Println(commons.STRUCTURE_DATA_FMT, structure variable)
Println
ফাংশনটি কোনও ফর্ম্যাট স্ট্রিং আর্গুমেন্ট গ্রহণ করে না। আপনি বলছেন যে একটি গ্লোবাল ধ্রুবক ভাল তবে এটি চিহ্নিত উত্তরগুলির চেয়ে কেন ভাল তা ন্যায়সঙ্গত হয়নি। আপনি একটি সুপরিচিত ফর্ম্যাট স্ট্রিংয়ের জন্য একটি নন-স্ট্যান্ডার্ড লেবেল তৈরি করেছেন। লেবেলটি অনেক দীর্ঘ, মনে রাখা আরও কঠিন এবং আপনার কোডে কাজ করা অন্য কেউ এটিকে ব্যবহার করবেন না। এটি ALL_CAPS এবং একটি আন্ডারস্কোর উভয়ই ব্যবহার করে যা প্রতি গোলং লিটার অভিযোগ করবে। কনভেনশন mixedCaps
golang.org/doc/effective_go.html#mixed-caps সম্ভবত সেরা এই উত্তরটি মুছে ফেলার জন্য।
fmt.Println
।