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

Go1.18 新特性:引入新的 Netip 網絡庫

開發 前端
這個網絡地址庫,一般都用的比較少。但是 Brad Fitzpatrick 在此投入了大量的精力和研究,達到了最終的目標。

大家好,我是煎魚。

寫這篇文章時是大年初一,原本想說這個月就要發布 Go1.18 了。但是,好家伙,Go1.18 beta2 發布了,官方告知社區 Go1.18 要拖更到 3 月份了,咕咕咕...

如下圖:

所以還是得繼續學習新特性,今天煎魚將結合 Brad Fitzpatrick 寫的《netaddr.IP: a new IP address type for Go[1]》帶大家了解 Go1.18 的新網絡庫 net/netip 的緣由。

背景

大佬離職

原本 Go 開發團隊中的 Brad Fitzpatrick,在 2010~2020 年都在 Go 團隊工作,在 2021 年起換公司了。

如下推特的消息:

離職的原因是:做了同樣的東西太久了,有些厭煩,不想陷在一個舒適的困境中。

現在來看是換到了 Tailscale,做 WireGuard 相關工作,要經常與網絡庫打交道。

需求誕生

大佬公司寫的 Tailscale,本質上是一個網絡應用程序,要與網絡打交道,又是用 Go 寫的,就會涉及到標準庫 net:

  • 在單個 IP 類型上使用 net.IP。
  • 網絡表示上使用 net.IPNet。

示例代碼:

import (
"fmt"
"net"
)

func main() {
fmt.Println(net.IPv4(8, 8, 8, 8))
}

輸出結果:

8.8.8.8

Brad Fitzpatrick 在實際編寫和使用時,發現 net 標準庫的類型有很多問題,很不好用。

現在有什么問題

Brad Fitzpatrick 對于標準庫 net.IP 的問題,直接在文章中列舉了出來,論據十足。

共 7 個大問題:

  • 它是可變的。net.IP 的底層類型是 []byte,這意味著你傳遞給它的任何東西都可能改變它。
  • 它不具有可比性。因為 Go 中的 slice 不具有可比性,這意味著 net.IP 不支持 Go 的 == 運算符的對比,不能作為 map 的 key 來使用。
  • 它有兩種 IP 地址類型,要糾結用 net.IP,還是 net.IPAddr,要選擇就會很煩人。
  • 它很大。Go 的 net.IP 包含 2 個部分,分別是 24 字節的 slice header 和 4/6 字節的 IP 地址。如果是 net.IPAddr 還會包含 Zone 字段。
  • 它會在堆上分配內存。Go 的 net 包到處都是分配,把更多的工作放在了 GC 上。
  • 它不可解析。從字符串形式解析 IP 時,Go 的 IP 類型無法區分 IPv4 映射的 IPv6 地址和 IPv4 地址。
  • 它是透明類型(transparent type),net.IP的定義是:type IP []byte,是其公共API的一部分,不可更改。

Brad 也有提到有些是當年早期的設計,當時經驗不足,或是沒有考慮好。

現在受限于 Go1 兼容性承諾,已經無法改變了(兼容性保障的雙刃劍?)。

這是個真實版 “Eating your own dog food”,所以在 Tailscale 他又重新造了一個輪子inetaf/netaddr[2],想貢獻出來,塞進標準庫里。

未來想要的樣子

對比表格如下:

特性

老方案 net.IP

新方案

不變的

?, slice

?

可比的

?, slice

?

占用空間小

?,28~56 字節

?,固定 24 字節

不在堆上分配

?

?

支持 IPv4 和 IPv6

?

?

區分 IPv4 和 IPv6

?

?

支持 IPv6 區域

?

?

不透明的類型

?

?

與標準庫互通

?

??,需適配方法

想要的樣子,其實是 Brad 業務實戰出來的訴求,就是要支持前面提到的 7 點。

解決方案

當前的進展

實現的結果,也就是新方案做出來了,他就是inetaf/netaddr[3] 這個庫(當然,也不排除是結果倒推理論)。并且在 Go issues 中發起 issues 和 proposal。

https://pkg.go.dev/inet.af/netaddr

Russ Cox 發起了新提案的討論《proposal: net/netaddr: add new IP address type, netaddr package (discussion)[4]》,并被接納,進入了 Go1.18 的新特性當中。

重造過程

新的 net/netip 庫的每一個考量點,Brad 都在文章中有所詳細講解。

受限于篇幅,我們拿其中兩點來分享,有興趣的小伙伴可以閱讀原文的剖析部分。

接口類型組合

在可比較這事上,Go 的接口(interface)其實是支持比較的,也就是可以作為 map 的 key 進行 == 運算符的比較。

實現了如下的第一版方案,設計了新的netaddr.IP 類型:

type IP struct {
ipImpl
}

type ipImpl interface {
is4() bool
is6() bool
String() string
}

