Как использовать текст, указанный при указании c структуры при вызове fmt.Printf ("% + v", obj) - PullRequest
0 голосов
/ 17 апреля 2020

Например, существует структура Student

type Student struct {
 Filed1 string
 Filed2 string
 Filed3 string
 Name *string
 Data []byte
}

func main(){
    name := "john"
    s := Student3{
        Filed1: "a",
        Filed2: "b",
        Filed3: "c",
        Name:   &name,
        Data:   []byte{1, 2, 3},
    }
    fmt.Printf("%+v", s)
}

Результат печати: {Filed1:a Filed2:b Filed3:c Name:0xc000167230 Data:[1 2 3]}%

Но я хочу использовать вывод String () полей Name и Data

  1. вывод поля Name будет исходным значением, а не указателем
  2. вывод поля Date будет шестнадцатеричной строкой "0x010203", которая является результатом hex.EncodeToString (xxx)

Таким образом, его вывод будет {Filed1:a Filed2:b Filed3:c Name:"john" Date:"0x010203"}

Есть ли простой способ реализовать это?

1 Ответ

0 голосов
/ 17 апреля 2020

У вас есть несколько вариантов. Как написал Фолькер в своем комментарии, вы можете реализовать метод String в структуре. Вы также можете использовать json .Marshal / MarshalIndent, если вы хотите отформатировать json. Это также дает вам возможность по-разному называть поля в выходных данных.

Вот пример этого:

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    Field1 string `json:"fieldNameInJSON"`
    Field2 string
    Field3 string
    Name   *string
    Data   []byte
}

func (s Student) String() string {
    return fmt.Sprintf("{ Field1: %s, Field2: %s, Field3: %s, Name: %s, Data: %v}", s.Field1, s.Field2, s.Field3, *s.Name, s.Data)
}

func main() {
    name := "john"
    s := Student{
        Field1: "a",
        Field2: "b",
        Field3: "c",
        Name:   &name,
        Data:   []byte{1, 2, 3},
    }
    fmt.Printf("%+v\n", s)
    fmt.Println(s)
    j, e := json.Marshal(s)
    if e == nil {
        fmt.Println(string(j))
    }
    j, e = json.MarshalIndent(s, " ", " ")
    if e == nil {
        fmt.Println(string(j))
    }
}

Если вы запускаете на play , вы получаете вывод:

{ Field1: a, Field2: b, Field3: c, Name: john, Data: [1 2 3]}
{ Field1: a, Field2: b, Field3: c, Name: john, Data: [1 2 3]}
{"fieldNameInJSON":"a","Field2":"b","Field3":"c","Name":"john","Data":"AQID"}
{
  "fieldNameInJSON": "a",
  "Field2": "b",
  "Field3": "c",
  "Name": "john",
  "Data": "AQID"
 } 

* Редактировать:

Я пропустил, вы хотели запустить hex.EncodeToString в поле данных, вы, конечно, можете добавить это в String () метод. Если вы хотите сделать это для json, вам нужно реализовать Marshaler, как описано в этом ответе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...