Programming 板


LINE

※ 引述《umaka0325 (Umaka)》之銘言: : 最近在摸索Go的相關語法碰到一些問題想請教一下 : 程式碼如下: : type Person struct { : Name string : Age int : } : func test1(p *Person) { : p.Name = "123" : } : func test(p any) { : test1(p.(*Person)) : ^^^^^^^^ : } : 想請問底線部分的*Person這個結構有什麼辦法從輸入p any動態產生嗎? : 謝謝!! 初學者常常希望能存取不特定型別的共同欄位 不過... https://tenor.com/bhDEJ.gif
正常的寫法都是改寫成 interface type Person interface { GetName() string GetAge() int } type person struct { Name string Age int } func (p *person) GetName() string { return p.Name } func (p *person) GetAge() int { return p.Age } func test(p Person) { otherfunc(p.GetName(), ...) otherfunc(p.GetAge(), ...) } func callTest() { pe := &person{ Name: "John Doe", Age: 20, } test(pe) } 對,golang 的 interface 就是如此繁瑣 -- 如果共通 type 只有幾種 struct 會用到 可以獨立出一個 base struct embed 進其他 struct type Model struct { ID string } type RecordA struct { Model Entry1 int } type RecordB struct { Model Entry2 int } func test(record *Model) { otherfunc(record.ID, ...) } func callTest() { a := &RecordA{ Model: Model{ ID: "hello", }, Entry1: 0, } b := &RecordB{ Model: Model{ ID: "world", }, Entry2: 1, } test(a.Model) test(b.Model) } 但是這種寫法是比較不推薦的。 原因是易遭到濫用,很多人會把這種語法當作繼承 (inheritance) 使用, 但 golang 沒有繼承,只有組合 (composition),所以他還是分開的兩種 type。 當你的 type 會跨出這個 package 的時候建議避免採用這種方式。 當然,如果你知道自己在做什麼也不是不能用。 比較經典的範例是 gorm.Model https://gorm.io/docs/models.html 或是常常會有人把 sync.Mutex 嵌進 struct 裡。 初學者看完 Effective Go 建議可以參考 https://github.com/uber-go/guide/blob/master/style.md 當然這不代表所有業界程式碼風格規範, 但這份文件好處是為什麼要這樣做的理由都告訴你了。 裡面有提到 Avoid Embedding Types in Public Structs, 給的理由是 These embedded types leak implementation details, inhibit type evolution, and obscure documentation. 簡單的說就是 exported fields & struct methods 會被一併公開, 以及修改被嵌入的 struct 會影響所有有嵌入它的 struct, 造成可能的同名 field 及 method 衝突,製造修改衍生 struct 的困擾。 -- 那如果因為一些技術限制不能改寫 interface 也不能用 embed struct 呢? 最後的大招是用 reflect,寫起來太醜我不想寫, 如果寫到要用 reflect 那你有 99% 的可能寫錯了。 這邊還是稍微提一下作法。 用 reflect 你可以判斷傳進來的是 slice, array, struct, 接著可以再去讀它有的 field name,進而去存取該 field 的值。 為什麼這個寫法常常是錯的呢?因為它效能不太好。 在上述兩種方法前,reflect 常常會是最終不得已採用的解法。 一般常見用到 reflect 的寫法有... gorm... 又是你... https://github.com/go-gorm/gorm/blob/v1.24.5/schema/schema.go#L79 因為 gorm 幾乎所有操作都是用 interface{} 去接, 所以它只能長成 reflect 的那種樣子。 可以的話用 interface, type assertion 去做,不要用 reflect。 除了效能會受影響外,它還很難讀。 除此之外,還有些 assetion/mock libraries 會用到 reflect。 但那也是無可厚非,因為它不知道使用者會傳什麼 type 進來, 也沒辦法用 interface 定義,不然為了寫測試真的要萬物 interface 了。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.91.34.68 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Programming/M.1675867654.A.09F.html ※ 編輯: s25g5d4 (219.91.34.68 臺灣), 02/08/2023 22:51:15 ※ 編輯: s25g5d4 (219.91.34.68 臺灣), 02/08/2023 22:54:21
1F:→ s25g5d4: 寫完才發現是去年 9 月的文... orz 219.91.34.68 02/08 22:58
2F:推 CoNsTaR: 趕快支援 dependent types 啊,就不用這 174.112.12.38 02/09 01:53
3F:→ CoNsTaR: 麼麻煩了 174.112.12.38 02/09 01:53
4F:推 zxcchiou: 推推 願意給解法 60.250.229.175 02/21 11:08
5F:推 liu2007: 太麻煩了不想寫,還是寫一下好了,這是傲 49.217.197.84 03/03 10:34
6F:→ liu2007: 嬌嗎XD 49.217.197.84 03/03 10:34
7F:→ s25g5d4: 沒有啊,我只有提作法沒給範例 219.91.34.68 03/04 00:49







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP