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

Go1.18 快訊:新的 IP 包

開發 后端
Go 1.18 標準庫新增了一個包:net/netip,大部分人可能用不上這個包,但這個包的設計思路以及和現有標準庫 IP 的比較值得學習。

[[438246]]

本文轉載自微信公眾號「polarisxu」,作者站長polaris 。轉載本文請聯系polarisxu公眾號。

大家好,我是 polarisxu。

Go 1.18 標準庫新增了一個包:net/netip,大部分人可能用不上這個包,但這個包的設計思路以及和現有標準庫 IP 的比較值得學習。

01 標準庫 net.IP 的問題

前 Go Team 成員之一 Brad Fitzpatrick 加入 Tailscale[1] 后,經常需要操作 IP 地址。因為使用 Go 語言實現的,自然會使用過標準庫的 net.IP 和 net.IPNet 等類型。但他們認為標準庫的相關類型有很多問題,所以他們自己寫了一個包:https://github.com/inetaf/netaddr。

早在 2017 年 1 月,Brad Fitzpatrick 就提了 issue,認為 net.IP 的設計存在問題:https://github.com/golang/go/issues/18804,那時他還在 Go Team。

具體來說,net.IP 存在如下幾個問題:

  • 可變的。net.IP 的底層類型是 []byte,它的定義是:type IP []byte,這意味著你可以隨意修改它。不可變數據結構更安全、更簡單。
  • 不可比較的。因為 Go 中 slice 類型是不可比較的,也就是說 net.IP 不支持 ==,也不能作為 map 的 key。
  • 有兩個 IP 地址類型,net.IP 表示基本的 IPv4 或 IPv6 地址,而 net.IPAddr 表示支持 zone scopes 的 IPv6。因為有兩個類型,使用時就存在選擇問題,到底使用哪個。標準庫存在兩個這樣的方法:Resolver.LookupIP vs Resolver.LookupIPAddr。(關于什么是 IPv6 zone scopes 見維基百科:https://en.wikipedia.org/wiki/IPv6_address#Scoped_literal_IPv6_addresses_(with_zone_index 。)
  • 太大。在 Go 中,64 位機器上,slice 類型占 24 個字節,這只是 slice header。因此,net.IP 的大小實際包含兩部分:24 字節的 slice header 和 4 或 6 字節的 IP 地址。而 net.IPAddr 更有額外的字符串類型 Zone 字段,占用空間更多。
  • 不是 allocates free 的,會增加 GC 的工作。當你調用 net.ParseIP 或接收一個 UDP 包時,它為了記錄 IP 地址會分配底層數組的內存,然后指針放入 net.IP 的 slice header 中。
  • 當解析一個字符串形式的 IP 地址時,net.IP 無法區分 IPv4 映射的 IPv6 地址[2]和 IPv4 地址。因為 net.IP 不會記錄原始的地址族(address family)。見 issue 37921[3]
  • 它是一種透明類型(transparent type)。因為它的定義是:type IP []byte,底層類型是一個字節切片。這有什么問題呢?我們沒法改變 IP 的底層類型了,因為它已經是導出 API 的一部分。標準庫中一個很好的例子是 time.Time 類型,它是一個不透明類型:type Time struct { /* unexported */ },也就是里面有什么沒公開,這樣庫作者可以隨便修改里面的內容,只需要保證導出 API 不變即可。實際上 Go1.9 就改過一次 time.Time 的內部結構,完全不會破壞兼容性。

但為了兼容性,以上這些問題沒法通過改進 net.IP 類型解決。于是才有了 Brad Fitzpatrick 上面開發的包。該包已經正式合入 Go1.18 標準庫中,這就是 net/netip 包,這里可以查看包文檔:https://pkg.go.dev/net/netip@master。

02 net/netip 包設計思路

新的 netip 包定義了一個 IP 地址(Addr)類型,它是一個小值類型。基于該 Addr 類型,該包還定義了 AddrPort(一個 IP 地址和一個端口)和 Prefix(一個 IP 地址和一個位長前綴)。

與 net.IP 類型相比,netip 包的 Addr 類型占用更少的內存(24 byte),不可變(immutable),并且具有可比性(支持 == 并作為 map 鍵)。(本文基于 64 位機器講解)

該包的具體 API 等信息可以查看文檔,這里著重講解 netip 的設計思路。(來自 Brad Fitzpatrick 的文章)

net.IP 類型的特性:

net.IP特性

基于此,netip 包的演進過程中,有幾種設計。

1)wgcfg.IP,查看具體代碼[4]。

  1. // Internally the address is always represented in its IPv6 form. 
  2. // IPv4 addresses use the IPv4-in-IPv6 syntax. 
  3. type IP struct { 
  4.        Addr [16]byte 

這種結構相比 net.IP 結果:

wgcfg 對比

可見還存在幾個問題:1)無法區分 IPv4 和 IPv6;2)不支持 IPv6 zone。而不透明可以通過將字段 Addr 改為 addr 解決。

