当前位置: 首页 > 后端技术 > Python

Go1.18 新特性:引入新的 netip 网络库

时间:2023-03-25 19:52:44 Python

Go1.18 鏂扮壒鎬э細寮曞叆鏂扮殑 netip 缃戠粶搴撯檧鈸库檧澶у濂斤紝鎴戞槸鐓庨奔銆傚啓杩欑瘒鏂囩珷鏃舵槸澶у勾鍒濅竴锛屽師鏈兂璇磋繖涓湀灏辫鍙戝竷 Go1.18 浜嗐€備絾鏄紝濂藉浼欙紝Go1.18 beta2 鍙戝竷浜嗭紝瀹樻柟鍛婄煡绀惧尯 Go1.18 瑕佹嫋鏇村埌 3 鏈堜唤浜嗭紝鍜曞挄鍜?..濡備笅鍥撅細鎵€浠ヨ繕鏄緱缁х画瀛︿範鏂扮壒鎬э紝浠婂ぉ鐓庨奔灏嗙粨鍚?Brad Fitzpatrick 鍐欑殑鈾€鉂垛檧甯﹀ぇ瀹朵簡瑙?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.8Brad Fitzpatrick 鍦ㄥ疄闄呯紪鍐欏拰浣跨敤鏃讹紝鍙戠幇 net 鏍囧噯搴撶殑绫诲瀷鏈夊緢澶氶棶棰橈紝寰堜笉濂界敤銆傜幇鍦ㄦ湁浠€涔堥棶棰楤rad Fitzpatrick 瀵逛簬鏍囧噯搴?net.IP 鐨勯棶棰橈紝鐩存帴鍦ㄦ枃绔犱腑鍒椾妇浜嗗嚭鏉ワ紝璁烘嵁鍗佽冻銆傚叡 7 涓ぇ闂锛氬畠鏄彲鍙樼殑銆俷et.IP 鐨勫簳灞傜被鍨嬫槸 []byte锛岃繖鎰忓懗鐫€浣犱紶閫掔粰瀹冪殑浠讳綍涓滆タ閮藉彲鑳芥敼鍙樺畠銆傚畠涓嶅叿鏈夊彲姣旀€с€傚洜涓?Go 涓殑 slice 涓嶅叿鏈夊彲姣旀€э紝杩欐剰鍛崇潃 net.IP 涓嶆敮鎸?Go 鐨?== 杩愮畻绗︾殑瀵规瘮锛屼笉鑳戒綔涓?map 鐨?key 鏉ヤ娇鐢ㄣ€傚畠鏈変袱绉?IP 鍦板潃绫诲瀷锛岃绾犵粨鐢?net.IP锛岃繕鏄?net.IPAddr锛岃閫夋嫨灏变細寰堢儲浜恒€傚畠寰堝ぇ銆侴o 鐨?net.IP 鍖呭惈 2 涓儴鍒嗭紝鍒嗗埆鏄?24 瀛楄妭鐨? slice header 鍜?4/6 瀛楄妭鐨?IP 鍦板潃銆傚鏋滄槸 net.IPAddr 杩樹細鍖呭惈 Zone 瀛楁銆傚畠浼氬湪鍫嗕笂鍒嗛厤鍐呭瓨銆侴o 鐨?net 鍖呭埌澶勯兘鏄垎閰嶏紝鎶婃洿澶氱殑宸ヤ綔鏀惧湪浜?GC 涓娿€傚畠涓嶅彲瑙f瀽銆備粠瀛楃涓插舰寮忚В鏋?IP 鏃讹紝Go 鐨?IP 绫诲瀷鏃犳硶鍖哄垎 IPv4 鏄犲皠鐨?IPv6 鍦板潃鍜?IPv4 鍦板潃銆傚畠鏄€忔槑绫诲瀷锛坱ransparent type锛夛紝net.IP 鐨勫畾涔夋槸锛歵ype IP []byte锛屾槸鍏跺叕鍏盇PI鐨勪竴閮ㄥ垎锛屼笉鍙洿鏀广€侭rad 涔熸湁鎻愬埌鏈変簺鏄綋骞存棭鏈熺殑璁捐锛屽綋鏃剁粡楠屼笉瓒筹紝鎴栨槸娌℃湁鑰冭檻濂姐€傜幇鍦ㄥ彈闄愪簬 Go1 鍏煎鎬ф壙璇猴紝宸茬粡鏃犳硶鏀瑰彉浜嗭紙鍏煎鎬т繚闅滅殑鍙屽垉鍓戯紵锛夈€傝繖鏄釜鐪熷疄鐗?鈥淓ating your own dog food鈥濓紝鎵€浠ュ湪 Tailscale 浠栧張閲嶆柊閫犱簡涓€涓疆瀛?inetaf/netaddr锛屾兂璐$尞鍑烘潵锛屽杩涙爣鍑嗗簱閲屻€傛湭鏉ユ兂瑕佺殑鏍峰瓙瀵规瘮琛ㄦ牸濡備笅锛氱壒鎬ц€佹柟妗?net.IP鏂版柟妗堜笉鍙樼殑鉂? slice鉁呭彲姣旂殑鉂? slice鉁呭崰鐢ㄧ┖闂村皬鉂岋紝28~56 瀛楄妭鉁咃紝鍥哄畾 24 瀛楄妭涓嶅湪鍫嗕笂鍒嗛厤鉂屸渽鏀寔 IPv4 鍜?IPv6鉁呪渽鍖哄垎 IPv4 鍜?IPv6鉂屸渽鏀寔 IPv6 鍖哄煙鉂屸渽涓嶉€忔槑鐨勭被鍨嬧潓鉁呬笌鏍囧噯搴撲簰閫氣渽馃し锛岄渶閫傞厤鏂规硶鎯宠鐨勬牱瀛愶紝鍏跺疄鏄?Brad 涓氬姟瀹炴垬鍑烘潵鐨勮瘔姹傦紝灏辨槸瑕佹敮鎸佸墠闈㈡彁鍒扮殑 7 鐐广€傝В鍐虫柟妗堝綋鍓嶇殑杩涘睍瀹炵幇鐨勭粨鏋滐紝涔熷氨鏄柊鏂规鍋氬嚭鏉ヤ簡锛屼粬灏辨槸 inetaf/netaddr 杩欎釜搴擄紙褰撶劧锛屼篃涓嶆帓闄ゆ槸缁撴灉鍊掓帹鐞嗚锛夈€傚苟涓斿湪 Go issues 涓彂璧?issues 鍜?proposal銆俁uss Cox 鍙戣捣浜嗘柊鎻愭鐨勮璁衡檧鉂封檧锛屽苟琚帴绾筹紝杩涘叆浜?Go1.18 鐨勬柊鐗规€у綋涓€傞噸閫犺繃绋嬫柊鐨?net/netip 搴撶殑姣忎竴涓€冮噺鐐癸紝Brad 閮藉湪鏂囩珷涓湁鎵€璇︾粏璁茶В銆傚彈闄愪簬绡囧箙锛屾垜浠嬁鍏朵腑涓ょ偣鏉ュ垎浜紝鏈夊叴瓒g殑灏忎紮浼村彲浠ラ槄璇诲師鏂囩殑鍓栨瀽閮ㄥ垎銆傛帴鍙g被鍨嬬粍鍚堝湪鍙瘮杈冭繖浜嬩笂锛孏o 鐨勬帴鍙o紙interface锛夊叾瀹炴槸鏀寔姣旇緝鐨勶紝涔熷氨鏄彲浠ヤ綔涓?map 鐨?key 杩涜 == 杩愮畻绗︾殑姣旇緝銆傚疄鐜颁簡濡備笅鐨勭涓€鐗堟柟妗堬紝璁捐浜嗘柊鐨?netaddr.IP 绫诲瀷锛歵ype IP struct { ipImpl}type ipImpl interface { is4() bool is6() bool String() string}type v4Addr [4]bytetype v6Addr [16]bytetype v6AddrZone struct { v6Addr zone string}涓婅堪浠g爜锛屽湪 IP 缁撴瀯浣撲腑澧炲姞浜?ipImpl 鎺ュ彛锛屾棦鑳芥敮鎸佹瘮杈冿紝杩樺彲浠ヤ笉瀵瑰鏆撮湶锛堜笉閫忔槑绫诲瀷锛夛紝涓斿彲浠ユ敮鎸?IPv6銆傛柊鐨勯棶棰樺湪浜庯紝铏界劧姣斿師鐢?net 灏忎簡锛屼絾杩樻槸娌¤揪鍒扮洰鏍囷紝杩樻槸鏈夊湪鍫嗕笂鍒嗛厤鐨勭己鐐广€傚厤鍒嗛厤鐨?24 瀛楄妭濡傛灉缁х画浣跨敤鎺ュ彛锛屾槸鏃犳硶瑙e喅鏍规湰鐩爣锛圔rad 鐨勭洰鏍囨槸 24 瀛楄妭锛夌殑銆傚洜涓烘帴鍙o紙interface锛夊崰鐢?16 瀛楄妭锛屽墿浣?8 涓瓧鑺傚彲浠ョ敤锛岃鏀惧涓嬩笢瑗匡細鍦板潃鏃忥紙v4銆乿6锛屾垨涓よ€呴兘涓嶆槸锛屽锛欼P 鐨勯浂鍊硷級锛岃嚦灏戦渶瑕?2 浣嶃€侷Pv6 鐨?zone 淇℃伅銆傝繕瑕佽兘姣旇緝锛屾樉鐒舵帴鍙f槸鏃犳硶瀹炵幇鐨勶紝鍥犱负鍦板潃+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 鍦ㄦ鎶曞叆浜嗗ぇ閲忕殑绮惧姏鍜岀爺绌讹紝杈惧埌浜嗘渶缁堢殑鐩爣銆傞櫎鍘诲簱鐨勫姛鑳藉锛屾湁璁稿鎶€鏈紭鍖栫偣鍊煎緱鎴戜滑瀛︿範鍜屽弬鑰冿紝鏈夊叴瓒f繁鍏ヤ紭鍖栭儴鍒嗙殑锛屽彲浠ラ槄璇伙細https://tailscale.com/blog/netaddr-new-ip-type-for-go/鏈枃浠嬬粛鐨勬柊 net/netip 搴撳皢浼氬湪 Go1.18 涓綔涓烘柊鐗规€у嚭鐜帮紝娆㈣繋澶у涓€璧峰涔犱氦娴侊細锛夎嫢鏈変换浣曠枒闂杩庤瘎璁哄尯鍙嶉鍜屼氦娴侊紝鏈€濂界殑鍏崇郴鏄簰鐩告垚灏憋紝鍚勪綅鐨勭偣璧炲氨鏄厧楸煎垱浣滅殑鏈€澶у姩鍔涳紝鎰熻阿鏀寔銆傛枃绔犳寔缁洿鏂帮紝鍙互寰俊鎼溿€愯剳瀛愯繘鐓庨奔浜嗐€戦槄璇伙紝鏈枃 GitHub github.com/eddycjy/blog 宸叉敹褰曪紝瀛︿範 Go 璇█鍙互鐪?Go 瀛︿範鍦板浘鍜岃矾绾匡紝娆㈣繋 Star 鍌洿銆?/p>