精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Gopher 需要知道的幾個結構體騷操作

開發 后端
我們知道 Go 沒有繼承的概念,接口結構體多使用組合,很多開源產品或是源代碼都有大量的內嵌 (embeded field) 字段,用于特殊目的。

[[440247]]

本文轉載自微信公眾號「董澤潤的技術筆記」,作者董澤潤。轉載本文請聯系董澤潤的技術筆記公眾號。

我們知道 Go 沒有繼承的概念,接口結構體多使用組合,很多開源產品或是源代碼都有大量的內嵌 (embeded field) 字段,用于特殊目的

NoCopy

  1. package main 
  2.  
  3. import ( 
  4.  "sync" 
  5.  
  6. func test(wg sync.WaitGroup) { 
  7.  defer wg.Done() 
  8.  wg.Add(1) 
  9.  
  10. func main() { 
  11.  var wg sync.WaitGroup 
  12.  wg.Add(1) 
  13.  go test(wg) 
  14.  wg.Wait() 

這是非常經典的 case, 程序執行報錯 all goroutines are asleep - deadlock!, 解決也很簡單,把 wg 由值傳遞變成指針類型即可。本質是 WaitGroup 內部維護了計數,不允許 copy 變量,還有 sync.Mutex 鎖也是不允許 copy 的

解決辦法很簡單,需要 CI 時由 linter 檢測出來,最好運行時也能有檢測機制,這方面的討論請參考issue 8005[1]

  1. zerun.dong$ go vet aaa.go 
  2. # command-line-arguments 
  3. ./aaa.go:7:14: test passes lock by value: sync.WaitGroup contains sync.noCopy 
  4. ./aaa.go:15:10: call of test copies lock value: sync.WaitGroup contains sync.noCopy 

這是 go vet 結果,報錯己經很明顯了

  1. type noCopy struct{} 

noCopy 定義非常簡單,空結構體,zero size 不占用空間(前提是非結構體的最后一個字段,否則還要是有 8 byte 空間開銷)

sync.WaitGroup[2] 內嵌 noCopy 字段,防止 Cond 變量被復制

  1. type WaitGroup struct { 
  2.  noCopy noCopy 
  3.  
  4.  // 64-bit value: high 32 bits are counter, low 32 bits are waiter count
  5.  // 64-bit atomic operations require 64-bit alignment, but 32-bit 
  6.  // compilers only guarantee that 64-bit fields are 32-bit aligned. 
  7.  // For this reason on 32 bit architectures we need to check in state() 
  8.  // if state1 is aligned or notand dynamically "swap" the field order if 
  9.  // needed. 
  10.  state1 uint64 
  11.  state2 uint32 

上面是 sync.WaitGroup 結構體的定義,同時注意 noCopy 是源碼中不可導出的定義。如果用戶代碼也想實現 NoCopy 呢?可以參考 grpc DoNotCopy[3]

  1. // DoNotCopy can be embedded in a struct to help prevent shallow copies. 
  2. // This does not rely on a Go language feature, but rather a special case 
  3. // within the vet checker. 
  4. type DoNotCopy [0]sync.Mutex 

非常簡單,Mutex 零長數組,不占用空間。由于 vet checker 會檢測 Mutex,相當于替我們實現了 noCopy 功能

DoNotCompare

Golang Sepc Comparison_operators[4] 官方文檔描述常見類型比較運算( == != > < <= >=)的結果,詳細內容看官方文檔 https://go.dev/ref/spec#Comparison_operators

  • In any comparison, the first operand must be assignable to the type of the second operand, or vice versa.
  • The equality operators == and != apply to operands that are comparable. The ordering operators <, <=, >, and >= apply to operands that are ordered.
  • Struct values are comparable if all their fields are comparable. Two struct values are equal if their corresponding non-blank fields are equal.
  • Slice, map, and function values are not comparable. However, as a special case, a slice, map, or function value may be compared to the predeclared identifier nil. Comparison of pointer, channel, and interface values to nil is also allowed and follows from the general rules above.

對于 struct 來講,只有所有字段全部 comparable 的(不限大小寫是否導出),那么結構體才可以比較。同時只比較 non-blank 的字段,舉個例子:

  1. type T struct { 
  2.     name string 
  3.     age int 
  4.     _ float64 
  5. func main() { 
  6.    x := [...]float64{1.1, 2, 3.14} 
  7.    fmt.Println(x == [...]float64{1.1, 2, 3.14}) // true 
  8.    y := [1]T{{"foo", 1, 0}} 
  9.    fmt.Println(y == [1]T{{"foo", 1, 1}}) // true 

運行后,結果均為 true

Slice, Map, Function 均是不可比較的,只與判斷是否為 nil. 所以我們可以利用這兩個特性,內嵌函數來實現不可比較,參考 protobuf DoNotCompare[5]

  1. // DoNotCompare can be embedded in a struct to prevent comparability. 
  2. type DoNotCompare [0]func() 

如果比較會報錯

  1. type DoNotCompare [0]func() 
  2.  
  3. type T struct { 
  4.     name string 
  5.     age int 
  6.     DoNotCompare 
  7. func main() { 
  8. // ./cmp.go:13:21: invalid operation: T{} == T{} (struct containing DoNotCompare cannot be compared) 
  9.     fmt.Println(T{} == T{}) 

NoUnkeyedLiterals

結構體初始化有兩種:指定字段名稱,或者按順序列出所有字段,不指定名稱

  1. type User struct{ 
  2.     Age int 
  3.     Address string 
  4.  
  5. u := &User{21, "beijing"

這樣寫的問題非常大,如果新增字段會不兼容

  1. type User struct{ 
  2.     Age int 
  3.     Address string 
  4.     Money int 
  5.  
  6. func main(){ 
  7. // ./struct.go:11:15: too few values in User{...} 
  8.   _ = &User{21, "beijing"

上面的例子,能在編譯期報錯還是可接受的,如果同類型的調換順序,那才叫坑爹... 所以這時需要 NoUnkeyedLiterals[6]

  1. // NoUnkeyedLiterals can be embedded in a struct to prevent unkeyed literals. 
  2. type NoUnkeyedLiterals struct{} 

很簡單,就是一個空結構體,這是 Protobuf 的實現。很多時候我們都用空的結構體占位符實現

  1. type User struct{ 
  2.     _ struct{} 
  3.     Age int 
  4.     Address string 
  5.  
  6. func main(){ 
  7. // ./struct.go:10:11: cannot use 21 (type intas type struct {} in field value 
  8. // ./struct.go:10:15: cannot use "beijing" (type untyped string) as type int in field value 
  9. // ./struct.go:10:15: too few values in User{...} 
  10. _ = &User{21, "beijing"

報錯很明顯了,字段類型不匹配,有人會說初始化寫上 struct{} 不就可以了?

  1. _ = &User{struct{}{}, 21, "beijing"

這樣確實可以工作,但是占位符 _ 的字段是不可導出的,所以 import 其它包的 NoUnkeyedLiterals 結構體同樣會報錯

Copier 庫

最后推薦一個非常實用的 copier[7] 庫,CRUD Boy 經常結構體轉來轉去的,比如 dto, dao 互轉,或是 dao 與其它互轉,如果修改了 dao 結構體,還要記得修改其它轉換邏輯,非常繁瑣

  1. package main 
  2. import ( 
  3.   "fmt" 
  4.   "github.com/jinzhu/copier" 
  5.  
  6. type User struct { 
  7.   Name string 
  8.   Age  int 
  9.  
  10. type Employee struct { 
  11.   Name string 
  12.   Age  int 
  13.   Role string 
  14.  
  15. func main() { 
  16.   user := User{Name"dj", Age: 18} 
  17.   employee := Employee{Role: "admin"
  18.  
  19.   copier.Copy(&employee, &user
  20.   // main.Employee{Name:"dj", Age:18, Role:"admin"
  21.   fmt.Printf("%#v\n", employee) 

打印 Employee 發現 name, age 字段己經賦值了,非常好用。感興趣的可以查看官網,支持非常多的高級玩法

注意:這里是隱式的,有人偏好所有字段顯示賦值,大家怎么看?

 

責任編輯:武曉燕 來源: 董澤潤的技術筆記
相關推薦

2025-03-25 10:49:13

2019-12-11 09:23:51

JavaScriptHTMLXML

2017-04-13 10:08:30

軟件開發開發

2023-01-20 11:51:40

性能測試系統

2022-04-29 09:00:00

Platform架構內核線程

2022-08-10 09:03:35

TypeScript前端

2018-09-10 09:26:33

2011-09-20 10:56:35

云計算PaaS

2016-09-08 14:40:44

2021-01-11 18:33:07

云原生

2020-03-27 12:30:39

python開發代碼

2014-07-31 17:13:50

編碼程序員

2023-08-16 15:57:53

2020-03-03 14:35:34

LinuxRedis命令

2024-06-04 16:51:11

2009-06-30 13:00:30

JSP入門

2018-05-30 15:15:47

混合云公共云私有云

2019-10-23 10:36:46

DevSecOpsDevOps

2017-11-14 13:48:26

數據結構學習

2024-01-22 11:34:08

點贊
收藏

51CTO技術棧公眾號

欧美 日本 亚洲| www.欧美精品一二三区| 日韩久久久久久久久久久久| 亚洲最大成人在线视频| 久久国产电影| 欧美日高清视频| 亚洲国产精品久久久久久女王| 中文字幕av久久爽| 亚洲色图国产| 亚洲成人精品久久| 日本wwwcom| 污视频网站免费观看| 亚洲高清久久| 亚洲欧美日韩网| 日本一本二本在线观看| 午夜视频在线观看免费视频| 国产一区二区精品久久99| 色中色综合影院手机版在线观看 | 一女二男3p波多野结衣| 国产激情在线| 99久久国产综合精品女不卡| 国产精品video| 国产又黄又爽又无遮挡| 欧美日日夜夜| 色激情天天射综合网| 天堂一区二区三区 | 在线播放蜜桃麻豆| 91免费观看视频| 国产日韩欧美黄色| 激情综合网五月婷婷| 亚洲大片精品免费| 欧美一区二区三区四区视频| 日韩中文字幕三区| av片哪里在线观看| 久久免费午夜影院| 92福利视频午夜1000合集在线观看| 日韩 欧美 中文| 一区二区三区网站| 亚洲午夜女主播在线直播| 久久国产免费视频| 范冰冰一级做a爰片久久毛片| 1024国产精品| 日韩偷拍一区二区| 亚洲精品国偷拍自产在线观看蜜桃| 首页亚洲欧美制服丝腿| 中文字幕亚洲综合久久| 白嫩情侣偷拍呻吟刺激| 美女久久久久久| 色综合久久88色综合天天6| 国产成人亚洲综合无码| 天堂网av2014| 成人在线视频一区二区| 国产日韩在线精品av| 久久综合色综合| 亚洲天堂免费| www.xxxx欧美| 国产高清视频免费在线观看| 深爱激情综合| 亚洲精品乱码久久久久久金桔影视 | 国产午夜精品久久久久久久久| 欧美一区自拍| 777a∨成人精品桃花网| 黄色影院一级片| 精品三级久久久久久久电影聊斋| 国产精品一区二区黑丝| 国产欧亚日韩视频| 波多野结衣视频免费观看| 欧美成人一区二免费视频软件| 亚洲成人中文字幕| 美国黄色a级片| 国产一区日韩| 精品国产91亚洲一区二区三区婷婷 | 永久免费看mv网站入口78| 国产乱码精品一区二区三区亚洲人| 激情亚洲一区二区三区四区| 无码专区aaaaaa免费视频| 极品视频在线| 欧美丝袜一区二区三区| 成人在线观看黄| 久久久久久久性潮| 欧美一区二区三区在线视频| www.com久久久| 欧美高清xxx| 欧美日韩国产高清一区| 中文字幕avav| 妖精视频一区二区三区免费观看 | 国产一区二区三区四区hd| 亚洲精选国产| 日韩最新在线视频| av黄色在线免费观看| 欧美成人直播| 亚洲男人的天堂网站| 五月婷婷欧美激情| 日韩电影在线视频| 中文字幕亚洲精品| 午夜剧场免费在线观看| 国产精品入口| 91免费人成网站在线观看18| 国产特级aaaaaa大片| 99热精品一区二区| 婷婷四月色综合| 男人和女人做事情在线视频网站免费观看| 国产免费成人在线视频| 波多野结衣 作品| 在线视频cao| 欧美一区二区日韩| 91网站免费入口| 亚洲精品国产首次亮相| 久久亚洲精品一区二区| 国产精品美女久久久久av爽| 狠狠久久亚洲欧美| 国产一级二级三级精品| 麻豆网站在线免费观看| 亚洲国产精品久久一线不卡| 天天操天天干天天做| 香蕉久久夜色精品国产使用方法 | 亚洲aⅴ日韩av电影在线观看| 天堂91在线| 日韩精品导航| 亚洲系列中文字幕| 国产一级特黄a高潮片| 日本成人在线一区| 国产区一区二区| 黄色av电影在线播放| 亚洲综合一二区| 国产成人无码一二三区视频| 日韩激情欧美| 日韩视频一区在线观看| 亚洲精品第二页| 成人中文在线| 91成人性视频| 特黄aaaaaaaaa真人毛片| 亚洲男人天堂av| 一本一道久久a久久综合蜜桃| 国产福利资源一区| 亚洲网站在线播放| 久久精品这里有| 国产成人8x视频一区二区| 在线码字幕一区| 国产综合色激情| 在线日韩欧美视频| 欧美成人一区二区视频| 久久精品夜色噜噜亚洲a∨| 欧美综合在线播放| 大陆精大陆国产国语精品| 久久影视电视剧免费网站清宫辞电视| а中文在线天堂| fc2成人免费人成在线观看播放 | 99精品国产在热久久| 51国产成人精品午夜福中文下载 | 日韩在线观看免费高清| 亚洲精品毛片一区二区三区| 国产日产欧美一区| 久久网站免费视频| 日日天天久久| 性欧美xxxx交| 青青草观看免费视频在线| 婷婷中文字幕综合| 精品人妻一区二区三区香蕉| 亚洲大胆在线| 久久免费99精品久久久久久| 成人福利视频| 日韩国产在线播放| 国产成人精品片| 久久蜜桃香蕉精品一区二区三区| 欧美久久久久久久久久久久久| 青青视频一区二区| 秋霞午夜一区二区| 久青青在线观看视频国产| 自拍偷自拍亚洲精品播放| www.欧美激情.com| 在线看片成人| 精品久久久久久乱码天堂| heyzo高清在线| 亚洲乱码av中文一区二区| 日本一区二区三区免费视频| 99精品国产热久久91蜜凸| 国产a级片网站| 深爱激情综合| 91精品视频在线看| 色开心亚洲综合| 精品人伦一区二区色婷婷| 日韩av免费网址| 国产欧美一区二区三区网站| 欧美激情第四页| 男人的天堂亚洲| 欧美日韩无遮挡| 疯狂欧洲av久久成人av电影| 在线观看久久久久久| 国产夫绿帽单男3p精品视频| 天天操天天干天天综合网| 国内精品国产三级国产aⅴ久| 99精品欧美| 亚洲砖区区免费| 国产精品成人**免费视频| 日韩资源在线观看| 日韩一级片免费在线观看| 精品视频免费在线| 国产第一页第二页| 久久久久久夜精品精品免费| 欧美丝袜在线观看| 亚洲一区视频| 欧美少妇在线观看| 欧美中文一区| 成人在线免费观看一区| 香蕉成人av| 久久精品国产精品| 暖暖视频在线免费观看| 一本一道综合狠狠老| 九九视频免费在线观看| 日本一区二区三区dvd视频在线| 免费在线观看日韩av| 久久99久久久久| 久久久久久久久久久久久国产精品| 欧美99久久| 亚洲午夜在线观看| 欧美日韩一本| 国产精品区一区二区三在线播放 | 国产精选在线观看91| 午夜影院免费在线| 亚洲欧美激情四射在线日| 亚洲天堂中文字幕在线| 色综合久久综合网欧美综合网 | 成人黄色免费看| 交100部在线观看| 久久精品免费电影| 国产福利免费在线观看| 欧美成人video| 国产精品无码在线播放 | 国产欧美日韩网站| 清纯唯美亚洲综合一区| 玛丽玛丽电影原版免费观看1977 | 日韩av综合网| 黑人精品一区二区三区| 3atv在线一区二区三区| 一级片视频网站| 欧美日韩免费不卡视频一区二区三区 | 亚洲二区三区不卡| 亚州欧美一区三区三区在线| 国产精品免费不| 欧美亚洲精品日韩| 午夜精品福利影院| 91在线在线观看| 妞干网免费在线视频| 久久精品国产一区二区三区| 好男人免费精品视频| 亚洲国产精品网站| 国产伦理一区二区| 欧美日本在线看| 波多野结衣电影在线播放| 岛国av在线不卡| 偷偷操不一样的久久| 亚洲精品国产视频| 国产精品国产精品88| 国产精品久久久久久福利一牛影视| 涩视频在线观看| 99热在这里有精品免费| www.自拍偷拍| 国产一区二区在线视频| 韩国一区二区在线播放| 日韩成人免费电影| caoporm在线视频| 日韩国产成人精品| 欧美日韩大尺度| 久久xxxx| 成人黄色一级大片| 日韩av高清在线观看| 中文字幕第100页| 国产乱人伦偷精品视频不卡| 日本黄色大片在线观看| 国产丶欧美丶日本不卡视频| 小早川怜子一区二区三区| 国产精品香蕉一区二区三区| 无码人妻一区二区三区在线| 国产suv一区二区三区88区| 男人的天堂影院| 久久综合九色综合97婷婷| 人妻aⅴ无码一区二区三区| 国产精品久久久久毛片软件| 欧美片一区二区| 色综合天天综合狠狠| 91久久久久国产一区二区| 欧美一区二区三区在线看| 涩涩视频免费看| 精品中文字幕久久久久久| 九九在线视频| 久久久久国产精品| 欧美一区二区三区播放老司机| 丰满人妻一区二区三区免费视频| 欧美成人官网二区| 天堂中文字幕在线| 国产一区二区三区日韩欧美| 国产福利在线视频| 欧美大片va欧美在线播放| 欧美aa在线观看| 国产精品久久久精品| 999精品嫩草久久久久久99| 国产在线欧美日韩| 超碰成人久久| 成人一区二区av| 日韩中文欧美在线| www.四虎精品| av一区二区久久| 性生交大片免费全黄| 国产精品水嫩水嫩| 91视频综合网| 黑人巨大精品欧美一区二区一视频| 亚洲精品成人在线视频| 91精品午夜视频| 亚欧洲精品视频| 久久精品99久久香蕉国产色戒| 国产高清视频在线观看| 久久综合网hezyo| 91精品产国品一二三产区| 日韩美女主播视频| 国产黄大片在线观看| 国产精品电影一区| 日韩毛片免费视频一级特黄| 精品欧美国产| 日韩国产欧美一区二区| 国产午夜伦鲁鲁| 激情五月婷婷综合| 久久精品无码一区| 一区二区三区中文在线观看| 一区二区自拍偷拍| 亚洲精品国产精品自产a区红杏吧| 精品黄色免费中文电影在线播放| 国产suv精品一区二区| 91精品啪在线观看国产爱臀| 国产精品免费视频一区二区| 欧美在线网址| 岛国av免费在线| 国产精品免费久久| 中文字幕天堂在线| 亚洲人成网站免费播放| 伊人春色在线观看| 成人福利在线视频| 欧美一区二区三| 性生交免费视频| 国产婷婷色一区二区三区四区| 国产精品午夜影院| 欧美日韩亚洲高清| 国产按摩一区二区三区| 日韩日本欧美亚洲| 日韩av懂色| 国产系列第一页| 久久99精品国产91久久来源| 久久国产精品无码一级毛片 | 亚洲va国产天堂va久久en| 国产黄色片网站| 九九九久久久久久| 日韩中文字幕在线一区| 97av中文字幕| 国产成人精品综合在线观看| 青青草手机在线视频| 日韩一区二区电影在线| 搞黄网站在线看| 国产一区二区不卡视频| 亚洲一区国产| 午夜在线观看一区| 欧美日韩一区二区在线观看| 狠狠狠综合7777久夜色撩人| 国产成人福利网站| 久久国产电影| 红桃视频 国产| 亚洲尤物视频在线| 天天操天天爱天天干| 国产成人福利视频| 精品国精品国产自在久国产应用| 国产日韩亚洲欧美在线| 99久久精品国产导航| 国产一级生活片| 国产丝袜一区二区三区免费视频| 日韩电影av| 蜜桃精品久久久久久久免费影院 | 亚洲综合自拍偷拍| 亚洲欧美日韩免费| 国产精品激情av在线播放| 久久久久久久久99精品大| 又大又长粗又爽又黄少妇视频| 亚洲一区二区欧美激情| 免费在线毛片| 成人激情视频在线播放| 亚洲大片在线| av黄色在线免费观看| 91精品国产综合久久精品图片| 99爱在线观看| 免费久久一级欧美特大黄| 日本不卡视频一二三区| 69av视频在线| 国产网站欧美日韩免费精品在线观看| 亚洲精品555| 超碰超碰超碰超碰超碰| 91在线视频观看| 懂色av蜜臀av粉嫩av喷吹| 欧美裸体xxxx极品少妇| 久久99国产精品视频| 人妻精油按摩bd高清中文字幕| 黑人精品xxx一区一二区| av在线免费网站|