2)netaddr.IP,查看具體代碼[5]。

不知道大家是否知道,Go 中的 interface 是可比較的(即可通過 == 比較和用作 map 的鍵,不過如果接口的底層值是不可比的,則運行時會 panic)。利用這一點,設計了 netaddr.IP 類型:

  1. type IP struct { 
  2.      ipImpl 
  3.  
  4. type ipImpl interface { 
  5.      is4() bool 
  6.      is6() bool 
  7.      String() string 
  8.  
  9. type v4Addr [4]byte 
  10. type v6Addr [16]byte 
  11. type v6AddrZone struct { 
  12.       v6Addr 
  13.       zone string 

該結構的對比:

netaddr.IP

這種結構存在的問題:不夠小(20-23 byte),不是 Allocation free。

因此繼續優化。

3)allocation-free 24 字節表示

為什么定為 24 字節?Go 標準庫中 net.IP 的 Slice Header 大小是 24 字節,而 Go 中 Slice 很常見。time.Time 類型的大小目前也是 24 字節。所以,Go 編譯器肯定能夠很好的處理 24 字節值類型。所以,tailscale 團隊定了目標,要求表示 IP 的類型不超過 24 字節。

由于 IPv6 地址已經占去 16 個字節,因此剩下 8 字節用于編碼以下內容:

  • 地址族(v4、v6 或兩者都不是,例如 IP 零值),至少需要 2 位
  • IPv6 zone

此外,還需要能比較。

剩下的內容只能占 8 字節,因此沒法使用 interface{}(它占用 16 字節),字符串也不行(16 字節)。

可以嘗試采用了 bit-packing 的方式:

  1. type IP struct { 
  2.    addr          [16]byte 
  3.    zoneAndFamily uint64 

將地址族和 IPv6 zone 打包(packing)進 zoneAndFamily 字段中(8 字節)。不過這種方式編碼不是太方便,可能還會有一些問題。

最后采用了指針的方式:

  1. type IP struct { 
  2.     addr [16]byte 
  3.     z    *intern.Value // zone and family 

具體的過程分析可以參考 https://tailscale.com/blog/netaddr-new-ip-type-for-go/。

這樣可以定義三個哨兵:

  1. var ( 
  2.      z0    *intern.Value        // nil for the zero value 
  3.      z4    = new(intern.Value)  // sentinel value to mean IPv4 
  4.      z6noz = new(intern.Value)  // sentinel value to mean IPv6 with no zone 

這接近最終實現。不過,基于此有進一步的優化,感興趣的可以閱讀上面參考文章以及 Go1.18 的 net/netip 實現。

allocation-free

03 總結

這個包你可能用不到,不過標準庫中之前的 IP 實現的問題,以及新 IP 類型的設計思路還是值得認真看一下的。對其中更多細節感興趣的,可以認真研讀這篇文章:https://tailscale.com/blog/netaddr-new-ip-type-for-go/。

參考資料

[1]Tailscale: https://tailscale.com/

[2]IPv4 映射的 IPv6 地址: https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses

[3]issue 37921: https://github.com/golang/go/issues/37921

[4]具體代碼: https://github.com/tailscale/wireguard-go/commit/89476f8cb53b7b6e3e67041d204a972b69902565#diff-d6e6f254849cb9119d9aaa21a41ee7f26f499251ce073522bdd89361a316814bR13

[5]具體代碼: https://github.com/inetaf/netaddr/commit/7f2e8c8409b7c27c5b44192839c8a94fca95aa21#diff-5aea5a23fd374194efa71dd12c8ddf8ede924f1043045520a8283d2490f40f12R27

 

責任編輯:武曉燕 來源: polarisxu
相關推薦

2022-02-11 21:01:18

GoNetip網絡庫

2022-01-26 09:02:57

GoCut方法

2022-02-14 09:32:49

Go場景TryLock

2022-01-19 08:51:00

Module工作區Go

2021-12-27 18:27:18

GoTryLockJava

2022-02-16 08:59:43

Go方法Title

2021-12-28 07:20:44

泛型Go場景

2022-01-26 00:02:01

Go二進制元信息

2021-12-15 12:59:56

Go泛型版Beta1

2021-12-15 10:23:56

Go 1.18 Bet語言泛型

2022-01-10 11:33:17

Go測試軟件

2022-03-18 18:00:00

編程語言泛型支持模糊測試

2021-10-18 10:53:26

Go 代碼技術

2021-10-29 10:55:07

Go 泛型語言

2021-12-03 18:29:31

GoAny 泛型

2023-01-28 08:05:32

轉換Go泛型

2021-11-01 12:41:39

Go

2022-05-17 08:02:55

GoTryLock模式

2022-09-13 09:46:44

Go開發者調查Go 1.18

2025-04-29 08:03:18

點贊
收藏

51CTO技術棧公眾號

成人美女视频在线观看18| 91tv官网精品成人亚洲| 91久久精品一区二区二区| 视频一区二区三区免费观看| 国产日韩免费视频| 亚洲免费播放| 中文字幕无线精品亚洲乱码一区| 91欧美一区二区三区| 欧美a级在线观看| 国产精品五月天| 不卡一区二区三区视频| 特级做a爱片免费69| 91日韩免费| 亚洲国产精品视频在线观看| 无需播放器的av| 日本资源在线| 中文字幕乱码日本亚洲一区二区| 国产成人看片| 亚洲专区第一页| 中文高清一区| 久久久极品av| 国产免费一区二区三区网站免费| 欧洲精品99毛片免费高清观看| 色94色欧美sute亚洲线路一久 | 成人嫩草影院| 精品国产乱子伦一区| 久久国产激情视频| 亚洲天堂av影院| 一区二区三区不卡视频| 日韩中文一区| 裸体xxxx视频在线| 国产91丝袜在线观看| 成人免费福利在线| 中文在线观看免费高清| 久久大逼视频| 97免费在线视频| 多男操一女视频| 欧美日韩在线二区| 日韩成人av一区| 亚洲少妇一区二区三区| 2020国产精品小视频| 欧美视频在线不卡| 草草草在线视频| 范冰冰一级做a爰片久久毛片| 亚洲高清中文字幕| 丁香六月激情网| 九色91在线| 亚洲亚洲精品在线观看| 免费的一级黄色片| 亚洲男同gay网站| 亚洲人成精品久久久久久| 亚洲视频在线二区| 麻豆视频在线观看免费网站| 中文字幕 久热精品 视频在线| 欧美人与性禽动交精品| 欧美69xxxxx| 久久九九久精品国产免费直播| 免费观看国产成人| 免费毛片在线| 国产日韩精品一区二区浪潮av | 亚洲va欧美va天堂v国产综合| 欧美日韩视频免费在线观看| 成a人片在线观看| 一区二区三区小说| 韩日视频在线观看| www视频在线观看| 色综合久久综合中文综合网| 国内性生活视频| 最新日韩三级| 欧美日韩卡一卡二| 伊人精品视频在线观看| 8x国产一区二区三区精品推荐| 精品国产123| 国产 xxxx| 国产精品一区2区3区| 国产一区二区免费| 老司机成人免费视频| 欧美日韩岛国| 97在线免费观看视频| 99久久久无码国产精品免费蜜柚| 免费高清成人在线| 99久久无色码| 香蕉av一区二区三区| 国产亚洲欧美日韩日本| 三级网在线观看| 波多野结衣精品| 欧美又粗又大又爽| 日本55丰满熟妇厨房伦| 免费萌白酱国产一区二区三区| 亚洲欧美精品在线| 中文字幕另类日韩欧美亚洲嫩草| 极品日韩av| 国产精品视频公开费视频| 99国产精品久久久久久久成人| 94色蜜桃网一区二区三区| 色一情一乱一伦一区二区三区丨| 视频在线这里都是精品| 日本乱码高清不卡字幕| 国产xxxxhd| 欧美禁忌电影网| 欧美精品在线第一页| 精品人妻一区二区三区潮喷在线 | 国产精品一卡| 成人免费看黄网站| 日韩av成人| 伊人性伊人情综合网| 欧美黄网站在线观看| 激情久久免费视频| 亚洲美女黄色片| 欧美日韩大片在线观看| 日韩精品欧美精品| 国产精品一区二区三区不卡 | 欧美一级片一区| 国产乱色精品成人免费视频| 久久婷婷国产综合国色天香| 91国在线高清视频| 91精品国产66| 亚洲精品一区中文字幕乱码| 久热这里只有精品在线| 美女网站一区二区| 欧美日韩亚洲在线| 搞黄网站在线看| 欧美一区二区三区视频在线| 成人无码av片在线观看| 一本综合精品| 春色成人在线视频| 中文字幕资源网在线观看| 在线观看网站黄不卡| 亚洲最大的黄色网| 国产精品a久久久久| 91九色单男在线观看| av在线免费一区| 日本乱人伦aⅴ精品| 国产精品1000部啪视频| 在线观看日韩av电影| 亚洲一区制服诱惑| 超鹏97在线| 69堂精品视频| 91精品一区二区三区蜜桃| 免费观看一级特黄欧美大片| 少妇精品久久久久久久久久| 欧美gay囗交囗交| 日韩精品亚洲视频| 国产一级做a爱片久久毛片a| 波多野结衣中文一区| 久久视频这里有精品| 国产福利资源一区| 久久久视频免费观看| 性生交生活影碟片| 伊人开心综合网| wwwxx日本| 亚洲精品一级| 久久影院理伦片| 免费观看一级欧美片| 精品亚洲va在线va天堂资源站| 一级黄色免费网站| 国产亚洲成aⅴ人片在线观看| 精品久久久久久无码国产| 自拍偷拍精品| 国产精品久久综合av爱欲tv| 日韩黄色影院| 91精品国产综合久久精品app | 欧美日韩激情在线| 中文字幕乱码av| 国产一区二区0| 69精品丰满人妻无码视频a片| 一区三区自拍| 97人人爽人人喊人人模波多| 美丽的姑娘在线观看免费动漫| 在线一区二区视频| 国产美女高潮视频| 国产精品99久久久久久似苏梦涵| 无码人妻精品一区二区蜜桃网站| 国产一区福利| 国产91色在线|| 日本免费在线观看| 日韩一区二区麻豆国产| 成人在线免费看视频| 久久久九九九九| www.欧美激情.com| 亚洲国产日本| 日韩中文一区| 97久久精品| 国产精品99免视看9| 超鹏97在线| 亚洲欧美日韩中文在线| 国产日韩欧美视频在线观看| 天天做天天摸天天爽国产一区| 日本精品在线观看视频| 国产乱色国产精品免费视频| 国产精品999视频| 欧美wwwww| 精品国产免费人成电影在线观...| 91大神在线观看线路一区| 欧美疯狂xxxx大交乱88av| 欧洲视频在线免费观看| 777色狠狠一区二区三区| 黄色激情视频在线观看| 中文字幕久久午夜不卡| 中文在线观看免费视频| 美国三级日本三级久久99| 女人被男人躁得好爽免费视频| 国产99精品| 国产精华一区二区三区| 97成人超碰| 97精品视频在线观看| 日本美女高清在线观看免费| 亚洲激情成人网| 精品国产无码AV| 欧洲人成人精品| 人人干人人干人人干| 亚洲视频免费在线| 精品人妻无码一区| 不卡视频在线看| 一个人看的视频www| 日本成人中文字幕| 国产1区2区在线| 亚洲青色在线| www国产无套内射com| 欧美www视频在线观看| 日本视频精品一区| 欧美三级午夜理伦三级在线观看| 亚洲一区二区三区香蕉| 国产麻豆一区| 国产精品成人免费视频| 水蜜桃在线视频| 国模精品一区二区三区色天香| 老司机在线看片网av| 中文字幕av一区二区| 黄色大片在线看| 亚洲精品一区二区久| 午夜视频福利在线| 精品福利在线导航| 亚洲国产精品suv| 日韩一区二区中文字幕| 国产乱子伦精品无码码专区| 欧美日韩国产a| 伊人精品在线视频| 欧美午夜影院一区| www.国产毛片| 91久久精品日日躁夜夜躁欧美| 久草手机在线观看| 精品久久久国产| 中文字幕亚洲高清| 黑人巨大精品欧美一区免费视频| 国产精品500部| 欧美日韩国产精品| 国产成人一区二区三区影院在线| 亚洲小说欧美激情另类| 久久久久久欧美精品se一二三四 | www成人在线| 欧美色视频日本高清在线观看| 亚洲黄色小说图片| 一本大道av伊人久久综合| 黄色片视频免费| 欧美日韩综合色| 99国产精品久久久久99打野战| 日韩欧美一区在线观看| 黄频网站在线观看| 亚洲乱码av中文一区二区| 国产精品视频一区二区久久| 最近的2019中文字幕免费一页| 国产在线二区| 久久频这里精品99香蕉| 成人爱爱网址| 国产精品久久久久久久久久新婚| 欧洲精品久久久久毛片完整版| 成人激情av在线| 盗摄牛牛av影视一区二区| 久久久久久欧美精品色一二三四| 国产伦一区二区三区| 丰满女人性猛交| 亚洲经典在线看| 成人在线观看a| 国产一区二区免费视频| 香蕉在线观看视频| 91在线观看下载| 一区二区伦理片| 亚洲精品水蜜桃| 少妇一级淫片免费放中国| 欧美日韩亚洲综合一区| 精品黑人一区二区三区在线观看| 日韩高清人体午夜| 伊人免费在线| 国内精品视频久久| 成人av色网站| 国产精品一区视频| 欧美一级精品| 人妻夜夜添夜夜无码av| 蜜臀久久99精品久久久画质超高清| 日本一区二区三区在线免费观看| 91亚洲精华国产精华精华液| 91视频免费看片| 亚洲国产欧美另类丝袜| 中文字幕 国产精品| 精品奇米国产一区二区三区| 电影在线一区| 午夜精品一区二区三区在线 | 国产无套精品一区二区| 精品国精品国产自在久国产应用| 久久香蕉视频网站| 日本视频一区二区| 亚洲成年人av| 自拍偷在线精品自拍偷无码专区 | 欧美久久一二三四区| 黄色片一区二区| www国产精品com| 成人自拍av| 九色91在线视频| 欧美激情综合| 一级黄色特级片| 久久先锋影音av| 日韩手机在线观看| 欧美一区二区三区免费在线看| 毛片在线免费| 国产91ⅴ在线精品免费观看| 最新国产一区二区| 在线一区高清| 免费国产亚洲视频| 美女被到爽高潮视频| 亚洲大型综合色站| 亚洲成人一级片| 日韩有码在线电影| 欧美va在线| 日本中文不卡| 另类国产ts人妖高潮视频| 国产a级黄色片| 亚洲一区二区三区四区五区中文| 亚洲天堂999| 社区色欧美激情 | 国产精品毛片久久久久久久久久99999999 | wwwxxx亚洲| 亚洲国产成人精品久久| 福利小视频在线| 国产精品久久久对白| 欧美日本一区二区视频在线观看| 香蕉视频xxx| 亚洲人一二三区| 一级全黄少妇性色生活片| 在线电影中文日韩| 成人看片在线观看| 日本不卡久久| 天堂蜜桃91精品| 国产精品扒开腿做爽爽| 欧美午夜无遮挡| 蜜芽tv福利在线视频| 欧洲亚洲女同hd| 国产成人短视频在线观看| 日韩a在线播放| 国产午夜亚洲精品午夜鲁丝片| 精人妻无码一区二区三区| 亚洲欧美日韩区| 国内自拍亚洲| 亚洲一区精彩视频| 国产一区二区三区四区在线观看| 亚洲一级生活片| 日韩免费在线观看| av3级在线| 欧美精品123| 青椒成人免费视频| 成年人网站在线观看视频| 91精品午夜视频| 青春草免费在线视频| 国产在线一区二区三区四区| 免费在线欧美黄色| 正在播放国产对白害羞| 日韩一区二区三区视频| a级片免费在线观看| 欧美另类网站| 久久精品国产99久久6| 欧美三级在线免费观看| 亚洲国产日韩欧美在线动漫| 欧美一区国产| 二级片在线观看| 26uuu另类欧美| 中文在线字幕av| 欧美国产日本高清在线| 网曝91综合精品门事件在线| 欧美男女交配视频| 一区二区欧美国产| 飘雪影院手机免费高清版在线观看| 国产精品中文字幕在线| 国产尤物精品| 五月天综合视频| 日韩欧美一区中文| 电影亚洲精品噜噜在线观看| 在线无限看免费粉色视频| 99精品欧美一区二区三区综合在线| 4438国产精品一区二区| 日韩有码在线播放| 日韩中出av| 波多野结衣在线免费观看| 日韩欧美精品网址| 99视频免费在线观看| 欧美亚洲免费在线| 国产成人在线色| 中文字幕无码乱码人妻日韩精品| 欧美国产亚洲精品久久久8v| 欧美另类69xxxxx| 中文字幕人妻一区二区三区|