国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go1.18 快訊:新的 IP 包

開(kāi)發(fā) 后端
Go 1.18 標(biāo)準(zhǔn)庫(kù)新增了一個(gè)包:net/netip,大部分人可能用不上這個(gè)包,但這個(gè)包的設(shè)計(jì)思路以及和現(xiàn)有標(biāo)準(zhǔn)庫(kù) IP 的比較值得學(xué)習(xí)。

[[438246]]

本文轉(zhuǎn)載自微信公眾號(hào)「polarisxu」,作者站長(zhǎng)polaris 。轉(zhuǎn)載本文請(qǐng)聯(lián)系polarisxu公眾號(hào)。

大家好,我是 polarisxu。

Go 1.18 標(biāo)準(zhǔn)庫(kù)新增了一個(gè)包:net/netip,大部分人可能用不上這個(gè)包,但這個(gè)包的設(shè)計(jì)思路以及和現(xiàn)有標(biāo)準(zhǔn)庫(kù) IP 的比較值得學(xué)習(xí)。

01 標(biāo)準(zhǔn)庫(kù) net.IP 的問(wèn)題

前 Go Team 成員之一 Brad Fitzpatrick 加入 Tailscale[1] 后,經(jīng)常需要操作 IP 地址。因?yàn)槭褂?Go 語(yǔ)言實(shí)現(xiàn)的,自然會(huì)使用過(guò)標(biāo)準(zhǔn)庫(kù)的 net.IP 和 net.IPNet 等類型。但他們認(rèn)為標(biāo)準(zhǔn)庫(kù)的相關(guān)類型有很多問(wèn)題,所以他們自己寫(xiě)了一個(gè)包:https://github.com/inetaf/netaddr。

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

具體來(lái)說(shuō),net.IP 存在如下幾個(gè)問(wèn)題:

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

但為了兼容性,以上這些問(wèn)題沒(méi)法通過(guò)改進(jìn) net.IP 類型解決。于是才有了 Brad Fitzpatrick 上面開(kāi)發(fā)的包。該包已經(jīng)正式合入 Go1.18 標(biāo)準(zhǔn)庫(kù)中,這就是 net/netip 包,這里可以查看包文檔:https://pkg.go.dev/net/netip@master。

02 net/netip 包設(shè)計(jì)思路

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

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

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

net.IP 類型的特性:

net.IP特性

基于此,netip 包的演進(jìn)過(guò)程中,有幾種設(shè)計(jì)。

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 

這種結(jié)構(gòu)相比 net.IP 結(jié)果:

wgcfg 對(duì)比

可見(jiàn)還存在幾個(gè)問(wèn)題:1)無(wú)法區(qū)分 IPv4 和 IPv6;2)不支持 IPv6 zone。而不透明可以通過(guò)將字段 Addr 改為 addr 解決。

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

不知道大家是否知道,Go 中的 interface 是可比較的(即可通過(guò) == 比較和用作 map 的鍵,不過(guò)如果接口的底層值是不可比的,則運(yùn)行時(shí)會(huì) panic)。利用這一點(diǎn),設(shè)計(jì)了 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 

該結(jié)構(gòu)的對(duì)比:

netaddr.IP

這種結(jié)構(gòu)存在的問(wèn)題:不夠小(20-23 byte),不是 Allocation free。

因此繼續(xù)優(yōu)化。

3)allocation-free 24 字節(jié)表示

為什么定為 24 字節(jié)?Go 標(biāo)準(zhǔn)庫(kù)中 net.IP 的 Slice Header 大小是 24 字節(jié),而 Go 中 Slice 很常見(jiàn)。time.Time 類型的大小目前也是 24 字節(jié)。所以,Go 編譯器肯定能夠很好的處理 24 字節(jié)值類型。所以,tailscale 團(tuán)隊(duì)定了目標(biāo),要求表示 IP 的類型不超過(guò) 24 字節(jié)。

由于 IPv6 地址已經(jīng)占去 16 個(gè)字節(jié),因此剩下 8 字節(jié)用于編碼以下內(nèi)容:

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

此外,還需要能比較。

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

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

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

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

最后采用了指針的方式:

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

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

這樣可以定義三個(gè)哨兵:

  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 