type v4Addr [4]byte
type v6Addr [16]byte
type v6AddrZone struct {
v6Addr
zone string
}

上述代碼,在 IP 結構體中增加了 ipImpl 接口,既能支持比較,還可以不對外暴露(不透明類型),且可以支持 IPv6。

新的問題在于,雖然比原生 net 小了,但還是沒達到目標,還是有在堆上分配的缺點。

免分配的 24 字節

如果繼續使用接口,是無法解決根本目標(Brad 的目標是 24 字節)的。

因為接口(interface)占用 16 字節,剩余 8 個字節可以用,要放如下東西:

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

還要能比較,顯然接口是無法實現的,因為地址+zone 信息算一下字節數,顯示是不夠用的。

正規顯式的沒辦法,Brad 想到了用打包的方式:

type IP struct {
addr [16]byte
zoneAndFamily uint64
}

但這么做,就意味著 zoneAndFamily 字段中需要計算位數,再對應的推入相應的值,但也未必太折騰了。

最終 Brad 想到了,可以使用指針的方式:

type IP struct {
addr [16]byte
zoneAndFamily *T
}

再定義 3 個對應哨位值的來應用:

var (
z0 *intern.Value // 表示零值。
z4 = new(intern.Value) // 表示 IPv4 的哨位值
z6noz = new(intern.Value) // 表示 IPv6 的哨位值(沒有 zone)。
)

這樣就可以把 IP 類型固定在 24 字節。

總結

這個網絡地址庫,一般都用的比較少。但是 Brad Fitzpatrick 在此投入了大量的精力和研究,達到了最終的目標。

除去庫的功能外,有許多技術優化點值得我們學習和參考,有興趣深入優化部分的,可以閱讀:https://tailscale.com/blog/netaddr-new-ip-type-for-go/[5]

本文介紹的新 net/netip 庫將會在 Go1.18 中作為新特性出現,歡迎大家一起學習交流:)

參考資料

[1]netaddr.IP: a new IP address type for Go: https://tailscale.com/blog/netaddr-new-ip-type-for-go/

[2]inetaf/netaddr: https://github.com/inetaf/netaddr

[3]inetaf/netaddr: https://github.com/inetaf/netaddr

[4]proposal: net/netaddr: add new IP address type, netaddr package): https://github.com/golang/go/discussions/47323

[5]https://tailscale.com/blog/netaddr-new-ip-type-for-go/: https://tailscale.com/blog/netaddr-new-ip-type-for-go/#wgcfg


責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2022-01-26 09:02:57

GoCut方法

2022-01-19 08:51:00

Module工作區Go

2021-12-02 18:21:49

GoIP 包設計

2022-02-14 09:32:49

Go場景TryLock

2021-12-27 18:27:18

GoTryLockJava

2022-02-16 08:59:43

Go方法Title

2022-01-26 00:02:01

Go二進制元信息

2021-12-28 07:20:44

泛型Go場景

2022-03-18 18:00:00

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

2021-09-05 18:25:30

Go命令倉庫

2021-12-15 12:59:56

Go泛型版Beta1

2021-12-15 10:23:56

Go 1.18 Bet語言泛型

2024-01-22 00:30:00

Go編程Go 1.22

2025-04-29 08:59:37

2021-10-18 10:53:26

Go 代碼技術

2025-08-07 09:09:29

2017-12-11 16:32:07

JavaJDK 10語言

2021-09-01 07:21:46

堆棧Gopanic

2012-05-18 14:36:50

Fedora 17桌面環境

2024-09-11 09:30:58

IDEA工具編程
點贊
收藏

51CTO技術棧公眾號

