偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Golang 語言怎么打印結(jié)構(gòu)體指針類型字段的值?

開發(fā) 后端
在 Golang 語言開發(fā)中,我們經(jīng)常會(huì)使用結(jié)構(gòu)體類型,如果我們使用的結(jié)構(gòu)體類型的變量包含指針類型的字段,我們在記錄日志的時(shí)候,指針類型的字段的值是指針地址,將會(huì)給我們 debug 代碼造成不便。

01介紹

在 Golang 語言開發(fā)中,我們經(jīng)常會(huì)使用結(jié)構(gòu)體類型,如果我們使用的結(jié)構(gòu)體類型的變量包含指針類型的字段,我們在記錄日志的時(shí)候,指針類型的字段的值是指針地址,將會(huì)給我們 debug 代碼造成不便。

實(shí)際上,Golang 為我們提供了一個(gè)接口類型 Stringer ,它是一個(gè)支持以字符串形式描述自己的類型,它只提供了一個(gè)方法,應(yīng)該是 Golang 中最簡單和最常用的接口之一,它由 fmt 包定義。

  1. type Stringer interface { 
  2.     String() string 

fmt 包的打印函數(shù)會(huì)檢查你的類型是否實(shí)現(xiàn)該接口,以便知道怎么打印你的變量。所以,我們在記錄日志的時(shí)候,如果需要記錄的變量是具有指針類型字段的結(jié)構(gòu)體,我們不妨也為該結(jié)構(gòu)體類型定義 String 方法,用來實(shí)現(xiàn)可以記錄指針字段的實(shí)際值的目的。

本文我們介紹怎么通過實(shí)現(xiàn) Stringer 接口,讓我們的代碼更優(yōu)雅。

02打印指針類型的值

讀者朋友們在 Golang 程序開發(fā)中,一定也會(huì)使用到包含指針類型字段的結(jié)構(gòu)體,你是否在記錄日志的時(shí)候,發(fā)現(xiàn)記錄的值是指針地址,給你 debug 代碼造成不便呢?

  1. func main() { 
  2.  name := "frank" 
  3.  user := User
  4.   Id:   1, 
  5.   Name: &name
  6.  } 
  7.  fmt.Println(user
  8.  
  9. type User struct { 
  10.  Id   int 
  11.  Name *string 

輸出結(jié)果:

  1. {1 0xc000096210} 

閱讀上面這段代碼,我們構(gòu)造了一個(gè)包含指針類型字段的結(jié)構(gòu)體,然后打印該結(jié)構(gòu)體類型的變量,輸出結(jié)果中指針類型的字段 Name 的值是指針地址,而不是我們想要的字段值 frank。

試想一下,如果我們記錄的日志中,變量的值是指針地址,將會(huì)對我們 debug 代碼造成不變,所以我們需要使用 Golang 提供的接口 Stringer 解決該問題。

  1. func (u User) String() string { 
  2.  return fmt.Sprintf("{Id: %v, Name: %v}", u.Id, *u.Name

輸出結(jié)果:

  1. {Id: 1, Name: frank} 

閱讀上面這段代碼,我們給類型 User 定義了 String 方法,通過實(shí)現(xiàn) Golang 的 Stringer 接口,來實(shí)現(xiàn)打印指針類型變量的實(shí)際值的目的。

03避“坑”

讀者朋友們閱讀完以上內(nèi)容,應(yīng)該已經(jīng)學(xué)會(huì)了怎么使用接口 Stringer 實(shí)現(xiàn)打印指針類型變量的值。不過,我還是想列舉一個(gè)異常情況,幫助 Golang 新手讀者朋友避“坑”。如果你已經(jīng)是 Golang 老手,本節(jié)內(nèi)容可以跳過。

  1. func (u *User) String() string { 
  2.  return fmt.Sprintf("{Id: %v, Name: %v}", u.Id, *u.Name

閱讀上面這段代碼,我們將類型方法的接收者改為指針類型,我相信大多數(shù)讀者朋友們會(huì)使用指針類型的接收者。此時(shí),讀者朋友會(huì)發(fā)現(xiàn)輸出結(jié)果沒有使用我們定義的 String 方法,而是輸出的指針類型字段的指針地址。

想要解決這個(gè)問題也很簡單,我們只需要在定義結(jié)構(gòu)體類型變量的時(shí)候,使用指針類型,這樣 fmt 包的打印函數(shù)就可以自動(dòng)執(zhí)行我們定義的 String 方法了。

  1. func main() { 
  2.  name := "frank" 
  3.  user := &User
  4.   Id:   1, 
  5.   Name: &name
  6.  } 
  7.  fmt.Println(user

04總結(jié)

本文我們介紹了怎么打印包含指針類型變量的結(jié)構(gòu)體類型變量的值,在我們需要記錄日志的時(shí)候,不用再因?yàn)橛涗浀氖侵羔樀刂罚瑥亩o我們 debug 代碼造成不便。

參考資料:

https://go.dev/doc/effective_go#pointers_vs_values

 

https://go.dev/tour/methods/17

 

責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2021-06-01 23:18:00

Golang語言Method

2023-08-28 17:16:51

Golangio 包

2022-01-04 23:13:57

語言PanicGolang

2021-05-11 11:31:52

C語言類型指針

2014-04-01 10:11:33

C語言指針

2021-07-12 05:05:59

Golang語言字段

2024-11-11 00:45:54

Gin框架字段

2009-08-31 15:02:22

C#解析結(jié)構(gòu)體指針

2023-06-09 08:16:09

GolangStruct Tag

2024-05-16 12:23:45

C語言指針代碼

2009-08-14 11:05:28

C#語言的結(jié)構(gòu)體

2021-04-20 09:00:48

Go 語言結(jié)構(gòu)體type

2023-07-29 15:03:29

2021-06-09 23:36:46

Golang語言版本

2022-01-12 08:30:55

結(jié)構(gòu)體指針STM32

2009-08-13 15:41:50

C#結(jié)構(gòu)體指針

2022-09-18 23:09:13

Go語言標(biāo)準(zhǔn)庫

2023-07-11 08:22:09

2021-09-13 05:02:49

GogRPC語言

2014-02-10 15:05:37

C語言封裝
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號