কনসোলে স্ট্রাক্ট ভেরিয়েবল কীভাবে মুদ্রণ করবেন?


379

আমি (কনসোলে) কীভাবে মুদ্রণ করতে পারেন Id, Title, Name, Golang মধ্যে এই struct ইত্যাদি?

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

2
সবগুলিই, ডিবাগিংয়ের জন্য? ব্যবহার করে দেখুন fmt.Println
রাই-

উত্তর:


640

একটি কাঠামোয় ক্ষেত্রের নাম মুদ্রণ করতে:

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())
}

1
আপনার উত্তরের জন্য ধন্যবাদ তবে আরও একটি জিনিস আছে। আমার জেএসওএন ফাইলগুলি একটি এপিআইয়ের সাথে সম্পর্কিত ... এজন্য আমি আইডি বা নাম সেট করতে চাই না, আমি কেবল এটি এপিআইতে পেতে এবং কনসোলে মুদ্রণ করতে চাই। আমি এটা কিভাবে করবো?
14

4
@fnr আপনার যদি জেএসওএন ডকুমেন্ট থাকে তবে এর ক্ষেত্রটি মুদ্রণ করতে পারার আগে আপনার এটি খনন করতে হবে।
ভোনসি

3
সম্মত! আমার একটি অভিযোগ% + v কমান্ড এটি প্রিন্ট করে না! আমি এখনও এই লাইনের দক্ষতায় খুশি।
শাদোনিনজা

1
জেসন মার্শালিং কৌশলটির জন্য "এনকোডিং / জসন" আমদানি করা দরকার
জিম হোয়াগল্যান্ড

1
নোট করুন। মুদ্রণযন্ত্র ("% + ভি \ n") "লগ" প্যাকেজটির সাথেও কাজ করে
এরিয়েল মোনাকো

140

আমি গো-স্পো সুপারিশ করতে চাই , যা তাদের গিথব অনুসারে "ডিবাগিংয়ে সহায়তা করতে গো ডেটা স্ট্রাকচারের জন্য একটি গভীর সুন্দর প্রিন্টার সরবরাহ করে"

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) ""
}

5
আপনি গো-স্পোতে থাকা ডিरेফারেশন বৈশিষ্ট্যটি যুক্ত করতে পারেন। এটি আপনাকে সেই কাঠামোর মানটি মুদ্রণের অনুমতি দেয় যেখানে পয়েন্টারটি রেফারেন্স করছে এবং পয়েন্টারটি এটিেল নয়

ব্যবহারের স্পো সহ বড় প্রোটি হ'ল আউটপুটটি ইতিমধ্যে ভাল ফর্ম্যাট হয়েছে যাতে আপনি সহজেই সমস্ত বস্তুর বৈশিষ্ট্যগুলি পরীক্ষা করতে পারেন।
কয়েল

96

আমার 2cents ব্যবহার করা হবে json.MarshalIndent- অবাক বিস্মিত এটি প্রস্তাবিত নয়, কারণ এটি সবচেয়ে সোজা। উদাহরণ স্বরূপ:

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

কোনও বাহ্যিক Deps এবং সুন্দর ফর্ম্যাট আউটপুট ফলাফল।


2
আকর্ষণীয় বিকল্প। +1
ভোনসি

1
ঠিক আমি খুঁজছেন ছিল কি. জসন লাইব্রেরিতে পুনর্নির্মাণের সাথে সহজ সুন্দর মুদ্রণ।
অ্যাডমিরালথ্রন

ক্ষেত্রের ধরণ এবং দৈর্ঘ্য মুদ্রণের প্রয়োজন না থাকলে (পয়েন্টারগুলি যথাযথভাবে মুদ্রিত হওয়ায় এই সমাধানটি কেবল সেরা)!
ক্রিস্টোফ ভিদাল

👏🏻 সংক্ষিপ্ত এবং মিষ্টি। পরিবর্তে স্পেস ইনডেন্টিং চাইলে আপনি এর "\t"সাথে প্রতিস্থাপন করতে " "পারেন
ডানা উডম্যান

1
দ্রষ্টব্য, Marshal()শুধুমাত্র একটি কাঠামোর রফতানি ক্ষেত্রগুলিকে সিরিয়ালাইজ করে - যদিও এটি মানচিত্রের জন্য উপযুক্ত।
নোবার

24

আমি মনে করি আপনি যদি কোনও ধরণের ফর্ম্যাট আউটপুট চান তবে একটি কাস্টম স্ট্রিংগার প্রয়োগ করা ভাল 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)
    }

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

2
fmt.Printf(%#v, p)আমার ছোঁড়ার main.structসঙ্গে struct type পার্থক্য কি "%#v"এবং "%+v"@cokebol
muthukumar helius

13

বিকল্পভাবে, এই ফাংশনটি ব্যবহার করে দেখুন 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
} 

