亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取結構名稱而不獲取包名稱或指針

獲取結構名稱而不獲取包名稱或指針

Go
PIPIONE 2023-07-31 16:29:36
我有一個非常簡單的代碼,如下所示:package chain_of_responsibilityimport (    "fmt"    "reflect")type CustomerBalanceRequest struct{    CustomerName string    Balance int}type BalanceRequest interface {    Handle(request CustomerBalanceRequest)}type HeadEditor struct{    Next BalanceRequest}func (h *HeadEditor) Handle(b CustomerBalanceRequest){    if b.Balance < 1000 {        fmt.Printf("%T approved balance for %v request. Balance: %v\n", h, b.CustomerName, b.Balance)        fmt.Printf("%v approved balance for %v request. Balance: %v\n", reflect.TypeOf(h), b.CustomerName, b.Balance)        fmt.Printf("%v approved balance for %v request. Balance: %v\n", reflect.TypeOf(h).String(), b.CustomerName, b.Balance)        fmt.Printf("%v approved balance for %v request. Balance: %v\n", reflect.TypeOf(h).Name(), b.CustomerName, b.Balance)    } else{        h.Next.Handle(b)    }}在 fmt.Printf 行上,我想打印 HeadEditor 類型的名稱。我使用各種方法來實現這一點,這就是我的結果:*chain_of_responsibility.HeadEditor approved balance for John request. Balance: 500*chain_of_responsibility.HeadEditor approved balance for John request. Balance: 500*chain_of_responsibility.HeadEditor approved balance for John request. Balance: 500 approved balance for John request. Balance: 500問題是在前 3 個 Printf 調用中,我可以獲得類型的名稱,但它們包括指針和包名稱。有什么方法可以讓我只獲得沒有包名稱和指針的“HeadEditor”,當然除了字符串處理解決方案(例如從結果中刪除 * 和包名稱)。
查看完整描述

1 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

你已經接近最后一個了。正如Name()的文檔所述:


// Name returns the type's name within its package for a defined type.

// For other (non-defined) types it returns the empty string.

您將返回空字符串,因為 whilechain_of_responsibility.HeadEditor是已定義的類型,*chain_of_responsibility.HeadEditor但不是。您可以使用以下命令從指針類型中獲取類型Elem():


// Elem returns a type's element type.

// It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.

因此,如果它并不總是一個指針,那么在調用之前您需要首先檢查它是否是一個指針Elem()。


或者,您可以通過反射來使代碼變得更簡單(并且可能更快),并為您的類型提供一個方法,該方法返回您想要用于每種類型的任何字符串,例如Type() string. 然后,您可以定義一個Typer接口來封裝該方法。


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號