這接近最終實(shí)現(xiàn)。不過(guò),基于此有進(jìn)一步的優(yōu)化,感興趣的可以閱讀上面參考文章以及 Go1.18 的 net/netip 實(shí)現(xiàn)。

allocation-free

03 總結(jié)

這個(gè)包你可能用不到,不過(guò)標(biāo)準(zhǔn)庫(kù)中之前的 IP 實(shí)現(xiàn)的問(wèn)題,以及新 IP 類型的設(shè)計(jì)思路還是值得認(rèn)真看一下的。對(duì)其中更多細(xì)節(jié)感興趣的,可以認(rèn)真研讀這篇文章: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

 

責(zé)任編輯:武曉燕 來(lái)源: polarisxu
相關(guān)推薦

2022-02-11 21:01:18

GoNetip網(wǎng)絡(luò)庫(kù)

2022-01-26 09:02:57

GoCut方法

2022-02-14 09:32:49

Go場(chǎng)景TryLock

2022-01-19 08:51:00

Module工作區(qū)Go

2021-12-27 18:27:18

GoTryLockJava

2021-12-28 07:20:44

泛型Go場(chǎng)景

2022-02-16 08:59:43

Go方法Title

2022-01-26 00:02:01

Go二進(jìn)制元信息

2021-12-15 12:59:56

Go泛型版Beta1

2021-12-15 10:23:56

Go 1.18 Bet語(yǔ)言泛型

2022-01-10 11:33:17

Go測(cè)試軟件

2022-03-18 18:00:00

編程語(yǔ)言泛型支持模糊測(cè)試

2021-10-18 10:53:26

Go 代碼技術(shù)

2021-10-29 10:55:07

Go 泛型語(yǔ)言

2021-12-03 18:29:31

GoAny 泛型

2023-01-28 08:05:32

轉(zhuǎn)換Go泛型

2022-05-17 08:02:55

GoTryLock模式

2021-11-01 12:41:39

Go

2022-09-13 09:46:44

Go開(kāi)發(fā)者調(diào)查Go 1.18

2020-11-24 13:05:35

Go語(yǔ)言泛型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