কোডটি সহ এখানে খেলুন ।


5

আমি লিটার পছন্দ করি

তাদের রেডমি থেকে:

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)
  }
}

5

আমি প্রিটি প্রিন্টার লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি । এতে আপনি যে কোনও স্ট্রাক্ট খুব সহজেই মুদ্রণ করতে পারেন।

  1. লাইব্রেরি ইনস্টল করুন

    https://github.com/kr/pretty

অথবা

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.

}

এছাড়াও আপনি এই লাইব্রেরির মাধ্যমে উপাদানগুলির মধ্যে পার্থক্য পেতে পারেন এবং আরও অনেক কিছু। আপনি এখানে লাইব্রেরি ডক্সেও নজর রাখতে পারেন ।


1
উত্পাদিত আউটপুটটির উদাহরণটি দেখতে সহায়ক হবেpretty.Formatter
কনস্টান্টিন টিখোনভ

3

পরিদর্শন এখানে সম্পূর্ণ কোড দেখতে। এখানে আপনি একটি অনলাইন টার্মিনালের জন্য একটি লিঙ্কও পাবেন যেখানে সম্পূর্ণ কোডটি চালানো যায় এবং প্রোগ্রামটি কীভাবে কাঠামোর তথ্য বের করতে হয় তা উপস্থাপন করে (ক্ষেত্রের নামটি তাদের ধরণ এবং মান)। নীচে প্রোগ্রাম স্নিপেট রয়েছে যা কেবলমাত্র ফিল্ডের নাম মুদ্রণ করে।

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

আপনার যদি আরও জটিল কাঠামো থাকে, আপনার মুদ্রণের আগে জেএসএনে রূপান্তর করতে হবে:

// Convert structs to JSON.
data, err := json.Marshal(myComplexStruct)
fmt.Printf("%s\n", data)

সূত্র: https://gist.github.com/tetsuok/4942960


2

এছাড়াও আছে গো-রেন্ডার , যা হ্যান্ডলগুলি পয়েন্টার 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)}

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

এটি বিশদটি মুদ্রণের প্রাথমিক উপায়


0

আর একটি উপায় হ'ল, এমন একটি ফানক তৈরি করুন 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())
}

2
অথবা আপনি 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) }
rbo13

0

বাহ্যিক গ্রন্থাগারগুলি ব্যবহার না করে এবং প্রতিটি ক্ষেত্রের পরে নতুন লাইন সহ:

log.Println(
            strings.Replace(
                fmt.Sprintf("%#v", post), ", ", "\n", -1))

0
    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)
        }
    }

0

খুব সহজ আমার কাছে ডেটা এবং কমিটের কাঠামো নেই তাই আমি পরিবর্তন করেছি

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


0

সম্ভবত এটি উত্পাদন অনুরোধের জন্য প্রয়োগ করা উচিত নয় তবে আপনি যদি ডিবাগিং মোডে থাকেন তবে আমি আপনাকে নীচের পদ্ধতির অনুসরণ করার পরামর্শ দিই।

marshalledText, _ := json.MarshalIndent(inputStruct, "", " ")
fmt.Println(string(marshalledText))

পঠনযোগ্যতা সহ json ফর্ম্যাটে ডেটা ফর্ম্যাট করার ফলস্বরূপ।


-2

এই প্যাকেজগুলির বেশিরভাগই এ জাতীয় জিনিসগুলি সম্ভব করতে রিফ্লেক্ট প্যাকেজের উপর নির্ভর করে।

এখানে চিত্র বর্ণনা লিখুন

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


-7
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)

3
বিনীতভাবে, লোকেরা এটিকে নিচে ভোট দিয়েছে কারণ Printlnফাংশনটি কোনও ফর্ম্যাট স্ট্রিং আর্গুমেন্ট গ্রহণ করে না। আপনি বলছেন যে একটি গ্লোবাল ধ্রুবক ভাল তবে এটি চিহ্নিত উত্তরগুলির চেয়ে কেন ভাল তা ন্যায়সঙ্গত হয়নি। আপনি একটি সুপরিচিত ফর্ম্যাট স্ট্রিংয়ের জন্য একটি নন-স্ট্যান্ডার্ড লেবেল তৈরি করেছেন। লেবেলটি অনেক দীর্ঘ, মনে রাখা আরও কঠিন এবং আপনার কোডে কাজ করা অন্য কেউ এটিকে ব্যবহার করবেন না। এটি ALL_CAPS এবং একটি আন্ডারস্কোর উভয়ই ব্যবহার করে যা প্রতি গোলং লিটার অভিযোগ করবে। কনভেনশন mixedCaps golang.org/doc/effective_go.html#mixed-caps সম্ভবত সেরা এই উত্তরটি মুছে ফেলার জন্য।
দাভোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.