澶у濂斤紝鎴戞槸寤哄畤銆傚啓杩欑瘒鏂囩珷鐨勬椂鍊欐鍊煎ぇ骞村垵涓€锛屾湰鏉ユ兂璇碐o1.18杩欎釜鏈堝彂甯冦€備絾鏄紝濂藉浼欙紝Go1.18beta2宸茬粡鍙戝竷浜嗭紝瀹樻柟閫氱煡绀惧尯Go1.18瑕佹帹杩熷埌3鏈堜唤锛屽挄鍜曗€︹€﹀涓嬪浘锛氭墍浠ユ垜浠繕鏄缁х画瀛︿範鏂扮殑features锛屼粖澶╃偢楸间細缁撳悎BradFitzpatrick鎾版枃銆妌etaddr.IP: a new IP address type for Go銆嬬粰澶у鐪婫o1.18鏂扮綉搴搉鈥嬧€媏t/netip鐨勬潵鐢便€傚悗鍙板ぇ浣暀涓嬩簡鍘熸湰鍦℅o寮€鍙戠粍鐨凚radFitzpatrick銆?010骞村埌2020骞村湪Go鍥㈤槦宸ヤ綔锛?021骞存崲浜嗗叕鍙搞€傛帹鐗规秷鎭涓嬶細绂昏亴鍘熷洜鏄細鍋氬悓鏍风殑浜嬫儏澶箙浜嗭紝鏈夌偣鏃犺亰锛岃€屼笖鎴戜笉鎯抽櫡鍏ヨ垝閫傜殑鍥板銆傜幇鍦ㄥソ鍍忚浆鐢═ailscale鍋歐ireGuard鐩稿叧鐨勫伐浣滐紝缁忓父瑕佸拰缃戠粶搴撴墦浜ら亾銆傚ぇ姒叕鍙稿啓鐨凾ailscale鏈川涓婃槸涓€涓綉缁滃簲鐢ㄣ€傚缃戠粶鐨勫鐞嗭紝鏄敤Go鍐欑殑锛屼細娑夊強鍒版爣鍑嗗簱net锛氬湪鍗曚竴IP绫诲瀷涓婁娇鐢╪et.IP銆傚湪缃戠粶琛ㄧず涓婁娇鐢╪et.IPNet銆傜ず渚嬩唬鐮侊細import("fmt""net")funcmain(){fmt.Println(net.IPv4(8,8,8,8))}杈撳嚭缁撴灉锛?.8.8.8BradFitzpatrick鍦ㄥ疄闄呯紪鍐欏拰浣跨敤鏃讹紝鎴戝彂鐜皀et鏍囧噯搴撶殑绫诲瀷鏈夊緢澶氶棶棰橈紝浣跨敤璧锋潵闈炲父鍥伴毦銆傜幇鍦ㄦ槸浠€涔堥棶棰橈紵BradFitzpatrick鍦ㄦ枃绔犱腑鐩存帴鍒楀嚭浜嗘爣鍑嗗簱net.IP瀛樺湪鐨勯棶棰橈紝璁鸿瘉鍏呭垎銆傛€诲叡7涓ぇ闂锛氬畠鏄彲鍙樼殑銆俷et.IP鐨勫簳灞傜被鍨嬫槸[]byte锛岃繖鎰忓懗鐫€浣犱紶閫掔粰瀹冪殑浠讳綍涓滆タ閮藉彲鑳芥敼鍙樺畠銆傝繖鏄笉鍙瘮鐨勩€傚洜涓篏o涓殑鍒囩墖鏄笉鍙瘮杈冪殑锛岃繖鎰忓懗鐫€net.IP涓嶆敮鎸丟o鐨?=鎿嶄綔绗︾殑姣旇緝锛屼笉鑳戒綔涓簃apkey銆傚畠鏈変袱绉嶇被鍨嬬殑IP鍦板潃锛屽湪net.IP鎴杗et.IPAddr涔嬮棿杩涜閫夋嫨鍙兘浼氬緢鐑︿汉銆傚畠瓒呭ぇ銆侴o鐨刵et.IP鍖呭惈2閮ㄥ垎锛屽垎鍒槸24瀛楄妭鐨勫垏鐗囧ご鍜?/6瀛楄妭鐨処P鍦板潃銆傚湪net.IPAddr鐨勬儏鍐典笅锛屽畠杩樺皢鍖呭惈涓€涓猌one瀛楁銆傚畠鍦ㄥ爢涓婂垎閰嶅唴瀛樸€侴o鐨刵etpackage鍒板鍒嗛厤锛屾妸鏇村鐨勫伐浣滄斁鍦℅C涓娿€傚畠涓嶅彲瑙f瀽銆侴o鐨処P绫诲瀷鍦ㄤ粠瀛楃涓插舰寮忚В鏋怚P鏃舵棤娉曞尯鍒咺Pv4鏄犲皠鐨処Pv6鍦板潃鍜孖Pv4鍦板潃銆傚畠鏄€忔槑绫诲瀷锛宯et.IP鐨勫畾涔夋槸锛歵ypeIP[]byte锛岃繖鏄畠鐨勫叕鍏盇PI鐨勪竴閮ㄥ垎锛屼笉鑳芥敼鍙樸€侭rad杩樻彁鍒帮紝鏈変簺鏄棭鏈熻璁$殑锛屽綋鏃舵病鏈夌粡楠岋紝涔熸病鏈夎€冭檻濂姐€傜幇鍦ㄥ彈闄愪簬Go1鍏煎鎬ф壙璇猴紝鏃犳硶鏇存敼锛堝吋瀹规€т繚璇佸弻鍒冨墤锛燂級銆傝繖鏄竴涓湡瀹炵増鐨勨€滃悆鑷繁鐨勭嫍绮€濓紝鎵€浠ュ湪Tailscale浠栭噸鏂伴€犱簡涓€涓獁heelinetaf/netaddr锛屾兂璐$尞鍑烘潵锛屽杩涙爣鍑嗗簱銆備互鍚庢兂瑕佷粈涔堢殑瀵圭収琛ㄥ涓嬶細鑰佹柟妗坣et.IP鍜屾柊鏂规涓嶅彉鉂岋紝slice鉁呭彲姣斺潓锛宻lice鉁呭崰绌洪棿灏忊潓锛?8~56bytes鉁咃紝鍥哄畾鐨勫爢涓婁笉鍒嗛厤24涓瓧鑺傗潓鉁呮敮鎸両Pv4鍜孖Pv6鉁呪渽鍖哄垎IPv4鍜孖Pv6鉂屸渽鏀寔IPv6鍖哄煙鉂屸渽涓嶉€忔槑绫诲瀷鉂屸渽涓庢爣鍑嗗簱浜掓搷浣溾渽馃し锛岄渶瑕侀€傞厤浣犳兂瑕佺殑鏂瑰紡锛屽叾瀹烇紝灏辨槸Brad鐢熸剰鐨勮瘔姹傦紝灏辨槸瑕佹敮鎸佸墠闈㈣鐨?鐐广€傚綋鍓嶈В娉曡繘灞曠殑缁撴灉锛屼篃灏辨槸鍋氬嚭浜嗘柊鐨勮В娉曪紝灏辨槸搴搃netaf/netaddr锛堝綋鐒朵篃涓嶆帓闄ゆ槸缁撴灉鍙嶈浆鐞嗚锛夈€傚苟鍦℅o闂涓彂璧烽棶棰樺拰鎻愭銆俁ussCox鍙戣捣浜嗗鏂版彁妗堛€妏roposal: net/netaddr: add new IP address type, netaddr package (discussion)")銆嬬殑璁ㄨ锛屽苟琚帴绾充负Go1.18鐨勬柊鐗规€с€傞噸鏋勮繃绋嬩腑瀵规柊鐨刵et/netip搴撶殑姣忎竴涓€冭檻锛孊rad閮藉湪鏂囩珷涓繘琛屼簡璇︾粏鐨勮鏄庛€傜敱浜庣瘒骞呮湁闄愶紝鎴戜滑灏嗗垎浜叾涓殑涓ょ瘒銆傛劅鍏磋叮鐨勬湅鍙嬪彲浠ラ槄璇诲師鏂囩殑鍒嗘瀽閮ㄥ垎銆傛帴鍙g被鍨嬬殑缁勫悎鍦ㄥ彲姣旀€ф柟闈紝Go鐨勬帴鍙e叾瀹炴槸鏀寔姣旇緝鐨勶紝鍗冲彲浠ヤ綔涓轰竴涓猰ap鐨刱ey涓?=杩愮畻绗﹁繘琛屾瘮杈冦€傚疄鏂戒簡浠ヤ笅鏂规鐨勭涓€涓増鏈苟璁捐浜嗕竴涓柊鐨刵etaddr.IP绫诲瀷锛歵ypeIPstruct{ipImpl}typeipImplinterface{is4()boolis6()boolString()string}typev4Addr[4]bytetypev6Addr[16]bytetypev6AddrZonestruct{v6Addrzonestring}涓婇潰鐨勪唬鐮佸湪IP缁撴瀯涓坊鍔犱簡ipImpl鎺ュ彛锛屾棦鍙互鏀寔姣旇緝锛屽張鍙互涓嶆毚闇诧紙opaque绫诲瀷锛夛紝鍙互鏀寔IPv6銆傛柊鐨勯棶棰樻槸铏界劧姣攏ativenet灏忎簡锛屼絾鏄繕鏄病鏈夎揪鍒扮洰鐨勶紝杩樻槸鏈夊垎閰嶅湪鍫嗕笂鐨勭己鐐广€傚鏋滅户缁娇鐢ㄨ鎺ュ彛锛屽厤鍒嗛厤鐨?4瀛楄妭鏃犳硶瑙e喅鍩烘湰鐩爣锛圔rad鐨勭洰鏍囨槸24瀛楄妭锛夈€傚洜涓烘帴鍙o紙interface锛夊崰鐢?6涓瓧鑺傦紝鍓╀笅鐨?涓瓧鑺傚彲浠ョ敤锛屼笅闈㈢殑涓滆タ瑕佹斁锛氬湴鍧€鏃忥紙v4锛寁6锛宱rneither锛屽锛欼P鐨勯浂鍊硷級锛岃嚦灏?浣嶆槸蹇呴渶鐨勩€侷Pv6鐨勫尯鍩熶俊鎭€傝繕闇€瑕佽兘澶熸瘮杈冦€傚緢鏄庢樉锛屾帴鍙e疄鐜颁笉浜嗭紝鍥犱负address+zone淇℃伅涓嶈冻浠ヨ绠楀瓧鑺傛暟銆傛病鍔炴硶姝e紡鏄庣‘锛孊rad鎯冲埌浜嗕娇鐢ㄥ皝瑁呯殑鏂瑰紡锛歵ypeIPstruct{addr[16]bytezoneAndFamilyuint64}浣嗘槸杩欐牱鍋氭剰鍛崇潃zoneAndFamily瀛楁闇€瑕佽绠椾綅鏁帮紝鐒跺悗push鐩稿簲鐨勫€硷紝浣嗕笉涓€瀹氬お浠や汉娌抚銆傛渶鍚嶣rad鎯冲埌浜嗭紝鍙互浣跨敤鎸囬拡锛歵ypeIPstruct{addr[16]bytezoneAndFamily*T}鐒跺悗瀹氫箟3涓搴旂殑sentinel鍊兼潵搴旂敤锛歷ar(z0*intern.Value//琛ㄧず闆跺€笺€倆4=new(intern.Value)//琛ㄧずIPv4鐨剆entinel鍊紌6noz=new(intern.Value)//琛ㄧずIPv6鐨剆entinel鍊硷紙涓嶅甫zone锛夎繖鏍稩P绫诲瀷鍙互鍥哄畾涓?4瀛楄妭.缁间笂鎵€杩帮紝杩欎釜缃戠粶鍦板潃搴撲竴鑸敤鐨勬瘮杈冨皯銆備絾鏄疊radFitzpatrick鎶曞叆浜嗗ぇ閲忕殑鍔姏鍜岀爺绌朵互杈惧埌鏈€缁堢洰鏍囥€傞櫎浜嗗簱鐨勫姛鑳戒箣澶栵紝杩樻湁寰堝鎶€鏈笂鐨勪紭鍖栫偣鍊煎緱鎴戜滑瀛︿範鍜屽弬鑰冦€傚鏋滀綘鏈夊叴瓒f繁鍏ヤ紭鍖栵紝鍙互闃呰锛歨ttps://tailscale.com/blog/netaddr-new-ip-type-for-go/杩欑瘒鏂囩珷寮曞叆鐨勬柊鐨刵et/netip搴撳皢浣滀负涓€涓柊鐨勫嚭鐜癎o1.18涓殑鍔熻兘銆傛杩庡ぇ瀹朵竴璧峰涔犱氦娴侊細锛夋湁浠€涔堥棶棰樻杩庡湪璇勮鍖哄弽棣堜氦娴併€傛渶濂界殑鍏崇郴鏄浉浜掓垚灏便€傛偍鐨勫ソ璇勬槸鍒朵綔鐐搁奔鏈€澶х殑鍔ㄥ姏锛屾劅璋㈡偍鐨勬敮鎸併€傛枃绔犳寔缁洿鏂颁腑銆傚彲浠ュ井淇℃悳绱€愯剳琛ョ偢楸笺€戦槄璇汇€傛湰鏂囧凡鏀跺綍鍦℅itHubgithub.com/eddycjy/blog涓€傚涔燝o璇█鍙互鐪婫o瀛︿範鍦板浘鍜岃矾绾裤€傛杩庢槦鏄熸彁閱掋€?/p>
