📜  在 Golang 中打印结构变量

📅  最后修改于: 2021-10-25 02:49:35             🧑  作者: Mango

假设,我们需要打印结构及其字段对应的值。我们可以在包fmt的帮助下做到这一点,它使用类似于 C 的 printf 和 scanf 的函数实现格式化的 I/O。让我们先试试如果我们只是打印结构,会发生什么。

package main
   
import ("fmt")
   
// Fields: structure to be printed
type Fields struct {
    Name     string
    NickName string
    Age      int
}
   
func main() {
  
    // Initialising the struct with values
    var f = Fields{
    Name:     "Abc",
    NickName: "abc",
    Age:      19,
    }
  
    // printing the structure
    fmt.Println(f)
}

输出:

{Abc abc 19}

在 Golang 中打印结构变量有两种方式。第一种方法是使用包 fmt 的Printf函数,在打印格式参数的参数中带有特殊标签。其中一些论点如下:

%v the value in a default format
%+v the plus flag adds field names
%#v a Go-syntax representation of the value
package main
  
import (
    "fmt"
)
  
// Fields: structure to be printed
type Fields struct {
    Name     string
    NickName string
    Age      int
}
  
func main() {
  
    // initializing the 
    // struct with values
    var f = Fields{
        Name:     "Abc",
        NickName: "abc",
        Age:      19,
    }
      
    // printing the structure
    fmt.Printf("%v\n", f)
    fmt.Printf("%+v\n", f)
    fmt.Printf("%#v\n", f)
}

输出:

{Abc abc 19}
{Name:Abc NickName:abc Age:19}
main.Fields{Name:"Abc", NickName:"abc", Age:19}

带有 #v 的 Printf 包括main.Fields ,它是结构的名称。它包括“main”以区分不同包中存在的结构。

第二种可能的方法是使用包 encoding/json 的函数Marshal

句法 :

func Marshal(v interface{}) ([]byte, error)
package main
  
import (
    "encoding/json"
    "fmt"
)
  
// Fields: structure to be printed
type Fields struct {
    Name     string
    NickName string
    Age      int
}
  
func main() {
  
    // initialising the struct
    // with values
    var f = Fields{
        Name:     "Abc",
        NickName: "abc",
        Age:      19,
    }
      
    // Marshalling the structure
    // For now ignoring error
    // but you should handle
    // the error in above function
    jsonF, _ := json.Marshal(f)
  
    // typecasting byte array to string
    fmt.Println(string(jsonF))
  
}

输出:

{"Name":"Abc", "NickName":"abc", "Age":19}