91嫩草在线播放| 日韩福利视频在线观看| 欧美性猛交久久久乱大交小说| 欧美日本国产视频| 日韩一区二区精品葵司在线| 国产精品精品国产| 久久综合九色综合88i| 少妇视频在线| 久久久久久久久久久久久久| 国产精品素人视频| 国产一区二区成人| 青青视频免费在线| 欧美国产乱视频| 欧美成人免费va影院高清| 免费网站看v片在线a| 亚洲欧洲综合另类| 在线看av的网址| 色悠悠久久久久| 日本va欧美va瓶| 99精品视频网站| 亚洲在线成人精品| 欧美大电影免费观看| 在线精品高清中文字幕| 91精品啪在线观看国产18| 999国产视频| 国产主播一区二区三区| 在线免费色视频| 在线播放精品一区二区三区| 国产一区二区网址| 最近中文字幕mv免费高清在线| 无码av免费一区二区三区试看| 一本大道色婷婷在线| 国产一区二区视频在线观看| 蜜桃av噜噜一区| 黑巨人与欧美精品一区| 欧美一区二区二区| 噜噜噜狠狠夜夜躁精品仙踪林| 91美女片黄在线观看游戏| 久久亚洲精品小早川怜子| 国产资源在线观看| 欧美激情2020午夜免费观看| 亚洲第一精品影视| 99riav视频| 欧美一级高清大全免费观看| 欧美性生活一级片| 偷拍视频一区二区| 亚洲va天堂va国产va久| 福利精品在线| 亚洲视频sss| 欧美系列亚洲系列| 成人h动漫免费观看网站| 国产精品一区二区三区四区五区 | 国产成人免费在线观看不卡| 国产91欧美| 免费一级电影| 欧美激情精品在线| 青青草一区二区三区| 精品极品在线| 日本一区视频在线播放| 亚洲性xxxx| 美女一区二区久久| 亚洲www色| 欧美 日韩 亚洲 一区| 国内免费久久久久久久久久久| 色94色欧美sute亚洲线路一ni| 亚洲欧美日韩精品一区二区| 免费成人av电影| 国产玉足脚交久久欧美| 国产香蕉一区二区三区在线视频 | 亚洲精品久久久久久一区二区| 色婷婷久久一区二区三区麻豆| 亚洲激情六月丁香| 蜜桃tv在线播放| 国产精品成人aaaaa网站| 欧美调教femdomvk| 麻豆久久一区二区| 亚洲最好看的视频| 国产精品va在线观看视色| 欧美精品123| 欧美视频在线不卡| 久久综合图片| 天堂网在线最新版www中文网| 成人黄色一区二区| 亚洲精品国产电影| 国产一区二区三区四| 日本免费成人| 天天操天天爽天天射| 欧美做受高潮电影o| 日韩欧美中文免费| 国产成人av在线影院| 日韩欧美影院| melody高清在线观看| 欧美一区二区三区电影在线观看| 欧美日韩国产成人在线观看| 欧美吻胸吃奶大尺度电影| 国产一区二区香蕉| 午夜视频在线观看韩国| 亚洲美女91| 欧美成人福利视频| 亚洲午夜高清视频| 免费福利视频一区二区三区| 91免费看`日韩一区二区| 欧美激情综合色| 中文字幕在线影视资源| 亚洲小说欧美另类社区| 日韩不卡在线观看| 国产免费观看高清视频| 美国成人xxx| 欧美日韩一区二区免费在线观看| 国产欧美日韩在线播放| 黄色在线观看视频网站| 国产在线看一区| 久久99视频免费| 国产福利图片| 亚洲精品小说| 欧美精品久久天天躁| 亚洲欧洲另类精品久久综合| 日韩av电影资源网| 中国色在线观看另类| 国产精品久久久久久av福利| 好操啊在线观看免费视频| www..com久久爱| 国产精品视频永久免费播放 | 久久久久久国产精品一区| 日韩精品第一| 国产精品久久久久av蜜臀| 人成在线免费网站| 日韩免费毛片视频| 久久久久久九九| 北条麻妃久久精品| 欧美日韩在线视频一区二区| 亚洲国产高清不卡| 制服丝袜在线播放| 清纯唯美综合亚洲| 欧美三级日韩在线| 欧美日韩一区二区三区电影| 精品视频在线观看免费观看 | 日本一区二区三区国色天香| 国产精品免费福利| 乱人伦中文视频在线| 国产超碰在线一区| 午夜精品视频在线| 日本中文在线| zzijzzij亚洲日本少妇熟睡| 国产精品扒开腿做爽爽爽男男| 久草资源在线观看| 成人免费视频一区| 国产成人精品视频在线| 日本免费视频在线观看| av在线播放成人| 91精品中文在线| 日韩大片免费观看| 中文字幕在线播放不卡一区| 麻豆亚洲一区| 99精品国产九九国产精品| 亚洲成人激情自拍| 一本一道久久久a久久久精品91| 北条麻妃在线一区二区免费播放| 在线亚洲一区观看| 欧美亚洲黄色片| 日韩在线看片| 亚洲精品国精品久久99热一| 美女xx视频| 蜜臀av性久久久久蜜臀aⅴ流畅 | 97在线免费观看视频| 色哟哟免费在线观看| 91一区二区三区在线观看| 96精品久久久久中文字幕| 天堂网在线最新版www中文网| 亚洲免费观看高清完整| 视频一区在线免费观看| 农村少妇一区二区三区四区五区| 欧美日韩国产综合久久| 日日摸天天爽天天爽视频| 在线日本高清免费不卡| 久久韩剧网电视剧| 国产一区二区三区福利| 99国产精品国产精品久久| 超碰97在线资源| 国产精品国产亚洲精品| 91国偷自产一区二区开放时间| 18禁网站免费无遮挡无码中文| 一本一本久久a久久综合精品| 伊人av综合网| 日韩资源在线| 久久人人爽人人爽| 国产精品一区二区三区不卡| 国产成人久久精品一区二区三区| 日韩欧美精品在线观看| 成人网站免费观看入口| 色999国产精品| 中文字幕日韩在线播放| 成人亚洲综合天堂| 久久久亚洲综合| 蜜桃av久久久亚洲精品| 久久大胆人体视频| 亚洲黄色在线观看| 国产一级二级三级在线观看| 中文字幕日韩精品一区 | 成人免费毛片app|