一区二区三区日韩在线| 风间由美性色一区二区三区四区| 欧美精品福利| 国产小视频国产精品| 在线看片线路1| 合欧美一区二区三区| 色婷婷av一区| 天天操,天天操| 黑人巨大精品欧美一区| 国产日本一区二区三区| 国内精品久久久久久99蜜桃| 日韩成人在线免费观看| 久久久久久久久免费视频| 亚洲免费大片在线观看| 欧美 国产 综合| 国产一区二区成人久久免费影院 | 日本一区二区三区在线播放| 亚洲视频国产| 精品久久久在线观看| 成年人视频网站免费观看| 91丝袜美腿高跟国产极品老师| www.九色.com| 国产麻豆午夜三级精品| 国产成人三级视频| 日韩在线欧美| 国自产精品手机在线观看视频| 四虎影视成人| 欧美高清第一页| 国产精品一区二区三区av麻 | 伊人久久大香线蕉成人综合网 | 日韩三级电影网| 五月天亚洲婷婷| 日本韩国一区| 日韩精品免费综合视频在线播放| 日本少妇一区| 国产精品青草久久久久福利99| 久久久久久久久99精品大| 亚州欧美一区三区三区在线| 亚洲电影av| 日韩不卡一二区| 洋洋成人永久网站入口| 麻豆理论在线观看| 日韩有码在线视频| 99精品视频在线观看免费播放| 91社在线播放| 亚洲福利一二三区| 奇米777日韩| 国产精品露脸av在线| 国产一区二区毛片| 黑森林精品导航| 欧美xxxx在线观看| 国产日韩在线观看视频| 久久精品五月婷婷| 亚洲欧美激情小说另类| 中文字幕在线视频网| 日韩电影中文字幕在线| 亚洲国产日韩欧美在线| 黄色成人免费看| 日韩手机在线导航| 日韩mv欧美mv国产网站| 少妇特黄a一区二区三区| 最近日韩中文字幕| 在线日韩成人| 日本午夜精品电影| 色悠久久久久综合欧美99| 欧美男gay| 毛片中文在线观看| 欧美成人黄色小视频| 国产宾馆实践打屁股91| 国产三级在线| 亚洲视频自拍偷拍| 美媛馆国产精品一区二区| 91黄色免费版| 国产精品17p| 成人网址大全| 国产精品女主播视频| 亚洲成人一区二区在线观看| 97品白浆高清久久久久久| 欧美女同在线观看| 久久中国妇女中文字幕| 极品少妇一区二区| 91免费观看| 亚洲第一狼人社区| 99久久综合| 高清性色生活片在线观看| 91超碰在线免费观看| 日韩视频免费观看高清完整版在线观看| 免费在线欧美黄色| 日本精品专区| 成人免费激情视频| 欧美视频在线一区| 国产福利精品导航| 色诱色偷偷久久综合| 日本aⅴ中文| 国产精品男人的天堂| 欧美日韩国产首页| 日韩福利电影在线| 成人精品国产亚洲| 亚洲男男gay视频| 91免费国产网站| 亚洲精品91美女久久久久久久| 成人一区二区在线观看| 日韩精选在线| 午夜激情在线| 成片免费观看视频| 中文网丁香综合网| 亚州成人av在线| 在线观看日韩国产| 国产91综合一区在线观看| 久久久久观看| 91美女主播在线视频| 性色av一区二区| 亚洲一区精彩视频| 午夜精品久久久久久99热| 欧美日韩成人激情| 国产日韩欧美高清| 欧美亚洲一区二区三区| 亚洲v天堂v手机在线| 香蕉网站在线| 成人黄色片视频| 亚洲国产另类久久久精品极度| 日韩av网站在线| 色www精品视频在线观看| 久久草av在线| 综合久久精品| jizz18欧美18| 最近中文字幕mv免费高清在线| 麻豆一区二区三区在线观看| 欧美xxxx综合视频| 欧美三级乱人伦电影| 一区二区三区四区高清精品免费观看| 视频一区二区中文字幕| 成人性生活视频| 精品自拍一区| jizz国产| 日本性视频网| 校园春色影音先锋| 欧美日韩亚洲一二三| 亚洲一区国产精品| www亚洲欧美| 国产精品乱码妇女bbbb| 国产寡妇亲子伦一区二区| 精品一区免费av| 在线综合亚洲| 日本中文字幕不卡| 亚洲激情成人| 亚洲国内自拍| 毛片av中文字幕一区二区| 日本中文在线一区| 成人黄色小视频在线观看| 97aⅴ精品视频一二三区| 久久久久久久国产精品影院| 久久久亚洲午夜电影| 亚洲国产欧美在线| 成人sese在线| 亚洲天堂精品在线观看| 夜夜嗨av一区二区三区| 在线免费观看日韩欧美| 91精品国产麻豆国产自产在线 | 亚洲欧美视频在线| 日韩中文字幕网| 国产精品视频地址| 黄色a级在线观看| 蜜桃传媒一区二区三区| 怡红院av亚洲一区二区三区h| 99精产国品一二三产品香蕉| 女人黄色片免费| 无夜福利视频观看| 色播在线视频| av成人在线播放| 一区二区三区中文| 国产成人亚洲综合a∨婷婷| 日韩电影在线一区二区| 精品二区视频| 久久久久久久久久看片| www.亚洲人| 欧美日韩一区 二区 三区 久久精品| 欧美性猛交xxxxxxxx| 久久精品久久久久久| 91成人免费看| 亚洲精品电影在线一区| 蜜桃免费在线视频| a级大胆欧美人体大胆666| 日韩一区二区三区精品视频第3页| 日韩精品亚洲aⅴ在线影院| 成人区精品一区二区婷婷| 成人精品视频一区二区三区尤物| 欧美巨大另类极品videosbest | 免费看男男www网站入口在线 | 亚洲婷婷国产精品电影人久久| 日韩精品视频在线观看网址| 欧美日韩国产成人| 亚洲欧美色综合| 亚洲国产精品视频| 亚洲三级 欧美三级| 91精品国产99久久久久久| 久久久久免费看黄a片app| 国产精品原创| 国产一区二区三区不卡av| 国产三级精品在线|