涓婄瘒鏂囩珷銆婃繁鍏ョ悊瑙?Go Slice銆嬶紝浣犱細鍙戠幇搴曞眰鏁版嵁缁撴瀯浣跨敤浜唘nsafe.Pointer銆傚洜姝わ紝鎴戞兂鍐嶆浠嬬粛涓€涓嬬浉鍏崇煡璇嗐€傚師鏂囧湴鍧€锛氬幓涓嶅畨鍏ㄣ€傛寚閽堬紝鏈夌偣涓嶅畨鍏ㄤ絾寰堜寒銆傚墠瑷€瀛︿範Go鐨勬椂鍊欙紝涓€瀹氬杩団€淕o鐨勬寚閽堜笉鏀寔鎸囬拡杩愮畻鍜岃浆鎹⑩€濈殑鐭ヨ瘑銆傝鐐广€備负浠€涔堬紵棣栧厛锛孏o鏄潤鎬佽瑷€锛屾墍鏈夌殑鍙橀噺閮藉繀椤绘槸鏍囬噺绫诲瀷銆備笉鍚岀殑绫诲瀷涓嶈兘杩涜璧嬪€笺€佽绠楃瓑璺ㄧ被鍨嬬殑鎿嶄綔銆傞偅涔堟寚閽堜篃瀵瑰簲浜嗙浉瀵圭被鍨嬶紝杩欎篃鍦–ompile鐨勯潤鎬佺被鍨嬫鏌ヨ寖鍥翠箣鍐呫€傚悓鏃堕潤鎬佽瑷€涔熺О涓哄己绫诲瀷銆備篃灏辨槸璇达紝涓€鏃﹀畾涔夛紝灏辨棤娉曟洿鏀广€傞敊璇ず渚媐uncmain(){num:=5numPointer:=&numflnum:=(*float32)(numPointer)fmt.Println(flnum)}杈撳嚭缁撴灉锛?command-line-arguments...:cannotconvertnumPointer(type*int)浠ラ敭鍏?float32鍦ㄧず渚嬩腑锛屾垜浠垱寤轰簡涓€涓€间负5涓旂被鍨嬩负int鐨刵um鍙橀噺銆傛嬁鍒版寚閽堢殑鍦板潃鍚庯紝鎴戝皾璇曞皢鍏惰浆鎹负*float32锛岀粨鏋滃け璐ヤ簡...unsafe瀵逛簬鍒氬垰鐨勨€滈敊璇ず渚嬧€濓紝鎴戜滑鍙互浣跨敤浠婂ぉ鐨勮嫳闆剈nsafe鏍囧噯搴撴潵瑙e喅銆傝繖鏄竴涓簡涓嶈捣鐨勫寘瑁广€傚湪瀹樻柟瑙i噴涓紝姒傝堪濡備笅锛氬洿缁旼o绋嬪簭鍐呭瓨瀹夊叏鍜岀被鍨嬬殑鎿嶄綔寰堝彲鑳芥槸涓嶅彲绉绘鐨勶紝涓嶅彈Go1鍏煎鎬ф寚鍗楃殑淇濇姢銆傜畝鍗曠殑璇达紝涓嶆帹鑽愮墰濂躲€傚洜涓哄畠鏄笉瀹夊叏鐨勶紙unsafe锛夛紝浣嗘槸鍦ㄧ壒娈婂満鏅笅锛岃繕鏄細鐢ㄥ埌鐨勩€傚畠鍙互鎵撶牬Go鐨勭被鍨嬪拰鍐呭瓨瀹夊叏鏈哄埗锛岃浣犺幏寰楁剰鎯充笉鍒扮殑鏁堟灉銆傪煒凱ointer涓轰簡瑙e喅杩欎釜闂锛岄渶瑕佺敤鍒皍nsafe.Pointer銆傚畠琛ㄧず浠绘剰绫诲瀷鐨勫彲瀵诲潃鎸囬拡鍊硷紝鍙互鍦ㄤ笉鍚岀殑鎸囬拡绫诲瀷涔嬮棿杩涜杞崲锛堢被浼间簬C璇█涓璿oid*鐨勭敤娉曪級銆傚畠鍖呭惈鍥涗釜鏍稿績鎿嶄綔锛氫换鎰忕被鍨嬬殑鎸囬拡鍊煎彲浠ヨ浆鎹负PointerPointer鍙互杞崲涓轰换鎰忕被鍨嬬殑鎸囬拡鍊紆intptr鍙互杞崲涓篜ointerPointer鍙互杞崲涓簎intptr杩欓儴鍒嗕富瑕佸叧娉ㄧ涓€鐐瑰拰绗簩鐐广€傚啀鎯虫兂濡備綍淇敼鈥滈敊璇殑渚嬪瓙鈥濅娇鍏剁敓鏁堬紵funcmain(){num:=5numPointer:=&numflnum:=(*float32)(unsafe.Pointer(numPointer))fmt.Println(flnum)}outputresult:0xc4200140b0鍦ㄤ笂闈㈢殑浠g爜涓紝鎴戜滑鍋氫簡涓€浜涙敼鍔ㄣ€傞€氳繃unsafe.Pointer鐨勭壒鎬т慨鏀规寚閽堝彉閲忥紝鍙互瀹屾垚浠绘剰绫诲瀷锛?T锛夌殑鎸囬拡杞崲銆傞渶瑕佹敞鎰忕殑鏄紝姝ゆ椂涓嶈兘鎿嶄綔鎴栬闂鍙橀噺銆傚洜涓轰笉鐭ラ亾鎸囬拡鍦板潃鎸囧悜鐨勬槸浠€涔堢被鍨嬬殑涓滆タ銆傛垜涓嶇煡閬撳畠鏄粈涔堢被鍨嬶紝浠ュ強濡備綍瑙f瀽瀹冦€傝В鏋愪笉浜嗭紝鑷劧灏辨病娉曟敼浜嗐€侽ffsetof鍦ㄤ笂涓€鑺備腑锛屾垜浠慨鏀逛簡鏅€氱殑鎸囬拡鍙橀噺銆傞偅涔堝畠鍙互鍋氫竴浜涙洿澶嶆潅鐨勪簨鎯呭悧锛熻緭鍏umstruct{istringjint64}funcmain(){n:=Num{i:"EDDYCJY",j:1}nPointer:=unsafe.Pointer(&n)niPointer:=(*string)(unsafe.Pointer(nPointer))*niPointer="鐐搁奔"njPointer:=(*int64)(unsafe.Pointer(uintptr(nPointer)+unsafe.Offsetof(n.j)))*njPointer=2fmt.Printf("n.i:%s,n.j:%d",n.i,n.j)}杈撳嚭锛歯.i:friedfish,n.j:2鍦ㄥ垎鏋愯繖娈典唬鐮佸仛浠€涔堜箣鍓嶏紝鎴戜滑闇€瑕佷簡瑙g粨鏋勪綋鐨勪竴浜涘熀鏈蹇碉細缁撴瀯浣撶殑鎴愬憳鍙橀噺瀛樻斁鍦ㄥ唴瀛樹腑涓婇潰鏄竴涓繛缁殑璁板繂缁撴瀯銆傚垵濮嬪湴鍧€鏄涓€涓垚鍛樺彉閲忕殑鍐呭瓨鍦板潃锛屾牴鎹粨鏋勭殑鎴愬憳鍦板潃璁$畻鍋忕Щ閲忋€傚彲浠ュ緱鍒板叾浠栨垚鍛樺彉閲忕殑鍐呭瓨鍦板潃鍐嶅洖鍒颁笂闈㈢殑浠g爜寰楀埌鎵ц娴佺▼锛氫慨鏀筺.i鐨勫€硷細i涓虹涓€涓垚鍛樺彉閲忋€傛墍浠ヤ笉闇€瑕佽绠楀亸绉婚噺锛岀洿鎺ユ妸鎸囬拡鍙栧嚭鏉ヨ浆鎹㈡垚Pointer锛屽啀寮哄埗杞崲鎴恠tring绫诲瀷鐨勬寚閽堝€煎嵆鍙慨鏀筺.j鐨勫€硷細j鏄浜屼釜鎴愬憳鍙橀噺銆傚湪淇敼鍐呭瓨鍦板潃涔嬪墠闇€瑕佽繘琛屽亸绉婚噺璁$畻銆傜粡杩囧亸绉绘搷浣滐紝褰撳墠鍦板潃宸茬粡鎸囧悜绗簩涓垚鍛樺彉閲忋€傜劧鍚庨噸澶嶈浆鎹㈠拰璧嬪€笺€傞渶瑕佹敞鎰忕殑鏄紝杩欓噷浣跨敤浜嗕互涓嬫柟娉曪紙瀹屾垚鍋忕Щ閲忚绠楃殑鐩爣锛夛細1.uintptr锛歶intptr鏄疓o鐨勫唴缃被鍨嬨€傝繑鍥炰竴涓彲浠ュ瓨鍌ㄥ畬鏁村湴鍧€鐨勬棤绗﹀彿鏁存暟銆傚悗缁父鐢ㄧ殑鎸囬拡鎿嶄綔绫诲瀷uintptruintptr2锛寀nsafe.Offsetof锛氳繑鍥炴垚鍛樺彉閲弜鍦ㄧ粨鏋勪綋涓殑鍋忕Щ閲忋€傛洿鍏蜂綋鍦拌锛屽畠杩斿洖缁撴瀯鐨勫垵濮嬩綅缃拰x涔嬮棿鐨勫瓧鑺傛暟銆傞渶瑕佹敞鎰忕殑鏄叆鍙侫rbitraryType浠h〃鐨勬槸浠绘剰绫诲瀷锛屼笉鏄畾涔夌殑int銆傚畠鐨勫疄闄呬綔鐢ㄦ槸杩欓儴鍒嗙殑涓€涓崰浣嶇funcOffsetof(xArbitraryType)uintptr锛屽叾瀹炲畠宸у鍦板埄鐢ㄤ簡Pointer鐨勭涓変釜鍜岀鍥涗釜鐗规€с€傝繖鏃跺€欏凡缁忓彲浠ュ鍙橀噺杩涜鎿嶄綔浜嗮煒勯敊璇ず渚媐uncmain(){n:=Num{i:"EDDYCJY",j:1}nPointer:=unsafe.Pointer(&n)...ptr:=uintptr(nPointer)njPointer:=(*int64)(unsafe.Pointer(ptr+unsafe.Offsetof(n.j)))...}杩欓噷鏈変釜闂锛寀intptr绫诲瀷涓嶈兘瀛樻斁鍦ㄤ复鏃跺彉閲忎腑銆傚洜涓轰粠GC鐨勮搴︽潵鐪嬶紝uintptr绫诲瀷鐨勪复鏃跺彉閲忓彧鏄竴涓棤绗﹀彿鏁存暟锛屽畠骞朵笉鐭ラ亾瀹冩槸涓€涓寚閽堝湴鍧€銆傚洜姝わ紝褰撴弧瓒虫煇浜涙潯浠舵椂锛屼复鏃跺彉閲弍tr鍙兘浼氳鍨冨溇鍥炴敹锛岄偅涔堟帴涓嬫潵鐨勫唴瀛樻搷浣滃矀涓嶆槸鐜勪箮锛熸€荤粨骞剁畝鍗曞涔犱袱涓煡璇嗙偣銆傞鍏堟槸unsafe.Pointer鍏佽浣犵殑鍙橀噺鍦ㄤ笉鍚岀殑鎸囬拡绫诲瀷涔嬮棿鍒囨崲锛屼篃灏辨槸璇达紝瀹冨彲浠ヨ〃绀轰负浠讳綍鍙鍧€鐨勬寚閽堢被鍨嬨€備簩鏄粡甯镐娇鐢╱intptr閰嶅悎unsafe.Pointer鍋氭寚閽堣繍绠椼€傚阀鐨勬槸鍜屾渶鍚庝竴鍙ヤ竴鏍凤紝濡傛灉娌℃湁鐗规畩闇€瑕佺殑璇濄€備笉寤鸿浣跨敤涓嶅畨鍏ㄧ殑鏍囧噯搴擄紝涓嶅畨鍏ㄣ€傝櫧鐒跺畠缁忓父寮曡捣浣犵殑娉ㄦ剰馃憣
