精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲图片欧美色图| 日本vs亚洲vs韩国一区三区二区 | 91亚洲国产成人精品一区| 成人婷婷网色偷偷亚洲男人的天堂| 欧美精品在线一区二区三区| 在线视频91| 五月婷婷丁香花| 极品少妇xxxx偷拍精品少妇| 97视频在线观看播放| 大胸美女被爆操| 国产厕拍一区| 欧美日韩国产电影| www在线观看免费| 日本免费中文字幕在线| 成人黄色网址在线观看| 国产精品无码专区在线观看| 日韩欧美激情视频| 伊人色**天天综合婷婷| 亚洲免费小视频| 佐山爱在线视频| 99久久er| 色婷婷综合视频在线观看| 国产小视频免费| 3p在线观看| 久久久久久麻豆| 国产伦精品一区二区三区视频免费 | 日韩一区二区三区在线观看视频| 久久精品国产亚洲a| 欧美在线视频一二三| 激情五月婷婷在线| 99欧美视频| 在线观看久久久久久| 六十路息与子猛烈交尾| 91精品短视频| 91精品久久久久久久久99蜜臂| 少妇激情一区二区三区| 亚洲国产欧美日本视频| 午夜欧美在线一二页| 大陆极品少妇内射aaaaaa| 日韩在线免费电影| 日本一区二区三区高清不卡| 欧美日韩免费观看一区| 天天操天天干天天干| 国产福利一区在线观看| 51午夜精品| 国产精品久久久久久久成人午夜| 男女激情视频一区| 国产精品国产三级国产aⅴ9色| 日本特级黄色片| 国产女优一区| 青青草成人在线| 国产成人无码精品亚洲| 国产视频一区三区| 91av在线影院| 五月天激情国产综合婷婷婷| 美女网站久久| 国产精品电影观看| 中文字幕一区二区三区人妻四季 | 中文字幕第66页| 欧美久久一区二区三区| 欧美大片国产精品| 天天躁日日躁狠狠躁av麻豆男男| 波多野结衣在线一区二区 | 91人人澡人人爽| 98视频精品全部国产| 精品久久久久久久久久久久久久久 | 香蕉精品视频在线| 欧美jizzhd欧美| 亚洲人成在线观看一区二区| 欧美与动交zoz0z| 四虎av在线| 亚洲成人av资源| 国产黄色一级网站| 先锋欧美三级| 欧美一区二区三区在线电影| 日韩女优在线视频| 黄色欧美网站| 在线观看久久av| 国产一二三四区| 亚洲高清久久| 日本老师69xxx| 91精品国产综合久| 国产成人综合亚洲网站| 黄色国产精品一区二区三区| 成人高清网站| 亚洲一区二区不卡免费| 欧美少妇性生活视频| 91精品一区| 亚洲精品一区二区三区精华液| 91久久免费视频| 婷婷综合网站| 2019最新中文字幕| 91丨porny丨在线中文 | 欧洲美女和动交zoz0z| 爱情岛论坛亚洲品质自拍视频网站| 色综合久久综合网欧美综合网 | 日韩视频亚洲视频| 黄色小视频在线免费看| 日本成人中文字幕| 国产传媒一区二区| 91在线视频免费看| 婷婷久久综合九色综合伊人色| 国产又黄又猛又粗又爽的视频| 欧美视频二区欧美影视| 夜夜嗨av色综合久久久综合网| 欧美又粗又大又长| 久久激情久久| 国产精品一区二区不卡视频| 91在线网址| 色综合一区二区三区| 人妻精油按摩bd高清中文字幕| 国产影视精品一区二区三区| 欧美交受高潮1| 91国在线视频| 国产欧美精品区一区二区三区 | 最新日韩三级| 精品久久久久久久久久久久久久久 | 欧美色图一区| 91wwwcom在线观看| 亚洲av综合色区无码一二三区| 国产精品天天看| 中国丰满人妻videoshd| 亚洲伊人影院| 欧美成人精品影院| 在线观看免费中文字幕| 99v久久综合狠狠综合久久| 夜夜爽99久久国产综合精品女不卡 | 欧美日韩高清影院| 中文字幕第4页| 麻豆亚洲精品| 免费日韩av电影| а√天堂8资源中文在线| 日韩一卡二卡三卡国产欧美| 日本 欧美 国产| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩中文国产一区发布| 国产夫妻在线| 亚洲国产成人精品电影| 久久久无码精品亚洲国产| 黑人巨大精品欧美一区| 一区国产精品| yy6080久久伦理一区二区| 国产亚洲欧洲黄色| 欧美国产一级片| 欧美高清在线精品一区| 九热视频在线观看| 日韩免费在线| 成人免费在线网址| 久久综合之合合综合久久| 欧美精品色一区二区三区| 四虎影视1304t| 狠狠色丁香久久婷婷综合丁香| 热这里只有精品| 欧美在线在线| 欧美激情久久久久| 亚洲狼人综合网| 五月天精品一区二区三区| 日本japanese极品少妇| 亚洲伦伦在线| 欧美日韩精品免费在线观看视频| 精品欧美一区二区三区在线观看 | 亚洲一区二区四区| 欧美日韩伦理一区二区| 久久天天躁狠狠躁夜夜躁2014| 国产视频手机在线| 亚洲伊人色欲综合网| 日韩综合第一页| 裸体一区二区| 亚洲一区二区三区四区中文| 亚洲一区二区三区在线免费| 91av在线免费观看| 91美女视频在线| 日韩亚洲欧美高清| 日韩污视频在线观看| 久久久精品tv| 中文字幕55页| 99精品免费视频| 日韩在线电影一区| 老司机亚洲精品一区二区| 久久久久久国产精品| 青草久久伊人| 7777精品伊人久久久大香线蕉的 | 亚洲精品国产精品国自产观看浪潮| 国产精品视频久久久久久久| 国产精品久久久久永久免费观看 | 日韩免费在线观看视频| 久cao在线| 精品视频久久久久久久| 亚洲无码精品国产| 午夜久久久影院| 在线观看免费黄色网址| 成人国产一区二区三区精品| 免费看国产黄色片| 国产精品99免费看| 午夜老司机精品| 99亚洲乱人伦aⅴ精品| 国产成人jvid在线播放| 精品国产丝袜高跟鞋| 亚洲精品久久久久国产| 国产精品无码专区av免费播放| 欧美性xxxxxxx| 超碰手机在线观看| 日本一区二区三区四区| 在线免费看黄色片| 国内成+人亚洲+欧美+综合在线 | 精品午夜久久福利影院| 中国丰满人妻videoshd| 黑丝一区二区| 亚洲制服中文| 国产一区二区观看| 国产伦精品一区二区三区视频免费 | 欧美视频一区| 一区二区三区四区视频在线| 亚洲欧美成人vr| 不卡视频一区二区| 中文字幕成人| 国产精品久久久久国产a级| 黄色漫画在线免费看| 精品中文字幕在线2019| 色影视在线观看| 亚洲女人被黑人巨大进入al| 男人天堂一区二区| 日韩午夜小视频| 国产精品久久久久久免费播放| 91福利在线看| 亚洲综合图片网| 午夜久久久影院| 久久高清免费视频| 亚洲mv在线观看| 久久高清无码视频| 亚洲精品成人精品456| 日本 欧美 国产| 中文字幕一区二区视频| 天天摸日日摸狠狠添| 国产日产亚洲精品系列| 久操视频免费看| 久久久久一区二区三区四区| 亚洲中文字幕无码一区| 大陆成人av片| 在线精品视频播放| 成人小视频在线| www.555国产精品免费| 成人国产精品免费观看动漫| 岛国大片在线免费观看| 成人免费三级在线| 91精品啪在线观看国产| 白白色 亚洲乱淫| 免费无码一区二区三区| 99久久伊人网影院| 国产夫妻性爱视频| 久久久亚洲欧洲日产国码αv| 亚洲天堂网一区二区| 久久视频一区二区| 亚洲国产天堂av| 国产精品久久二区二区| 日韩成人短视频| 亚洲综合免费观看高清在线观看| 久久高清无码视频| 欧美日韩另类视频| 免费看污视频的网站| 欧美私模裸体表演在线观看| 在线观看毛片av| 日韩欧美在线网站| 欧美一级淫片免费视频魅影视频| 亚洲国产欧美精品| 黄色av网址在线免费观看| 日韩中文字幕亚洲| 日韩影视在线| 热99精品只有里视频精品| 国产成人亚洲一区二区三区| 成人国产精品久久久久久亚洲| 日韩一区二区三区精品| 精品午夜一区二区| 欧美日韩中文一区二区| 日本道在线视频| 国产亚洲精品久久久久婷婷瑜伽| 亚欧在线免费观看| 国产一区视频在线看| 中文字幕无码人妻少妇免费| 久久精品男人天堂av| 潘金莲一级黄色片| 亚洲国产日韩a在线播放| 精品国产xxx| 欧美高清性hdvideosex| 嫩草影院一区二区| 国产午夜精品全部视频播放| av毛片在线播放| 欧美最顶级丰满的aⅴ艳星| 99精品视频在线免费播放 | 性一交一乱一精一晶| 亚洲欧美日韩视频一区| 韩国中文字幕在线| 欧美在线亚洲在线| 精品中文字幕一区二区三区| 久久久婷婷一区二区三区不卡| 久久一本综合| 男女激情无遮挡| 国产一区二区不卡| av网站免费在线看| 亚洲国产中文字幕在线视频综合| 欧美成人精品网站| 欧美精品一区二区三区蜜桃视频| 98在线视频| 欧美最猛性xxxx| 2020国产精品极品色在线观看| 日本一区免费在线观看| 亚洲天堂男人| 成年人网站av| 国产精品丝袜黑色高跟| www.毛片.com| 日韩欧美国产三级| 男人的天堂在线视频免费观看| 欧美亚洲国产日本| 日韩一二三区| japanese在线视频| 免费观看日韩av| 在线不卡av电影| 午夜精品久久久久| www.av黄色| 久久伊人色综合| 久久亚洲国产精品尤物| 欧美一区二区福利| 99精品福利视频| 不许穿内裤随时挨c调教h苏绵| 亚洲色图.com| 国产一区二区三区三州| 在线观看欧美日韩国产| 欧美最新精品| 欧美日韩精品久久| 久久激情一区| 波多野结衣av在线观看| 色哟哟一区二区在线观看| 日韩a级作爱片一二三区免费观看| 久久久免费精品| 综合中文字幕| a级黄色片免费| 国产乱子伦视频一区二区三区 | 岛国av一区二区| 欧美自拍偷拍第一页| 欧美激情在线狂野欧美精品| jizz久久久久久| 亚洲一卡二卡| 久久99热国产| 久久福利免费视频| 91麻豆精品91久久久久同性| 麻豆tv入口在线看| 成人免费网视频| 在线成人激情| 四川一级毛毛片| 亚洲综合久久久久| 成人爽a毛片一区二区| 久久久久国产视频| 欧美三级午夜理伦三级小说| 少妇高潮毛片色欲ava片| 99re视频精品| 69xxxx国产| 日韩在线欧美在线| 国产精久久一区二区| 日韩欧美猛交xxxxx无码| 成人免费毛片片v| 国产99久久久| 中文字幕一区二区精品| 国产精品亚洲综合在线观看| 男同互操gay射视频在线看| 国产电影一区二区三区| 国产午夜精品无码一区二区| 日韩成人在线网站| yy6080久久伦理一区二区| 午夜久久久久久久久久久| 成人一级片在线观看| 免费观看成人毛片| 中文字幕日韩精品在线观看| 欧美专区一区| 国产在线观看福利| 国产精品国产三级国产专播品爱网| 国产三区在线播放| 国内精品久久久久久| 国产最新精品| 亚洲国产综合av| 日韩人在线观看| 亚洲区欧洲区| 欧美极品日韩| 国产麻豆日韩欧美久久| 日本最新中文字幕| 综合av色偷偷网| 国产成人一二片| 无限资源日本好片| 亚洲国产一区二区在线播放| 国产美女性感在线观看懂色av | 成人羞羞在线观看网站| 日韩大尺度视频| 日本高清免费不卡视频| 91麻豆一二三四在线| 奇米视频888战线精品播放| 国产一区二区精品久久99| 性色av免费观看| 欧美激情亚洲自拍| 成人羞羞在线观看网站| 波多野结衣办公室33分钟| 欧美一级黄色大片|