成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 語言怎么打印結構體指針類型字段的值?

開發 后端
在 Golang 語言開發中,我們經常會使用結構體類型,如果我們使用的結構體類型的變量包含指針類型的字段,我們在記錄日志的時候,指針類型的字段的值是指針地址,將會給我們 debug 代碼造成不便。

01介紹

在 Golang 語言開發中,我們經常會使用結構體類型,如果我們使用的結構體類型的變量包含指針類型的字段,我們在記錄日志的時候,指針類型的字段的值是指針地址,將會給我們 debug 代碼造成不便。

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

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

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

本文我們介紹怎么通過實現 Stringer 接口,讓我們的代碼更優雅。

02打印指針類型的值

讀者朋友們在 Golang 程序開發中,一定也會使用到包含指針類型字段的結構體,你是否在記錄日志的時候,發現記錄的值是指針地址,給你 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 

輸出結果:

  1. {1 0xc000096210} 

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

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

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

輸出結果:

  1. {Id: 1, Name: frank} 

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

03避“坑”

讀者朋友們閱讀完以上內容,應該已經學會了怎么使用接口 Stringer 實現打印指針類型變量的值。不過,我還是想列舉一個異常情況,幫助 Golang 新手讀者朋友避“坑”。如果你已經是 Golang 老手,本節內容可以跳過。

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

閱讀上面這段代碼,我們將類型方法的接收者改為指針類型,我相信大多數讀者朋友們會使用指針類型的接收者。此時,讀者朋友會發現輸出結果沒有使用我們定義的 String 方法,而是輸出的指針類型字段的指針地址。

想要解決這個問題也很簡單,我們只需要在定義結構體類型變量的時候,使用指針類型,這樣 fmt 包的打印函數就可以自動執行我們定義的 String 方法了。

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

04總結

本文我們介紹了怎么打印包含指針類型變量的結構體類型變量的值,在我們需要記錄日志的時候,不用再因為記錄的是指針地址,從而給我們 debug 代碼造成不便。

參考資料:

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

 

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

 

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

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#解析結構體指針

2023-06-09 08:16:09

GolangStruct Tag

2024-05-16 12:23:45

C語言指針代碼

2023-07-29 15:03:29

2021-04-20 09:00:48

Go 語言結構體type

2009-08-14 11:05:28

C#語言的結構體

2009-08-13 15:41:50

C#結構體指針

2022-01-12 08:30:55

結構體指針STM32

2021-06-09 23:36:46

Golang語言版本

2022-09-18 23:09:13

Go語言標準庫

2023-07-11 08:22:09

2014-02-10 15:05:37

C語言封裝

2021-09-13 05:02:49

GogRPC語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区四区五区加勒比 | av在线二区 | 亚洲毛片在线观看 | 日日干日日 | 日韩欧美在线观看视频 | 亚洲第一视频网 | 亚洲伊人久久综合 | 中文av电影 | 成人久草 | 国产精品伦一区二区三级视频 | 国内精品99| 91一区二区三区 | 精品国产一区二区三区免费 | 操到爽| 日韩精品视频一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 久久这里只有精品首页 | 国产亚洲精品久久19p | 亚洲av毛片 | 久久ww| 天天天天操 | 小早川怜子xxxxaⅴ在线 | 久久夜夜 | 日本中文字幕一区 | 少妇一级淫片免费放播放 | 日韩免费一区二区 | 国产成人一区二区 | 亚洲欧美日韩在线 | 久久精品国产免费 | 99久久久国产精品 | 精品欧美一区二区三区久久久 | 欧美日一区| 激情 亚洲| 视频一区二区在线观看 | 久久精品亚洲精品 | 男人的天堂在线视频 | 国产一区二区三区免费观看视频 | 三级国产三级在线 | 日韩精品免费看 | 男女网站视频 | 欧美成人手机在线 |