锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Golang鐨勭儹鏇存柊閲囩敤浠涔堟満鍒? 浣跨敤go1.8鎻愪緵鐨刾lugin鍖呮満鍒跺疄鐜?/p> plugin鍖呮湰韜璁$殑鐩殑鏄儹鏇存柊涔? plugin鍖呭叾瀹炲彧鏄敮鎸佸皢浠g爜鍒嗗埆緙栬瘧涓哄涓姩鎬佸簱,鍔ㄦ佸姞杞藉悗榪愯 騫朵笉鑳藉畬鍏ㄦ敮鎸佺被浼糃/C++鐨勫姩鎬佸簱鏂瑰紡澶勭悊浠g爜 甯︾姸鎬佺殑榪涚▼鐑洿鏂扮殑鍩烘湰姒傚康鍙婅寖鍥存槸浠涔? 鏁版嵁閮ㄥ垎(model)涓嶆洿鏂? 鍙洿鏂伴昏緫閮ㄥ垎(鍑芥暟) 琛ㄦ牸鍜岄厤緗洿鏂扮畻鐑洿鏂頒箞? 綆? 浣嗕笉鏄湰鏂囨弿榪拌寖鍥?/p> 鐑洿鏂拌兘鍦╳indows涓婁嬌鐢ㄤ箞? 涓嶆敮鎸?/p> 鎴戣兘灝嗗師鏉ヤ竴涓猠xe鐨勪唬鐮佺紪璇戜負so鎻愪緵緇檖lugin浣跨敤涔? 鍙互, 浣嗘槸蹇呴』浠嶇劧淇濈暀main鍖呬綔涓烘彃浠跺叆鍙? 騫跺湪main鍖呭唴娣誨姞鎻愪緵緇檖lugin璋冪敤鍏ュ彛. 濡傛灉鍔ㄦ佸簱涓病鏈塵ain鍖? 緙栬瘧鍑虹殑so鑳界敤涔? 涓嶈兘, 鍖呭繀欏誨寘鍚玬ain, 鍚﹀垯杈撳嚭鐨勬槸.a鐨勬枃浠? plugin鍖呭姞杞戒細鎶ラ敊 鍔ㄦ佸簱涓? 闈瀖ain鍖呯殑鐨勪唬鐮佷慨鏀硅兘鍋氱儹鏇存柊涔? 涓嶈兘!(宕╂簝浜嗗惂, 鎴戞彁浜嗕竴涓猧ssue: https://github.com/golang/go/issues/20554) 濡傛灉紜疄鍋氫簡淇敼, 搴曞眰浼氭姤閿? plugin was built with a different version of package 瑙e喅鏂規硶: 淇敼plugin鍖呭簳灞傚疄鐜板茍閲嶆柊緙栬瘧 鎵撳紑runtime/plugin.go, 娉ㄩ噴浠ヤ笅浠g爜 for _, pkghash := range md.pkghashes { if pkghash.linktimehash != *pkghash.runtimehash { return "", nil, pkghash.modulename } } 鎵ц/usr/local/go/run.bash 閲嶇紪璇?嫻嬭瘯 浠g爜涓摢浜涘彲浠ヨ鏇存柊? 鏂規硶鍙互琚洿鏂頒箞? 闂寘鍛? 鍙兘鏇存柊鎷ユ湁闈欐佸湴鍧鐨勭粨鏋?渚嬪: 鍖呯駭鍒嚱鏁?綾諱技浜庨潤鎬佸嚱鏁? 渚嬪: svc_0.so閲屾湁涓涓狥oo鍑芥暟, svc_1.so淇敼浜咶oo鍑芥暟瀹炵幇, 鐑洿鏂板彲瀹炵幇 闂寘=鍑芥暟+鎹曡幏鍙橀噺, 瀹為檯涓婃槸涓涓姩鎬佺粨鏋? 娌℃湁闈欐佸湴鍧, 鏃犳硶琚洿鏂?/p> 鍚勭鍖呯駭鍒彉閲? 緇撴瀯浣撳彉閲? 緇撴瀯浣撴柟娉? 灞閮ㄥ彉閲忓潎涓嶈兘琚儹鏇存柊, 浣嗘槸鍙橀噺鍊間笉浼氳褰卞搷 鏂板緇撴瀯鍙互琚繍琛?/p> 浣跨敤緇撴瀯浣撴柟娉曡皟鐢ㄤ簡鍖呯駭鍒嚱鏁? 鍖呯駭鍒嚱鏁拌兘琚洿鏂頒箞? 鍙互, 铏界劧鏂規硶涓嶈兘琚洿鏂? 浣嗘柟娉曡璋冪敤鐨勫寘綰у埆鍑芥暟鐨勫湴鍧鏄浐瀹氱殑, 鎵浠ュ彲浠ヨ鐑洿鏂?/p> init鍖呭垵濮嬪寲鍑芥暟鑳界敤涔? 鑳借鐑洿鏂頒箞? 瀹樻柟榪欐牱鎻忚堪: 鎻掍歡絎竴嬈¤鎵撳紑鏃? 鍏跺叧鑱旂殑, 娌℃湁鎴愪負紼嬪簭鐨勪竴閮ㄥ垎鐨勬墍鏈夌殑鍖呯殑init鍑芥暟灝嗚璋冪敤. 鎻掍歡鐨刴ain鍑芥暟涓嶄細琚皟鐢? 鎻掍歡鍙細琚垵濮嬪寲涓嬈? 涓嶈兘琚叧闂?/p> 鍥犳, 闇瑕佹墜鍔ㄥ皢init鍑芥暟鏀規垚鑷繁鐨勫嚱鏁? 緇熶竴鍦╯o鐨刴ain鍖呴噷璋冪敤 濡備綍緙栬瘧鑾峰緱plugin鍖呮敮鎸佺殑鍔ㄦ佸簱 -buildmode=plugin鏄噸瑕佸弬鏁?/p> --ldflags閲岀殑-pluginpath鐨勪綔鐢ㄦ槸: 姣忔緙栬瘧鐨勫唴閮ㄨ瘑鍒礬寰勯兘鏄笉鍚岀殑, 閬垮厤閲嶅鍔犺澆鐨勮鍛?/p> 鐩鎬綅鎶鏈ぇ瑙勬ā鍑虹幇鍦ㄩ瓟鍏戒笘鐣學LK鐗堟湰, 鐜板湪搴旂敤宸茬粡騫挎硾搴旂敤鍦ㄥ悇縐峂MORPG娓告垙涓? 涓嬮潰瀵圭浉浣嶆妧鏈殑鍋氭硶榪涜綆鍗曞綊綰蟲眹鎬?/p> 鏃╂湡鍓湰鐨勫嚭鐜? 閬垮厤鎶㈡棶棰? 鎵浠? 鍓湰鍏跺疄鏈韓灝辨槸涓縐嶇浉浣嶆妧鏈? 鍙笉榪囧疄鐜版椂, 鎴戜滑涓鑸細灝嗗皬闃熷拰鎬墿鐩存帴棰勫垎閰嶅湪鐙珛鐨勪竴涓壇鏈疄渚嬩腑(鎵浠ュ壇鏈師鏂囦篃鏄疄渚嬬殑鎰忔? 鐩鎬綅鎶鏈繕娌℃湁姝e紡鍛藉悕鏃? 鍚屼竴涓満鏅? 鐜╁榪涘埌涓嶅悓鐨勫垎綰跨湅鍒扮殑鐜╁涓嶄竴鏍? 涔熸槸灞炰簬鐩鎬綅鐨勪竴縐? 褰撶劧, 濡傛灉鏄粍闃熺帺瀹? 鏈嶅姟鍣ㄩ粯璁や細鍒嗛厤鎵鏈夐槦浼嶇帺瀹跺湪鍚屼竴涓嚎(浣嶉潰) 鍓湰鐩鎬綅鍜屽垎綰跨浉浣嶅叾瀹為兘鏄潤鎬佺浉浣? 涓鏃﹁繘鍏? 涓斾笉浼氭湁鍒囨崲鎴栬呮販鍚堟煡鐪嬬殑榪囩▼. 鐪熺浉浣嶅彲浠ュ湪涓涓満鏅腑,鍔ㄦ佸垏鎹㈢浉浣? 鐩鎬綅鍐呭拰鐩鎬綅澶栨墍浠ヤ笉鍚?/p> 鎴戜滑甯歌鐨勭湡鐩鎬綅琛ㄧ幇涓? 鐩鎬綅涓殑瑙掕壊+鐜╁+闃熶紞鎴愬憳 鍦ㄦ姢閫佷換鍔℃椂, 榪樹細鍦ㄤ笂闈㈡墍瑙佽鑹蹭腑鍙犲姞涓栫晫涓殑鎵鏈夎鑹? 涔熷氨鏄, 浣犲拰闃熶紞鎴愬憳鍙互鐪嬪埌鐨勮鑹? 鍏朵粬浜虹湅涓嶅埌, 鍏朵粬浜轟篃鐪嬩笉鍒頒綘鍜屼綘鐨勯槦浼嶆垚鍛?/p> 涓轟簡娓呮櫚鐨勭畝鍗曠殑鎻忚堪, 鎴戜負鐩鎬綅鍒涘緩濡備笅姒傚康涓庡悕璇?/p> 琛ㄧ幇涓洪櫎鐜╁澶栫殑瑙掕壊(鎬墿,浜や簰鐗╀綋涓庣浉浣嶅彲瑙佸満鏅? 榪欐槸鏈甯歌鐨勪竴縐嶇浉浣嶅唴瑙掕壊 鎸佹湁鍙橀噺 鍙朠hasingID鏃?涓篜hasingTargetID 鐢熸垚瑙勫垯 褰撶帺瀹跺紑鍚浉浣嶅悗, 鍦ㄧ帺瀹剁浉浣嶅唴鐢熸垚鐨勮鑹?/span>涓虹鏈夊浣? 姝ゆ椂, 灝?PhasingTargetID璁劇疆涓虹浉浣嶇敓鎴愯呯殑瀹炰緥ID 鍒犻櫎瑙勫垯 濡傛灉鐜╁閫鍑虹浉浣? 縐佹湁瀹綋浼氬瓨鍦ㄤ竴孌墊椂闂存垨鎸夌収闇姹傚垹闄?/p> 涓鑸寚鎻愬墠鏀劇疆鍦ㄥ満鏅腑, 涓栫晫鍐呬笉鍙, 浣嗘槸鑳借鍚岀浉浣嶇帺瀹跺彲瑙?涓斿悓鐩鎬綅鐜╁閮藉彲浠ヤ簰鐩稿彲瑙?姣斿: 鍙鎺ヤ簡鍚屼竴涓換鍔$殑鐜╁, 閮藉彲浠ョ湅鍒扮殑NPC 鎸佹湁鍙橀噺 鍙朠hasingID鏃?涓篜ublicPhasingID 鐢熸垚瑙勫垯 閫氳繃鍦烘櫙緙栬緫鍣? 鏀劇疆瑙掕壊鏃? 璁劇疆鍏跺彲琚瀵熷埌鐨勪換鍔D 瑙掕壊琚姞杞藉悗, 灝嗕換鍔D璁劇疆鍒癝taticPhasingID 鍒犻櫎瑙勫垯 鍦烘櫙鍒犻櫎, 瑙掕壊鍒犻櫎 鍖呭惈鐜╁涓庡悓闃熶紞鐜╁ 寮鍚浉浣嶅悗, 鍙縐佹湁瀹綋+鍏湁瀹綋 闃熼暱瑙嗕負鐩鎬綅涓諱綋, 鍗曚漢鏃? 鑷繁涓洪槦闀?/p> 闃熶紞鍏朵粬鎴愬憳鍏變韓闃熼暱鐨勭鏈夌浉浣嶅浣?/p> 闃熶紞鍏朵粬鎴愬憳鏍規嵁鑷繁鐨凱ublicPhasingID鍖歸厤鐩爣瀵硅薄鐨凱ublicPhasingID鏃跺彲浜掔浉鍙 鎸佹湁鍙橀噺 鐩鎬綅寮鍚椂, 鍙朠hasingID鏃? 涓鴻鑹插疄渚婭D 鐩鎬綅鍏抽棴鏃? 鍙朠hasingID鏃? 涓? PublicPhasingID 褰撲袱涓鑹茬殑PhasingID鐩哥瓑鏃? 涓諱綋涓庣鏈夊浣撲簰鐩稿彲瑙?/p> 褰撲袱涓鑹茬殑PublicPhasingID鐩哥瓑鏃? 涓諱綋涓庡叕鏈夊浣撲簰鐩稿彲瑙?/p> 鍙互閫氳繃寮鍏寵緗? 鏄惁鍦ㄥ彲瑙佺殑鐩鎬綅瀹綋鍩虹涓? 鍙犲姞涓栫晫瑙掕壊(鎶ら佷換鍔? 鎴戜滑瀵笹olang鐨勭粨鏋勪綋鍙橀噺璧嬪? 浠ュ強鍗曞弬鏁板嚱鏁拌皟鐢ㄨ繘琛屽弽灝勫拰native鎿嶄綔鐨勬祴璇?pre> === RUN TestNativeAssign 鍚勪綅鐪嬪畼蹇呴』鍚愭Ы鐢╢or鏉ラ亶鍘嗚幏鍙栨暟鎹? 浣嗗喎闈欎笅鏉ュ垎鏋? 榪欐牱鍋氭棤鍙帤闈? 寮鍙戞晥鐜囷細Windows涓嬪彲浠ラ氳繃VisualStudio榪涜寮鍙戯紝鍏朵粬騫沖彴鍙互浣跨敤MonoDevelop錛岄潪甯告柟渚?/p> 榪愯鏁堢巼錛欽IT鐨勬ц兘浼樺寲姣旇緝鍒頒綅錛岃兘閫傚簲90%鎬ц兘鐜 閮ㄧ講渚挎嵎鎬э細鍙互閫氳繃浜ゅ弶緙栬瘧鐢熸垚鍏朵粬騫沖彴鐨勫彲鎵ц鏂囦歡錛岄氳繃mono榪愯鍙墽琛屾枃浠?/p> 璋冭瘯渚挎嵎鎬э細VisualStudio鍜孧onoDevelop璋冭瘯鍧囧緢鏂逛究錛?榪樺彲榪滅▼璋冭瘯 涓婃墜搴︼細瀵笴緋昏璦鐔熸倝鐨勫嚑澶╁氨鍙笂鎵?/p> 鐑洿鏂幫細鍙互閫氳繃DLL鏂瑰紡榪涜 Web瀵規帴錛氬彲鍋氾紝浠g爜姣旇緝鍟板棪 宕╂簝澶勭悊錛氬彲閫氳繃try catch鎹曡幏閿欒 緗戠粶搴撶紪鍐欓毦搴︼細涓鑸紝闇娉ㄦ剰gc闂 絎笁鏂圭綉緇滃簱鍙婃鏋舵暟閲忥細涓鑸?/p> 寮鍙戞晥鐜囷細楂?/p> 榪愯鏁堢巼錛氬茍鍙戜笂闈炲父鏈変紭鍔匡紝瀵笴PU鍒╃敤鐜囨瘮杈冮珮錛屽師鐢熻繍琛屾棤铏氭嫙鏈?/p> 閮ㄧ講渚挎嵎鎬э細涓嬈$紪璇戝埌澶勮繍琛岋紝鏃犱換浣曡繍琛屽簱渚濊禆 璋冭瘯渚挎嵎鎬э細瀹為檯鎿嶄綔涓紝鍗曠嚎紼嬫寕鎺ヨ皟璇曞櫒鍙錛?浣嗗彉閲忔樉紺轟笉姝g‘錛屽紑鍙戞湡鍩烘湰閲囩敤鏃ュ織鏂瑰紡榪涜鏌ラ敊 涓婃墜搴︼細璇█綆鍗曪紝鐗規у皯錛?鏂版墜1鍛ㄨ兘璐$尞浠g爜 鐑洿鏂幫細鏃犳硶榪涜鐑洿鏂幫紝璇█鏃犳硶緙栬瘧涓篋LL錛屼篃涓嶆敮鎸丏LL鍔犺澆錛坙inux騫沖彴鐨?so鍔犺澆蹇界暐涓嶈錛?/p> Web瀵規帴錛氶潪甯告柟渚匡紝 浠g爜綺劇畝 宕╂簝澶勭悊錛氬穿婧冨悗浠ュ懡浠よ鏂瑰紡鎵撳嵃鍑烘爤錛岀▼搴忓唴鍙互鎹曡幏浠諱綍宕╂簝閿欒騫剁戶緇繍琛?/p> 緗戠粶搴撶紪鍐欓毦搴︼細綆鍗曪紝姣擟 socket鏇寸畝鍗?/p> 絎笁鏂圭綉緇滃簱鍙婃鏋舵暟閲忥細鍋忓皯 寮鍙戞晥鐜囷細鍩轟簬鍔ㄦ佽璦鐨勫紑鍙戝垵嬈″啓姣旇緝蹇紝鍚庢湡緇存姢鍜岄噸鏋勪細鑰楄垂涓瀹氱殑鏃墮棿鍦ㄦ煡閿欎笂 榪愯鏁堢巼錛氬熀浜巐ua jit鐨勮繍琛屾晥鐜囪繕鏄兘鎺ュ彈鐨?/p> 閮ㄧ講渚挎嵎鎬э細鏂逛究錛?鍙湁搴曞眰淇敼闇瑕侀噸鏂扮紪璇戯紝 澶ч儴鍒嗘椂闂村彧鐢ㄦ洿鏂發ua鏂囦歡 璋冭瘯渚挎嵎鎬э細涓嶆槸寰堟柟渚匡紝鍩轟簬鏃ュ織鏂瑰紡榪涜鏌ラ敊 涓婃墜搴︼細lua璇█鐗規ф湁閮ㄥ垎鍜孋緋昏璦鏈変竴瀹氬樊寮傦紝鍩轟簬Actor妯″瀷鐨勬濇兂瀛︿範錛岄傚簲闇瑕佽楄垂涓瀹氱殑鏃墮棿 鐑洿鏂幫細綾諱技浜嶦rlang錛屽彲綺劇‘鍒板嚱鏁扮駭鐨勭儹鏇存柊 Web瀵規帴錛氭湁涓浜沨ttp鏀寔錛岄氳繃紺懼尯鎱㈡參榪涜瀹屽杽 宕╂簝澶勭悊錛歭ua澶╃敓鍙互鎹曡幏閿欒 緗戠粶搴撶紪鍐欓毦搴︼細鑷甫錛屾棤闇緙栧啓 絎笁鏂圭綉緇滃簱鍙婃鏋舵暟閲忥細閫氳繃紺懼尯鎱㈡參瀹屽杽 寮鍙戞晥鐜囷細緙栬瘧鎱紝鏂囦歡澶氾紝閫氱敤搴撳皯 榪愯鏁堢巼錛歯ative閫熷害鏍囨潌 閮ㄧ講渚挎嵎鎬э細緙栧啓鍚勭被鐨刴ake闂ㄦ杈冮珮 璋冭瘯渚挎嵎鎬э細鍙氳繃VisualStudio榪涜Windows騫沖彴璋冭瘯 涓婃墜搴︼細2~3騫寸粡楠岀殑鐔熸墜浠嶇劧浼氬啓鍑哄穿婧冨拰娉勯湶浠g爜 鐑洿鏂幫細鍙氳繃DLL榪涜 Web瀵規帴錛氫唬鐮佸暟鍡︼紝絎笁鏂瑰簱灝?/p> 宕╂簝澶勭悊錛歐indows涓嬪彲浣跨敤SEH鎹曡幏孌靛紓甯革紝鍏朵粬騫沖彴鍙兘閫氳繃宕╂簝鍚庤繘琛宑oredump鍒嗘瀽錛屽閿欓潪甯稿樊 緗戠粶搴撶紪鍐欓毦搴︼細鍩轟簬asio緙栧啓杈冧負綆鍗曪紝浣嗘諱綋鐪嬫潵闅懼害涓嶄綆 絎笁鏂圭綉緇滃簱鍙婃鏋舵暟閲忥細杈冨 浠ヤ笅鏄緱鍒?/p> 浠庡彂鏂囨椂鐨勯」鐩榪欎簺璇█浣跨敤鐜囨潵璇達紝Java錛孍rlang錛孋++緙栧啓鐨勬湇鍔″櫒杈冨錛孏olang錛孞avaScript錛孋#鏄浜屾闃燂紝Skynet鐢變簬涓婃墜涓嶆槸寰堝鏄擄紝鎵浠ヤ粎鏈変袱浣嶆暟鐨勫洟闃熷湪浣跨敤錛屼絾鎬諱綋琛ㄧ幇榪樻槸姣旇緝鍑鴻壊鐨? 瀵逛簬鑰佸洟闃燂紝 C++鐨勬湇鍔″櫒宸ュ叿閾懼拰妗嗘灦宸茬粡鐩稿鎴愮啛錛?瀹屽叏娌″繀瑕佹洿鎹㈡柊璇█錛?鍙槸鍦ㄥ鎺dk鎰熻鍥伴毦鏃訛紝鍙互灝濊瘯Golang榪欎簺瀵箇eb鏈変紭鍔跨殑璇█榪涜娣峰悎璇█寮鍙? 瀵逛簬鏂板洟闃燂紝寮鍙戞晥鐜囷紝涓婃墜搴﹀拰閮ㄧ講鏁堢巼鏄紭鍏堥夋嫨鐨勶紝C#錛孏olang錛孞avaScript榪欎簺鏂板叴璇█浼氳浣犱簨鍗婂姛鍊? 瀵逛簬澶ц妯℃棤闇閫夋湇鐨勬湇鍔″櫒錛?Skynet鐨刟ctor妯″瀷瀵規墿灞曚細姣旇緝瀹規槗 瀵逛簬澶у叕鍙革紝濂介」鐩紝涓婄嚎鍚庨渶瑕侀氳繃鐑洿鏂拌繘琛宐ug淇ˉ鐨勶紝C#錛孋++錛孍rlang浼氭槸棣栭? 浣嗘葷殑涓鐐癸紝 榪樻槸鏍規嵁鍥㈤槦鐔熸倝搴︽潵閫夋嫨璇█錛岃錘鐒剁殑浣跨敤鏂拌璦鐨勯闄╀篃鏄緢澶х殑
]]>
]]>鍩烘湰姒傚康
浠g爜鍙婄粨鏋?/h1>
When a plugin is first opened, the init functions of all packages not already part of the program are called. The main function is not run. A plugin is only initialized once, and cannot be closed
緙栬瘧
SVCNAME=$1 SVCVER=$2 TIMESTAMP=`date '+%Y%m%d_%H%M%S'` go build -v -buildmode=plugin --ldflags="-pluginpath=${SVCNAME}_${TIMESTAMP}" -o ${SVCNAME}_${SVCVER}.so ${SVCNAME}
]]>琛ㄧ幇鍒嗙被
鍓湰鐩鎬綅
鍒嗙嚎鐩鎬綅
鐪熺浉浣?/h3>
鐩鎬綅瀹綋
縐佹湁瀹綋
鍏叡瀹綋
鐩鎬綅涓諱綋
鍙瑙勫垯
綰︽潫
]]>
package main
import (
"reflect"
"testing"
)
type data struct {
Hp int
}
const AssignTimes = 100000000
func TestNativeAssign(t *testing.T) {
v := data{Hp: 2}
for i := 0; i < AssignTimes; i++ {
v.Hp = 3
}
}
func TestReflectAssign(t *testing.T) {
v := data{Hp: 2}
vv := reflect.ValueOf(&v).Elem()
f := vv.FieldByName("Hp")
for i := 0; i < AssignTimes; i++ {
f.SetInt(3)
}
}
func TestReflectFindFieldAndAssign(t *testing.T) {
v := data{Hp: 2}
vv := reflect.ValueOf(&v).Elem()
for i := 0; i < AssignTimes; i++ {
vv.FieldByName("Hp").SetInt(3)
}
}
func foo(v int) {
}
const CallTimes = 100000000
func TestNativeCall(t *testing.T) {
for i := 0; i < CallTimes; i++ {
foo(i)
}
}
func TestReflectCall(t *testing.T) {
v := reflect.ValueOf(foo)
for i := 0; i < CallTimes; i++ {
v.Call([]reflect.Value{reflect.ValueOf(2)})
}
}
鎬ц兘嫻嬭瘯鏁版嵁
鈥?PASS: TestNativeAssign (0.03s)
=== RUN TestReflectAssign
鈥?PASS: TestReflectAssign (0.41s)
=== RUN TestReflectFindFieldAndAssign
鈥?PASS: TestReflectFindFieldAndAssign (9.86s)
=== RUN TestNativeCall
鈥?PASS: TestNativeCall (0.03s)
=== RUN TestReflectCall
鈥?PASS: TestReflectCall (21.46s)
嫻嬭瘯璇勬祴
// FieldByName returns the struct field with the given name
// and a boolean to indicate if the field was found.
func (t *structType) FieldByName(name string) (f StructField, present bool) {
// Quick check for top-level name, or struct without anonymous fields.
hasAnon := false
if name != "" {
for i := range t.fields {
tf := &t.fields[i]
if tf.name == nil {
hasAnon = true
continue
}
if *tf.name == name {
return t.Field(i), true
}
}
}
if !hasAnon {
return
}
return t.FieldByNameFunc(func(s string) bool { return s == name })
}
璇曟兂濡傛灉reflect鍖呭湪鎴戜滑浣跨敤ValueOf鏃朵嬌鐢╩ap緙撳啿濂戒竴涓粨鏋勪綋鎵鏈夊瓧孌電殑璁塊棶鏁版嵁鍚? 鑲畾璁塊棶鎸囧畾瀛楁閫熷害浼氬緢蹇?br>浣嗘槸, 浠ョ┖闂存崲閫熷害鐨勯渶姹傚叾瀹炴渶澶氭弧瓚充簡1%鐨勯渶姹?
鍚屾牱鐨勪緥瀛愭槸鍥懼艦API閲岃闂甋hader鍙橀噺鐨勬柟娉? 鎬繪槸榛樿浣跨敤瀛楃涓茶幏鍙? 閫熷害寰堟參. 褰撲綘鎯沖揩閫熻闂椂, 璇鋒彁鍓嶆寜闇緙撳瓨瀛楁
閭d箞, Golang浣跨敤鐨勪篃鏄繖鏍風殑鎬濊礬. 铏界劧鏆村姏浜嗕竴鐐? 浣嗘槸鑳藉璁╃▼搴忚窇瀵? 鎬ц兘浼樺寲鐨勪笢瑗挎斁鍦ㄤ箣鍚庢潵鍋? 緙撳啿涓嬪氨鍙互瑙e喅
鍥犳, 鎴戜滑鍦ㄥ鉤鏃朵嬌鐢ㄥ弽灝勬椂, 灝介噺鍋忓悜浜庡弽灝勫彉閲忕紦鍐插瓨鍦ㄤ笅鐨勫彉閲忚祴鍊兼垨鑰呰幏鍙?br>鑰岃皟鐢ㄧ殑闇姹傚敖閲忓噺灝? 濡傛灉鏈塯oroutine瀛樺湪鐨勬儏鍐典笅, 鍒欎笉蹇呭お澶氭媴蹇?
]]>C#
Golang
Skynet(lua+C)
C++
func server() {
pipe := cellnet.NewEventPipe()
evq := socket.NewAcceptor(pipe).Start("127.0.0.1:7234")
socket.RegisterSessionMessage(evq, coredef.TestEchoACK{}, func(content interface{}, ses cellnet.Session) {
msg := content.(*coredef.TestEchoACK)
log.Println("server recv:", msg.String())
ses.Send(&coredef.TestEchoACK{
Content: proto.String(msg.String()),
})
})
pipe.Start()
}
func client() {
pipe := cellnet.NewEventPipe()
evq := socket.NewConnector(pipe).Start("127.0.0.1:7234")
socket.RegisterSessionMessage(evq, coredef.TestEchoACK{}, func(content interface{}, ses cellnet.Session) {
msg := content.(*coredef.TestEchoACK)
log.Println("client recv:", msg.String())
})
socket.RegisterSessionMessage(evq, coredef.SessionConnected{}, func(content interface{}, ses cellnet.Session) {
ses.Send(&coredef.TestEchoACK{
Content: proto.String("hello"),
})
})
pipe.Start()
}
欏圭洰鍦板潃: https://github.com/davyxu/cellnet
棣栧厛鎴戜滑鏉ョ湅涓?/p>
鍋囪A瑕佹妸鍐呭浼犺緭緇橞
1. B鐢熸垚RSA鐨勫叕閽ュ拰瀵嗛挜, 榪欐槸鎴愬鍑虹幇鐨? 瀵嗛挜鐢盉淇濆瓨, 鎶婂叕閽ュ憡璇堿
2. A鐢˙鐨勫叕閽ュ姞瀵嗗唴瀹? 騫舵妸瀵嗘枃鍐呭浼犺緭緇橞
3. B鐢ㄥ瘑閽ヨВ瀵?/p>
璇佹槑鏌愪釜鍐呭鏄綘鍙戠殑, 鑰屼笉鏄鍒漢鍐掑悕欏舵浛, 渚嬪git鐨刾ush涓氨甯︽湁榪欎釜鍔熻兘
鍋囪A鏈夊唴瀹? B瑕侀獙璇佸唴瀹圭‘瀹炵敱A鍙戝嚭
1. A鐢熸垚鍏挜鍜屽瘑閽?/p>
2. A灝嗗唴瀹瑰仛涓涓猦ash, 鎶奾ash鐮佺敤鑷繁鐨勫瘑閽ュ姞瀵嗗茍鎶婅繖孌靛瘑鏂囧彂緇橞
3. B鐢ˋ鐨勫叕閽ュ瀵嗘枃榪涜楠岃瘉, 鍗沖彲紜瀵嗘枃鏄惁鐢盇鍙戝嚭
鍙互鐪嬪嚭, 涓ょ鐢ㄦ硶閮芥槸鍏稿瀷鐨勯潪瀵圭О鐢ㄦ硶
浣哖P鍔╂墜鍗村共浜嗕歡紲炲鐨勪簨鎯?
鍦≒P SDK瀹樻柟鏂囨。閲? 鎴戜滑鎵懼埌浜哖HP璇█鐨勯獙璇佹柟娉? 鏂規硶閲屼嬌鐢ㄤ簡榪欐牱涓涓狝PI
浠庡畼鏂規枃妗g湅寰楀嚭榪欎釜浣跨敤openssl鐨勭畻娉曞簱
綾諱技鐨? 榪樻湁Java, C++, Python璇█鐨勫鐞嗘柟娉?/p>
鍏朵腑, C++涔熸槸鐢ㄧ殑openssl, Python鍒欐槸闇瑕侀緙栬瘧C搴擄紝鍦║buntu涓嬮渶瑕佹墜宸atch M2Crypto鐨刜ssl.c鏂囦歡.
鍏堜笉璇磋繖浜涢潪姝h鐨勭紪璇?patch鏂規硶浼氶犳垚澶氬ぇ鐨勯棶棰? 鍗曞氨榪欎釜鐢ㄥ叕閽ヨВ瀵嗗氨寰堣泲鐤?/p>
浠庝箣鍓嶇殑RSA綆楁硶涓簡瑙? 鍙湁瀵瑰叕閽ヨ繘琛岄獙璇佺殑鏂規硶, 涔熷氨鏄彧鑳藉緱鍒版槸榪樻槸涓嶆槸鐨勭粨鏋? 浣哖P鐨凷DK鍒欒姹傚繀欏葷敤鍏挜瑙e瘑鈥?/p>
瑙e嚭鐨勬暟鎹負涓孌礿son, 浠ュ姣旀槸鍚︽湁璁㈠崟綃℃敼.
閭d箞榪欑鍋氭硶灝辯瓑鏁堜簬, 鐢ㄦ渶綆鍗曠殑寮傛垨+涓涓叕閽ヨ繘琛岃鍗曞姞瀵? 鐒跺悗鍚屾牱鐢ㄨ繖涓叕閽ヨ繘琛岃В瀵?/p>
鍙笉榪囩敤RSA鎰熻寰堥珮綰р?/p>
榪欑鍋氭硶涓鏃﹀叕閽ュ湪PP鍔╂墜鏈嶅姟鍣ㄦ垨鑰呯帺瀹剁殑寮鍙戞湇鍔″櫒, 鐢氳嚦婧愪唬鐮佹硠闇? 閭d箞椹笂灝辨湁寰堝ぇ鐨勪吉閫犺鍗曠殑鍗遍櫓
鎴戞妸榪欎釜鍋氭硶鍙戠粰鏈嬪弸鐪? 浠栦滑璇? 鍏跺疄PP鍔╂墜鐨勫紑鍙戣呭彧綆$敤浜哛SA, 璺熶紶杈撲笉鏄槑鏂囧氨濂戒簡, 鑷充簬浠涔堜俊鎭畨鍏? 閮芥槸灞?
鍦ㄦ垜浠殑娓告垙欏圭洰涓嬌鐢ㄧ殑golang鏈嶅姟鍣ㄥ紑鍙戞柟寮忓涓?/p>
1.澶氱嚎紼嬮昏緫
2.鍚屾闃誨. 涔熷氨鏄, 姣忎釜浜轟竴涓嚎紼?goroutine), io綰跨▼=閫昏緫綰跨▼
榪欑鏂瑰紡鐨勪紭鐐?
1. 鍚屾闃誨鏂瑰紡涓庝漢鐨勬濈淮鏂瑰紡綾誨悓
2. 閫昏緫澶勭悊鎬ц兘鏈変竴瀹氭彁鍗?/p>
鍦ㄥぇ瑙勬ā浣跨敤榪欑妯″紡緙栧啓閫昏緫鍚? 鎴戜滑鍙戠幇浜嗚繖縐嶆ā寮忓彧鏈?涓己鐐? 緙栧啓鑰呴渶瑕佸鐞嗗綰跨▼鍏崇郴
浣嗚繖鏈韓紜疄鐩存帴鑷村懡鐨? 鍥炴兂C++鏃朵唬, 澶氱嚎紼嬪鐞嗘椂, 璋冭瘯閲嶇幇鐨勫洶闅鋸?鑴戣ˉ鏅薄澶儴涓嶆暍鐩磋
鍦–++鏃朵唬, 鎴戞浘緇忕紪鍐欒繃涓濂梐sio鐨凜++鏈嶅姟鍣ㄦ鏋? 閲囩敤io澶氱嚎紼? 閫昏緫鍗曠嚎紼? 渚濊禆鐫C++楂樻ц兘鐨勪紭鍔? 璁╁紑鍙戜究鎹風畝鍗曚笖鏃犻渶鍏沖績綰跨▼闂.
閭d箞鍒頒簡golang鏃朵唬, 涓轟粈涔堜笉鑳借瘯涓嬪崟綰跨▼寮傛澶氳繘紼嬫柟寮忔潵緙栧啓閫昏緫?
涓庡綰跨▼鍚屾闃誨瀵規瘮鍚? 鎴戜滑鍙戠幇, 涓よ呬紭緙虹偣浜掕ˉ. 閭h繖灝卞洖鍒頒簡棰嗗煙閫夊瀷闂浜? 瀵逛簬娓告垙鏈嶅姟鍣ㄩ渶瑕佺殑涓婃墜綆鍗? 寮鍙戜究鎹? 鍘嬪姏闄嶄綆(闈濵MO)榪欎簺鐗圭偣鏉ヨ, 鍗曠嚎紼嬪紓姝ュ榪涚▼鍐嶅悎閫備笉榪囦簡
閭d箞, 鎴戜滑鍦ㄧ敤golang緙栧啓鍗曠嚎紼嬪紓姝ュ榪涚▼鏈嶅姟鍣ㄥ簲璇ユ敞鎰忓摢浜涚偣鍛?
1. socket澶勭悊瀹屽叏灝佽, 鍙氳繃channel鎶涘嚭鍒伴昏緫綰跨▼鎺掗槦澶勭悊
2. 鏁版嵁搴? rpc鍙婂叾浠杋o澶勭悊, 涓寰嬫敼涓哄紓姝ュ洖璋冩ā寮? 涓嶄嬌鐢ㄥ悓姝ユ帴鍙?/p>
3. 鐜╁瀛樼洏鎻愪氦鏁版嵁鍙互鑰冭檻澶嶅埗騫舵彁浜ゅ埌瀛樼洏綰跨▼鏂瑰紡, 鎻愰珮鎬ц兘.
4. 閲囩敤澶氳繘紼嬫灦鏋? 姣斿璁劇綉鍏寵繘紼? 鎶奿o鍘嬪姏鍒嗘暎鍒拌繘紼嬩腑
5. 閫昏緫緙栧啓涓? 涓嶅厑璁鎬嬌鐢╣o寮綰跨▼鍙奵hannel, 鏈夐渶瑕佹彁楂樻ц兘閮ㄥ垎闇瑕佸崟鐙紪鍐?/p>
cellnet鍦ㄥ紑鍙戞椂鏈潵鑰冭檻浣跨敤actor妯″瀷鏉ヨ繘涓姝ョ畝鍖栧綰跨▼閫昏緫鐨勯夯鐑? 緇忓巻浜嗕竴孌墊椂闂寸殑鍘熷瀷寮鍙戝悗, 鍙戠幇浜嗕竴浜涢棶棰? 鍒椾婦濡備笅:
1. golang鐨勫己綾誨瀷涓嶉傚悎actor妯″瀷榪欑緇忓父闇瑕佸姩鎬佺敓鎴愬悇綾繪秷鎭殑妯″瀷, 浣唖kynet(C+lua)/erlang灝辨湁澶╃敓浼樺娍
2. actor妯″瀷鏈韓涓嶆槸涓囪兘鐨? 涓嶈兘瑙e喅鎵鏈夐渶姹? 鐗瑰埆鏄父鎴?/p>
3. actor妯″瀷鐞嗚В鍒板簲鐢ㄦ湁涓瀹氱殑闅懼害. 鏈韓榪橀渶瑕佹惌寤烘鏋? 涓婃墜澶嶆潅
鎬諱箣, 鐪嬭繃涓浜沞rlang鍙妔kynet鐨勭敤渚? 娌℃湁搴旂敤鐨勫緢綰涓旀垚鐔熺殑鎴愬姛actor妯″瀷妗堜緥, 浠庝紶緇焥ocket鏈嶅姟鍣ㄦ鏋惰法瓚婂埌actor妯″瀷浼氭壇鍒拌泲, 鍥犳, 鍚庢湡cellnet浼氳冭檻鍥炲綊鍒版垚鐔熺殑socket鏈嶅姟鍣ㄦ鏋? 鎶婃灦鏋勫仛鍒扮畝鍗曚笂鎵? 楂樻墿灞曚笂.
娓告垙瀹㈡埛绔噰鐢–ocos2dx-Lua鐨勭函Lua緙栧啓閫昏緫, 鏈嶅姟鍣ㄩ噰鐢℅olang浣滀負寮鍙戣璦
娓告垙綾誨瀷綾諱技浜嶤OC,鍥犳鏃犻渶閫夋湇. 闇瑕佷嬌鐢ㄥぇ鏈嶅姟鍣ㄦ灦鏋勮繘琛屽鐞?
閲囩敤Mongodb鍋氭寔涔呭瓨鍌? redis鍋氳法鏈嶉氫俊鏁版嵁浜ゆ崲
浣跨敤UCloud鐨勪簯鎶鏈? 鐪佸幓浜嗙儲浜虹殑榪愮淮宸ヤ綔
瀹㈡埛绔拰鏈嶅姟鍣ㄩ氳浣跨敤HTTP鐭繛鎺? 鍩轟簬json鐨勬暟鎹皝鍖呭崗璁?
鏈嶅姟鍣ㄩ棿澶ч噺浣跨敤Golang鑷甫鐨刯son+rpc榪涜閫氫俊
鏈嶅姟鍣ㄧ被鍨嬪ぇ鑷村垎涓洪昏緫鏈嶅姟鍣?鎴樻枟鏈嶅姟鍣? 涓績鏈嶅姟鍣?
閫昏緫鏈嶅姟鍣ㄨ礋璐f棩甯擱昏緫鍙婂叕鍏遍昏緫澶勭悊(濂藉弸, 鍏細)
1涓昏緫鏈嶅姟鍣ㄥ搴斾竴涓尯, n涓尯鍧囦嬌鐢║cloud浜慚ongodb榪涜鏁版嵁瀛樺偍
鎴樻枟鏈嶅姟鍣ㄦ槸涓涓泦緹? 闆嗙兢浼氳繑鍥炰竴涓礋杞芥渶浣庣殑鏈嶅姟鍣ㄨ繑鍥炰嬌鐢?
鎴樻枟鏈嶅姟鍣ㄩ氳繃cgo鎶鏈笌瀹㈡埛绔疌++/lua鐨勬垬鏂楅昏緫榪涜閫昏緫澶嶇敤, 鍦ㄦ鎶鏈笂榪涜
鎴樻枟閫昏緫鐨勬牎楠?
瀹㈡埛绔櫥闄嗗墠, 鍦ㄤ腑蹇冩湇鍔″櫒榪欓噷鑾峰緱鍙櫥闄嗙殑閫昏緫鏈嶅姟鍣ㄥ湴鍧, 鍚屾椂鍋氫竴涓礋杞藉潎琛?
鐭繛鎺?
鐢變簬鎿嶄綔緋葷粺鐨勬妧鏈秼浜庣ǔ瀹? 鍚屾椂, 鎵嬫父鐨勫急浜や簰鍨嬪鑷寸殑娓告垙鏋舵瀯瓚嬩簬綆鍗? 鍥犳緗戠粶璐熻澆涓嶅啀鏄父鎴忔湇鍔″櫒鎶鏈殑鐡墮. 浠庣粡楠岀湅鏉? 娓告垙鏈嶅姟鍣ㄦ妧鏈? 鏇撮噸瑕佺殑鏄繕鏄湅鏁版嵁搴撶殑閫夊瀷鍙婂鐞嗘柟寮?
铏界劧Mongodb鐨勬ц兘涓婁笉濡傚唴瀛樻暟鎹簱. 浣嗘槸浠庡瓨鍌ㄥ畨鍏ㄦт笂瑕佹瘮涓漢鎼緩鐨勫唴瀛樻暟鎹簱綆鍗? 瀹夊叏
澶栧姞涓婁簯鎶鏈殑寮曠敤, 鎬ц兘鐨勭摱棰堝拰榪愮淮鐨勬妧鏈鏉傚害榪庡垉鑰岃В
Redis鐢ㄤ簬璺ㄦ湇鏁版嵁浜や簰閭f槸鍐嶅ソ涓嶈繃鐨勬暟鎹腑浠嬩簡, 淇濊瘉閫熷害鍜岀ǔ瀹氭? 緇濆涓嶆槸閫犺疆瀛愯兘姣旀嫙鐨?
鐭繛鎺ュ湪鎵嬫父涓婂鐞嗚搗鏉ユ瘮闀胯繛鎺ョ畝鍗曚竴浜? 鏃犻渶鍋氭柇綰塊噸榪? 鏈嶅姟鍣ㄧ殑搴曞眰涔熸槸鐢盙olang鐨勬鏋跺簱淇濊瘉璐ㄩ噺鐨? 鍥犳璐熻澆姣棤闂. 鏈嶅姟鍣ㄥ鍐呭強瀵瑰鍧囦嬌鐢╦son榪涜鏁版嵁浜ゆ崲, 綆鍖栦簡鍗忚澶勭悊. 涔熸柟渚夸簡璋冭瘯
json rpc鐨勬ц兘鎹熻楀浜庢暣涓昏緫鐨勫鐞嗘潵璇村潎鍙互蹇界暐涓嶈
鎴戜滑鐨勯」鐩竴鐩翠嬌鐢∕ySQL浣滀負鏁版嵁搴? 鏃犺鏄粠C++鐨勬湇鍔″櫒, 榪樻槸鍒癎olang鏈嶅姟鍣? 褰撳勾鎼炴湇鍔″櫒鏃? 鐪嬪ぇ閮ㄥ垎浜洪兘鏄敤SQL(MySQL/SQLServer), 鑰孧ongo鎰熻鍍忛偑鏁欎竴鏍? 鍐嶅姞涓婃湇鍔″櫒榪樻槸Linux姣旇緝姝g粺, 鎵浠ユ灉鏂変簡MySQL.
鍒氬紑濮嬫劅瑙?娓告垙鏈嶅姟鍣ㄧ殑鏁版嵁瀛樺偍鍏跺疄搴旇鏄洰紲炲湥鐨勮繃紼? 閭d箞澶氱殑鏁版嵁, 闇瑕佹寜鐓ySQL涓鏍峰垎琛? 鍒嗗瓧孌靛瓨鍌? 涓轟簡鏌ヨ, 榪樿涔栦箹鐨勫涓涓婼QL鐨勮娉?/p>
灝辮繖涔堟姌鑵句簡鍑犲勾. 鍦ㄤ簯DB鐨勮挋钄戒笅, 涓鐩磋涓篗ySQL灝辨槸鍋氭父鎴忔湇鍔″櫒瀛樺偍鐨勪笓涓氭妧鏈? 鍒嗗竷寮忓拰瀛樺偍鍘嬪姏涓瀹氫氦緇欎簯DB鏉ュ仛. 鐩村埌鐪熸璇曚簡涓婲oSQL鍦ㄦ父鎴忔湇鍔″櫒寮鍙戦噷鐨勬濊礬.
鐢ㄤ簡Golang, 鎵嶅彂鐜板悓姝ュ啓閫昏緫鏄涔堢殑浼橀泤.
鐢ㄤ簡NoSQL緋誨垪鐨勬暟鎹簱, 鎵嶆剰璇嗗埌: 娓告垙鏈嶅姟鍣ㄧ殑鏁版嵁瀛樺偍鍜屾父鎴忔湇鍔″櫒鐨勫瓨鐩樹袱涓蹇靛樊寮傚叾瀹炶洰澶х殑.
MySQL涓? 鑳屽寘鍏跺疄璺熻鑹插畬鍏ㄦ病鏈夊叧緋? 鍙槸閫氳繃1涓鑹瞚d鏄犲皠榪囧幓, 浜轟負鐨勫壊瑁備簡鏁版嵁鐨勫叧鑱旀? 榪樼‖鐢熺敓鐨勬暣鍑轟釜姒傚康鍙粨鏋勫寲鏌ヨ璁╀綘瀛?/p>
NoSQL涓? 鍙槸鎶婃暟鎹簱褰撴垚鏄瓨鍌ㄧ偣, 姣忎釜瑙掕壊鐨勬暟鎹槸瀹屾暣鐨勪竴鍧? 閲岄潰鎬庝箞瀛橀殢浣犱究. 姣忎釜瑙掕壊閫氳繃id鏉ユ煡璇? 鍏朵粬閮芥病鏈変簡
浜庢槸涔? 娓告垙寮鍙戝彉寰楀紓甯哥畝鍗? MySQL瑙掕壊榪涢棬鏌ヨ4~5嬈℃墠鑳芥悶瀹氳鐨勬暟鎹?鑰孨oSQL涓鍙f皵鍏ㄦ煡鍑烘潵, 瀛樼洏涔熸棤闇澧為噺, 鐩存帴瀛樼洏灝卞彲浠ヤ簡
鎵浠ョ幇鍦ㄨ寰? NoSQL鐨勬濊礬瀵逛簬娓告垙鏈嶅姟鍣ㄥ瓨鍌ㄦ潵璇寸畝鐩存槸瀹岀編鐨?
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
NoSQL涓嬪疄鐜版柟妗堝緢澶? 娓告垙甯哥敤鐨勫氨榪欎箞3瀹? mongo, redis, memcached
涓嬮潰璇翠笅浼樼己鐐?/p>
紓佺洏鏄犲皠鍐呭瓨鏁版嵁搴?/p>
value涓篸ocument綾誨瀷, 鍩轟簬BSON鐨剉alue搴忓垪鍖?/p>
搴旂敤鍦烘櫙:
閫傚悎澶氬啓灝戣, 渚嬪鏃ュ織鍜屽浠?/p>
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
鍐呭瓨鏁版嵁搴?/p>
鍗曟牳
value闄愬埗512M
澶氱value綾誨瀷, 娓告垙鐢ㄩ斾嬌鐢ㄧ鏈夌殑搴忓垪鍖栧崗璁?渚嬪protobuf)
鏀寔钀藉湴(bgsave)
鐢ㄦ埛: 鏂版氮, 娣樺疂, Flickr, Github
搴旂敤鍦烘櫙: 閫傚悎璇誨啓閮藉緢楂? 鏁版嵁澶勭悊澶嶆潅絳?/p>
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
鍐呭瓨鏁版嵁搴?/p>
澶氭牳
value闄愬埗1M
涓嶆敮鎸佽惤鍦?鎸佷箙鍖?
鐢ㄦ埛: LiveJournal銆乭atena銆丗acebook銆乂ox
搴旂敤鍦烘櫙: 鍔ㄦ佺郴緇熶腑鐨勭紦鍐? 閫傚悎澶氳灝戝啓
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
memcached 閫傚悎緗戦〉緙撳啿, 娓告垙閲屽緢灝戞湁浣跨敤. 鐩墠鍙湁鑵捐浜戞敮鎸佷簯memcached
redis闈炲父閫傚悎娓告垙鐨勫唴瀛樻暟鎹簱, 浣嗘槸钀藉湴絳栫暐浼氭瘮杈冨鏉? 闇瑕佸叿浣撳垎鏋? 鍙互鍙傝冨悗闈㈢殑閾炬帴鐪嬩笅浜戦鎬庝箞澶勭悊榪欎釜闂
mongo鏁版嵁搴撳湪鏃╂湡榪樻槸闈炲父涓嶉敊鐨凬oSQL鐨勬暟鎹簱. 宸ュ叿姣旇緝鏂逛究, 鍙鍖? 浣嗘槸闅忕潃榪戝勾鏉ユ父鎴忕殑騫跺彂搴﹁秺鏉ヨ秺楂? 鎵浠ヤ負浜嗕竴嬈″埌浣? 寰堝浜鴻繕鏄夋嫨浜唕edis
涓嬪浘鍙傝冭嚜鐭ヤ箮闂. 閾炬帴鍦ㄥ悗闈㈡湁鎻愮ず, 鑻ヤ鏡鏉冭鑱旂郴鍒犻櫎
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
http://blog.codingnow.com/2014/03/mmzb_redis.html
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
Memcache,Redis,MongoDB錛堟暟鎹紦瀛樼郴緇燂級鏂規瀵規瘮涓庡垎鏋?/p>
http://blog.csdn.net/suifeng3051/article/details/23739295
http://www.zhihu.com/question/31417262
鍥炴兂浜嗕笅, goroutine鐨勮皟搴﹁鍒? 1.4涔嬪墠, 鍦ㄧ鍒皊yscall鏃? goroutine浼氳璋冨害騫跺鐞? 1.4鍚? 鍙鏈夊嚱鏁拌皟鐢ㄦ椂, 鍧囦細榪涜涓嬈¤皟搴? 瀵嗗害姣斾互鍓嶅鍔犱簡, 鏇村姞鎺ヨ繎鐪熺嚎紼嬬殑澶勭悊.
鏍規嵁榪欎釜鍘熺悊, 闂搴旇鍑虹幇鍦ㄦ湇鍔″櫒搴曞眰娌℃湁緇欑郴緇熸彁渚涜皟搴︽満浼氱殑鐐逛笂. 鎴戜滑鐨勬湇鍔″櫒閫氳繃涓涓猙ool鍨嬬殑chan榪涜闃誨, 璁╂湇鍔″櫒緇存寔闃誨榪涜娑堟伅澶勭悊涓嶉鍑? 浣嗘槸鏈榪戜負浜嗗湪windows涓嬫彁渚涘懡浠よ鏀寔, 澧炲姞浜嗕竴浜涗唬鐮? 濡備笅
1: func WaitForExit() {
2:
3: if len(peerMap) == 0 {
4: log.Println("no peer running, exit!")
5: return
6: }
7:
8: // 鍛戒護琛屽姛鑳藉彧鍦╳indows涓嬪惎鐢?/span>
9: if runtime.GOOS == "windows" {
10: reader := bufio.NewReader(os.Stdin)
11:
12: var running bool = true
13:
14: go func() {
15: select {
16: case <-exitChan:
17: running = false
18: }
19: }()
20:
21: for running {
22: data, _, _ := reader.ReadLine()
23: command := string(data)
24:
25: dispatchConsoleCommand(command)
26: }
27: } else {
28: // Linux鐜
29: <-exitChan
30: }
31:
32: }
鎴戞殏鏃跺睆钄戒簡鏂板姞鐨勮繖濂楀姛鑳? 緇存寔<-exitChan, 闂椹笂瑙e喅
緇撳悎鍓嶉潰鐨勭寽嫻? 鎴戜及璁″湪reader.ReadLine()鍑芥暟鍐? 娌℃湁緇欏簳灞傛彁渚涜皟搴︾殑鏈轟細, 瀵艱嚧鍏朵粬goroutine鏃犳硶榪愯, 閫犳垚鏈嶅姟鍣ㄥ崱姝?/p>
鎶鏈璁虹兢: 309800774 嬈㈣繋golang鐖卞ソ鑰呭姞鍏? 綰妧鏈爺璁?/p>
鍩轟簬C/C++娓告垙鏈嶅姟鍣ㄦ鏋舵諱綋璁捐鐨勮繕鏄笉閿欑殑, 鍏勫紵浠諱綋浣跨敤鏁堟灉閮芥槸濂借瘎. 鍥犱負鍦ㄦ妧鏈笂鍠滄"鍋鋒噿", 鎵浠ュ湪寰堝璁捐涓? 閮芥槸鍔涙眰綆鍗? 楂樻晥(寮鍙戞晥鐜?.
鍩轟簬浠誨姟鐨勫紓姝B鏌ヨ緋葷粺, 甯﹀閲嶅紓姝ョ殑鍚屾
浠g爜紺轟緥:
1:
2: void BatchQueryPlayerInfo( uint32 ClientID, const std::string& AccountName, int64 CharID )
3: {
4: GDBExecutor->Commit
5: (
6: dynamic_cast<DBDataTask*>( (new DBQueryCharInfo( ClientID, CharID ) )
7: ->LinkAtomTask( new DBQueryQuest( ClientID, CharID ) )
8: ->LinkAtomTask( new DBQuerySkill( ClientID, CharID ) )
9: ->LinkAtomTask( new DBQueryHero( ClientID, CharID ) )
10: ->LinkAtomTask( new DBQueryAccountInfo( ClientID, AccountName ) )
11: ->LinkAtomTask( new DBQueryEquip( ClientID, CharID ) )
12: ->LinkAtomTask( new DBQueryObject( ClientID ,CharID ) )
13: ->LinkAtomTask( new DBQueryLevel(ClientID, CharID))
14: ->LinkAtomTask( new DBQueryChapter(ClientID, CharID))
15: ->LinkAtomTask( new DBQueryActivity( ClientID, CharID ))
16: )
17: );
18:
19: }
榪欐涓昏澶勭悊鐜╁鍦ㄧ櫥闄嗘椂, 闇瑕佷粠DB鏌ヨ澶ч噺鐨勪笉鍚屽垎綾葷殑鏁版嵁. 涓轟簡淇濊瘉鏁堢巼, 鎴戣姣忎釜Task騫惰鎵ц, 鐒跺悗閫氳繃涓涓満鍒? 璁╂墍鏈変換鍔″畬鎴愬悗, 鍥炶皟絎竴涓換鍔$殑涓涓嚱鏁? 榪欐牱灝辨棤闇鎵嬪姩瀹炵幇寰堝綺樺悎浠g爜, 閬垮厤浜嗗弽澶嶈皟璇曞拰閿欒
鍩轟簬protobuf鍙嶅皠鏈哄埗鐨勮鍙ヨ嚜鍔ㄥ悎鎴?/strong>
1: DBUpdateCharInfo::DBUpdateCharInfo( int64 CharID, const std::string& Buffer )
2: {
3: char buffer[256];
4:
5: sprintf( buffer, "update tb_char set $FIELD$ where charid = %lld;", CharID );
6:
7: ExecuteCommand( buffer, Buffer, dbopr::FET_Equation );
8: }
榪欐灝辨槸涓涓吀鍨嬬殑DB浠誨姟, 鏋勯犲嚱鏁版彁渚涗簡CharID鍜屼竴涓敱緇撴瀯浣撳簭鍒楀寲濂界殑buffer, $FIELD$瀛楁, 鏄氳繃鍙嶅皠鏍規嵁Buffer鍐呭, 鑷姩濉厖瀛楁
榪欐渚嬪瓙涓? $FIELD$鍙互濉厖涓?hp=100, mp=100涔嬬被鐨? 鑷姩濉厖閬垮厤浜嗗洜涓烘坊鍔犲瓧孌電殑鍒板娣誨姞浠g爜, 榪橀渶瑕佽皟璇? 瀹規槗鎼為敊
閰嶇疆緋葷粺姒傚康
鍩轟簬鍚屼竴涓厤緗郴緇? 鍒嗗眰瀹炵幇涓嶅悓鐨勯渶姹? 鏇寸畝鍗曠殑璇? 瑙e喅鐨?涓疄闄呴棶棰樻槸:
鑷繁鏀逛簡閰嶇疆鏂囦歡涓殑ip, 涓婁紶svn鍚? 瑕嗙洊浜嗗埆浜虹殑閰嶇疆, 寰堝浜虹殑瑙e喅鏂規硶閮芥槸, 鏈湴閰嶇疆涓嶆彁浜? 浣嗗悓鏃墮棶棰樺張鏉ヤ簡:
褰撻厤緗腑鏈夊埆浜烘柊鍔犵殑緋葷粺閰嶇疆, 鎬庝箞淇濊瘉姣忎釜浜洪兘鑳芥洿鏂板埌?
涓婄嚎鍚? 鏈嶅姟鍣ㄤ氦浠樿繍緇? 浠栦滑浼氬閰嶇疆鏈変竴瀹氱▼搴︾殑淇敼, 榪欎釜鏃跺欐庝箞鍚堝茍紼嬪簭閰嶇疆鍜岃繍緇撮厤緗?
鍏跺疄瀵逛簬鍐茬獊鐨勯渶姹? 鍙瀵圭郴緇熻繘琛屽垎灞傚氨鍙互瑙e喅闂,鎴戠殑澶勭悊鏂瑰紡:
閰嶇疆鍒嗕負:
鍏ㄥ眬閰嶇疆: 鎵鏈夋湇鍔$殑鎬諱綋閰嶇疆
鍗曟湇鍔¢厤緗? 鏈湇鍔$殑閰嶇疆, 娑夊強緗戠粶鍙婇昏緫
鏈湴閰嶇疆: 榪欎釜閰嶇疆姣忎釜浜轟竴浠? 涓嶄笂浼燬VN
鍛戒護琛岄厤緗? 鏍煎紡鍜屽墠闈㈢殑涓鑷? 榪欏潡灝卞彲浠ラ氳繃榪愮淮榪涜閰嶇疆
鎬諱綋緇撴瀯鍏跺疄灝辨槸OO鐨勬淳鐢熸蹇? 涓嬪眰鍙互瑕嗙洊, 淇敼涓婂眰鐨勯厤緗?/p>
鏈嶅姟鍣ㄤ簰鑱斿強璇嗗埆妗嗘灦
鍩烘湰鍔熻兘: 鍩轟簬涓浜涚畝鍗曠殑閰嶇疆灝卞彲浠ュ皢澶氬彴鏈嶅姟鍣? 鍚岀綾葷殑涓嶅悓鏈嶅姟鍣ㄤ簰鐩歌繛鎺ヨ搗鏉? 鏂嚎鑷姩閲嶈繛.
鏈嶅姟鍣ㄨ繛鎺ュ悗, 鎵鏈夋湇鍔″櫒鍙煡鏅撳茍鍙嚜鍔ㄦ寜闇榪炴帴
閫昏緫绔篃寰堟柟渚跨殑榪涜騫挎挱鎴栬呭崟鐙彂閫佺瓑
涔熷氨鏄, 姣忎釜鏈嶅姟鍣ㄧ殑榪炴帴鍜屾帴鍙楃閮芥槸甯﹁瘑鍒悕縐版垨id鐨?
鍚庨潰瑙夊緱榪欏涓滆タ瀹炲湪鏄仛鐨勫鏉? 澶氭暣鍑轟竴鍙頒腑蹇冩湇鍔″櫒鏉ュ仛. 浣嗗ソ姝規鏋剁ǔ瀹氫笅鏉ヤ簡, 涔熷氨濂戒簡.
鍩轟簬lua鐨勬湇鍔″櫒web鍚庡彴妗嗘灦
鎬濇兂鏄緢涓嶉敊鐨? C++ 閰嶅悎lua鏈韓緇濆鏄釜澶辮觸
闂鍑哄湪web澶勭悊,鏈韓閮芥槸涓涓悓姝ラ樆濉炶繃紼? 鑰岃繖涓悗鍙版鏋舵槸寮傛鏂瑰紡鏉ュ仛, 鎵浠ョ壒鍒埆鎵?/p>
涓嶈繃姣旇搗浠ュ墠鐨勬湰鍦癎M緋葷粺, 榪欏潡鐨勮璁℃槸浼熷ぇ鐨勮繘姝?/p>
鐜板湪姝e湪璁捐鍩轟簬golang鐨勬湇鍔″櫒妗嗘灦, 鍩烘湰妗嗘灦宸茬粡瀹屽伐, 絳夊緟緙栧啓閫昏緫鍚庣殑瀹炴垬嫻嬭瘯
浠ヤ笂鐨勫緢澶氭濇兂鍦╣olang鐨勬湇鍔″櫒妗嗘灦閮芥湁鏀硅繘, 鐗瑰埆鏄痝olang鏈韓鍋歸eb涔熸槸浼樼鐨? 澶栧姞martini榪欑鐗沊妗嗘灦, 鏇存槸姘村埌娓犳垚
濡傛灉浣犲鏈嶅姟鍣ㄦ鏋惰璁℃湁鐗瑰埆鐨勮璇? 鎴栬呮兂紕版挒鎬濇兂, 鍙互鍔犲崥瀹㈢兢 309800774鎴栬呮垜鐨剄q: 20998333璁ㄨ
浣嗛粯璁ゅ洜涓烘壘涓嶅埌git鑰屾姤閿欍?瑙e喅鏂規硶濡備笅錛?/p>
鍦?a title="http://git-scm.com/downloads" >http://git-scm.com/downloads涓嬭澆瀵瑰簲騫沖彴git
鍦↙iteIDE鐨勬煡鐪?>緙栬緫鐜鍙橀噺涓紝 淇敼PATH錛?鍔犲叆git璺緞銆備緥濡?/p>
PATH=c:\mingw64\bin;%GOROOT%\bin;c:\Program Files (x86)\Git\bin;%PATH%
鍐嶆寜涓婫et閿紝 絎笁鏂瑰寘灝變細鑷姩鏇存柊浜?/p>
鎸夌収浣滆呯殑瀹夎鏂規硶鍦ㄥぉ鏈濊涓嶉氱殑, 鍘熷洜浣犳噦鐨?/p>
鍥犳榪涘叆榪欎釜閾炬帴, 鐐瑰嚮鍙寵竟鐨凞ownload ZIP涓嬭澆蹇収鍖?/p>
涓嬭澆濂藉悗鏀懼埌浣犵殑GOPATH鎸囧畾璺緞, 鏁寸悊璺緞濡備笅
github.com\aarzilli\golua\
鍏朵笅鐨勭洰褰曞涓?/p>
example\
lua\
LICENSE
README.md
TODO
鐒跺悗鍑嗗lua5.1鐨勫紑鍙戝寘
lua-5.1.4.tar.gz
榪樻湁2涓涓夋柟渚濊禆鍖?/p>
readline-6.2.tar.gz
ncurses-5.9.tar.gz
鐩存帴configure 鈥?gt; make install 瑁呭ソ
go env紜浣犵殑GOPATH宸茬粡鎸囧悜浣犵殑寮鍙戠洰褰?/p>
golua榛樿浣跨敤cgo榪涜緙栬瘧, 鍙兘浼氭姤閿? 淇敼lua.go鐨刢go瀹氫箟濡備笅
#cgo linux,!llua,!luaa LDFLAGS: -llua -lm 鈥搇dl
榪涘叆$GOPATH\src\github.com\aarzilli\golua\lua
鎵цgo install
瀹屾垚
鐩墠Go緙栬瘧鍣ㄦ槸C鍐欑殑錛屾槸鏃跺欐崲鎴怗o鍟︺?
鈥済c"Go宸ュ叿閾炬潵鑷狿lan 9緙栬瘧鍣ㄧ殑宸ュ叿閾俱傜粍瑁呭櫒銆丆緙栬瘧鍣ㄥ拰閾炬帴鍣ㄥ熀鏈病鍙樸侴o鐨勭紪璇戝櫒(cmd/gc,cmd/5g,cmd/6g,cmd/8g)鏄厤鍚堝伐鍏烽摼鍐欑殑鏂扮殑C紼嬪簭銆?
欏圭洰璧峰鏃訛紝鐢–鑰屼笉鏄疓o鍐欑紪璇戝櫒鏈夊緢澶氬ソ澶勩傜獊鍑虹殑姣斿錛岄鍏堬紝閭f椂鍊橤o榪樹笉瀛樺湪錛屾病娉曞効鍐欑紪璇戝櫒銆傝屼笖瀹為檯涓婏紝灝辯畻瀛樺湪錛屼篃浼氱粡甯告湁鏄庢樉鐨勪笉鍏煎鐨勫彉鍖栥傜敤C涓嶇敤Go鍙互閬垮厤鍒濆鍜屾寔緇紑鍙戝鑷寸殑闂銆傜劧鑰屽浠奊o 1宸茬粡紼沖畾錛屾墍浠ヨ繖浜涙寔緇殑闂鍑忓皯浜嗗緢澶氥?
鎸佺畫寮鍙戠殑闂宸茬粡娑堥櫎錛屼負浜嗚Go瀹炵幇鐨勭紪璇戝櫒姣擟鏇存湁鍚稿紩鍔涳紝鍙︿竴浜涘伐紼嬮棶棰樺嚭鐜幫細
鍐欐紜殑Go浠g爜姣斿啓姝g‘鐨凜浠g爜鏇村鏄撱?/p>
璋冭瘯閿欒鐨凣o浠g爜姣旇皟璇曢敊璇殑C浠g爜鏇村鏄撱?/p>
浣跨敤Go緙栬瘧鍣ㄩ渶瑕佸Go鏈変竴瀹氱悊瑙c傝岀敤C緙栬瘧鍣ㄨ繕闇瑕佷竴瀹氱悊瑙銆?/p>
Go浣垮茍鍙戞墽琛屾瘮C鏇存柟渚褲?/p>
Go鏈夋洿濂界殑鏍囧噯鏀寔妯″潡鍖栵紝鑷姩閲嶅啓錛屽崟鍏冩祴璇曞拰鎬ц兘鍒嗘瀽銆?/p>
Go姣擟鏇存湁瓚?fun)銆?/p>
鍩轟簬浠ヤ笂鐞嗙敱錛屾垜浠浉淇℃槸鏃跺欑敤Go鍐橤o緙栬瘧鍣ㄥ暒銆?
鎴戜滑鎵撶畻鐢ㄨ嚜鍔ㄥ寲緲昏瘧宸ュ叿鏉ョ敤Go閲嶅啓鐜板湪C鐨勭紪璇戝櫒銆傝繖涓炕璇戦渶瑕佷竴浜涢樁孌碉紝灝嗕粠Go 1.3寮濮嬫寔緇埌鏈潵鐨勫彂琛岀増銆?
絎竴闃舵銆傚紑鍙戝拰璋冭瘯涓涓嚜鍔ㄥ寲緲昏瘧宸ュ叿銆傝繖鍙互鍦ㄦ棩甯稿紑鍙戞椂鍚屾榪涜銆傝屼笖錛屼漢浠繕鍙互鍦ㄨ繖涓樁孌典負C緙栬瘧鍣ㄧ戶緇敼榪涖傝繖涓伐鍏峰伐浣滈噺寰堝ぇ錛屼笉榪囨垜浠湁淇″績瀹屾垚榪欎釜鐗規畩浣垮懡鐨勫伐鍏楓傛湁璁稿C鐨勮蹇墊病娉曞効鐩存帴杞崲鎴怗o錛沵acros(瀹?錛寀nions(鑱斿悎錛屽叡鐢ㄤ綋,)錛宐it fields(浣嶅煙)鍙兘鏈鍏堣冭檻銆傛瘮杈冨垢榪愶紙涓嶆槸宸у悎錛夛紝榪欎簺鍔熻兘鍔熻兘鐢ㄧ殑灝戯紝閮戒細琚炕璇戞帀銆傛寚閽堣繍綆楀拰鏁扮粍涔熼渶瑕佷竴浜涜漿鎹㈠伐浣滐紝灝界緙栬瘧鍣ㄩ噷寰堝皯銆傜紪璇戝櫒閲屼富瑕佹槸tree(鏍?鍜宭inked list(閾捐〃)銆傜炕璇戝伐鍏蜂細淇濈暀娉ㄩ噴鍜孋浠g爜鐨勭粨鏋勶紝鎵浠ョ炕璇戝悗鐨勪唬鐮佸拰褰撳墠鐨勭紪璇戝櫒浠g爜涓鏍峰彲闃呰銆?
絎簩闃舵銆傜敤緲昏瘧宸ュ叿杞崲C浠g爜鍒癎o錛屽茍鍒犻櫎C婧愮爜銆傝繖鏃舵垜浠凡緇忓紑濮嬬炕璇戯紝浣嗘槸Go榪樻槸榪愯鍦–緙栬瘧鍣ㄤ笂銆傞潪甯鎬箰瑙傜殑錛岃繖鍙兘鍙戠敓鍦℅o 1.3銆備笉榪囨洿鍙兘鏄疓o 1.4銆?
絎笁闃舵銆備嬌鐢ㄤ竴浜涘伐鍏鳳紝鍙兘鏉ヨ嚜gofix鍜宼he Go oracle錛屾媶鍒嗙紪璇戝櫒鍒板寘錛屾竻鐞嗗拰鏂囨。鍖栦唬鐮侊紝娣誨姞閫傚綋鐨勫崟鍏冩祴璇曘傝繖鏄紪璇戝櫒浼氭槸鍦伴亾鐨凣o紼嬪簭銆傜洰鍓嶆墦綆楀湪Go 1.4瀹炵幇銆?
絎洓a闃舵銆備嬌鐢ㄦ爣鍑嗙殑鍒嗘瀽鍜屾祴璇曞伐鍏蜂紭鍖栫紪璇戝櫒鐨凜PU鍜屽唴瀛樹嬌鐢ㄣ傚彲鑳借寮曞叆騫惰銆傚鏋滅湡榪欐牱錛?a >Race Detector(Go鐨勫茍琛岀珵浜夋嫻嬪伐鍏?)浼氭湁寰堝ぇ甯姪銆傝繖鐩爣鍦℅o 1.4錛屽彲鑳介儴鍒嗕細寤跺悗鍒?.5銆傚熀鏈殑浼樺寲鍒嗘瀽浼氬湪絎笁闃舵瀹屾垚銆?
絎洓b闃舵銆傦紙鍜屽洓a鍑犳鍚屾椂榪涜錛夊綋緙栬瘧鍣ㄤ緷鐓ф槑鏄劇殑鐣岄檺鍒嗗壊鎴愬寘涔嬪悗錛岄渶瑕佹槑紜紩鍏ヤ竴涓腑浠嬬爜錛屽湪緇撴瀯鏃犲叧鐨勬棤搴忔爲(Node_s)鍜岀粨鏋勭浉鍏崇殑鏈夊簭閾捐〃(Prog_s)涔嬮棿銆傝繖涓腑浠嬬爜搴旇涓嶄緷璧栨暣浣撴灦鏋勶紝浣嗘槸鍖呭惈鍑嗙‘鐨勬墽琛岄『搴忎俊鎭紝鍙互鐢ㄤ簬鏈夐『搴忎絾鏄粨鏋勬棤鍏崇殑鎿嶄綔鐨勪紭鍖栵紝姣斿娓呯悊澶氫綑鐨刵il媯嫻嬪拰鍑虹晫媯嫻嬨傝繖浜涜繃紼嬪熀浜?a >SSA錛堥潤鎬佸崟璧嬪鹼級錛屼綘鍙互浠嶢lan Donovan鐨?go.tools/ssa 鍖呬腑浜嗚В鏇村銆?
絎簲闃舵銆傛浛鎹o/parser鍜実o/types鍒版渶鏂幫紙鍏ㄦ柊錛夌殑鐗堟湰銆俁obert Griesemer鍙傝冪幇鍦ㄧ殑緇忛獙錛岃璁轟簡璁捐鏂扮殑parser鍜宼ypes鐨勫彲鑳姐傚鏋滆仈緋諱粬浠埌緙栬瘧鍣ㄥ悗绔紝鐩鎬俊瀵硅璁℃柊鐨凙PI鏈夊緢澶у府鍔┿?
鑷睍錛圔ootstrapping錛?/strong>鐢℅o璇█瀹炵幇鐨凣o鐨勭紪璇戝櫒錛屼粠涓寮濮嬪氨瑕佽冭檻濡備綍鑷睍銆傛垜浠冭檻鐨勮鍒欏氨鏄疓o1.3緙栬瘧鍣ㄥ繀欏葷敱Go1.2緙栬瘧錛孏o1.4鐨勭紪璇戝櫒蹇呴』鐢盙o1.4緙栬瘧錛屼互姝ょ被鎺ㄣ? 榪欐椂錛屾垜浠氨鏈変簡涓涓竻鏅扮殑嫻佺▼鏉ョ敓鎴愬綋鍓嶇殑紼嬪簭錛氱紪璇慓o1.2鐨勫伐鍏烽摼錛堢敱C緙栧啓錛夛紝鐒跺悗浣跨敤瀹冪紪璇慓o1.3鐨勫伐鍏烽摼錛屼互姝ょ被鎺ㄣ傝繖閲岄渶瑕佷竴涓剼鏈潵鍋氳繖涓簨鎯咃紝鏉ヤ繚璇佸彧浼氭秷鑰桟PU鐨勬椂闂磋岄潪鏌愪釜浜虹殑鏃墮棿銆傝繖鏍風殑鑷睍錛屾瘡涓満鍣ㄥ彧浼氬仛涓嬈★紝Go1.x鐨勫伐鍏烽摼灝嗕細鍦ㄦ湰鍦頒繚鐣欙紝騫跺湪鎵цall.bash鏉ョ紪璇慓o1.(x+1)宸ュ叿閾劇殑鏃跺欒鍐嶆浣跨敤銆? 鏄劇劧錛岄殢鐫鏃墮棿鐨勬帹縐昏繖縐嶈嚜涓炬柟寮忔槸涓嶅厖鍒嗙殑銆傚湪鍚庨潰鐨勫涓増鏈鍙戝竷涔嬪墠錛屼負緙栬瘧鍣ㄥ啓涓涓悗绔潵鐢熸垚C浠g爜涔熻鏄竴涓洿鏈夋剰涔夌殑浜嬫儏銆傝繖浜汣浠g爜涓嶈姹傛晥鐜囨垨鍙鎬э紝鍙姝g‘鍗沖彲銆傝繖浜汣浠g爜灝嗕細琚鍏ワ紝灝卞儚鎴戜滑絳懼叆鐢眣acc鐢熸垚鐨剏.tab.c鏂囦歡涓鏍楓傝繖鏍鳳紝鑷睍榪囩▼灝變細鍙樻垚錛氬厛鐢╣cc緙栬瘧C浠g爜鐢熸垚涓涓嚜灞曠紪璇戝櫒錛岀劧鍚庝嬌鐢ㄨ繖涓嚜灞曠紪璇戝櫒鏉ョ紪璇戠湡姝g殑緙栬瘧鍣ㄣ傜被浼間簬鍙︿竴涓嚜灞曡繃紼嬶紝榪欎釜鑷睍緙栬瘧鍣ㄥ皢浼氬湪鏈湴淇濈暀錛屽茍鍦ㄦ瘡嬈℃墽琛宎ll.bash鐨勬椂鍊欓噸澶嶄嬌鐢紙涓嶇敤閲嶆柊緙栬瘧錛夈? 鏇夸唬閫夋嫨榪樻湁涓浜涙瘮杈冩槑鏄劇殑鏇夸唬鏂規錛岄渶瑕佹垜浠鏄庝竴涓嬩負浠涔堟斁寮冧簡榪欎簺閫夋嫨銆? 浠庝竴寮濮嬪啓涓涓紪璇戝櫒銆傜幇鍦ㄧ殑緙栬瘧鍣ㄦ湁涓涓潪甯擱噸瑕佺殑鐗瑰緛錛氫粬浠兘澶熸甯稿伐浣滐紙鎴栬呭叾鑷沖皯鑳藉婊¤凍鎵鏈夌敤鎴風殑瑕佹眰錛夈傚敖綆o璇█姣旇緝綆鍗曪紝浣嗘槸緙栬瘧鍣ㄤ腑鏈夊緢澶氱粏寰殑緇嗚妭浼樺寲鍜屾敼鍐欙紝鐩存帴涓㈠純10鎴栨暟騫寸殑鍦ㄨ繖涓婇潰鐨勫姫鍔涙槸姣旇緝鎰氳牏鐨勩? 瀵圭紪璇戝櫒榪涜浜哄伐緲昏瘧銆傛垜浠凡緇忎互浜哄伐鐨勬柟寮忕炕璇戜簡涓灝忛儴鍒咰/C++浠g爜鍒癎o璇█浜嗐傝繖涓繃紼嬫槸鏋嚗鑰屼笖鏄撻敊鐨勶紝涓旇繖浜涢敊璇潪甯哥殑緇嗗井鍙婇毦浠ュ彂鐜般傜浉鍙嶏紝浣跨敤鏈烘緲昏瘧浼氬艦鎴愪竴浜涙瘮杈冧竴鑷寸殑閿欒錛岃岃繖浜涢敊璇槸鏄撲簬鍙戠幇鐨勶紱鑰屼笖涓嶄細鍥犱負鏋嚗鐨勮繃紼嬪紑灝忓樊銆侴o緙栬瘧鍣ㄧ殑浠g爜鏄庢樉鐨勬瘮鎴戜滑緲昏瘧鐨勪唬鐮佸寰堝錛氳秴榪?0,000琛孋浠g爜錛屾満姊扮炕璇戜細浣胯繖涓繃紼嬪鏄撲竴浜涖傚氨鍍廌ick Sites鍦?974騫磋鐨勪竴鏍鳳細鈥滅浉姣斿啓紼嬪簭錛屾垜瀹佹効鍐欎竴涓▼搴忔潵甯垜鍐欑▼搴忋傗?浣跨敤鏈烘鏉ョ炕璇戠紪璇戝櫒涔熸柟渚夸簬鍦ㄥ噯澶囧ソ鍒囨崲涔嬪墠錛屾垜浠彲浠ョ戶緇紑鍙戝畬鍠勭幇鏈夌殑C紼嬪簭銆? 鍙炕璇戝悗绔茍閾炬帴鍒癵o/parser鍜実o/types.浠庡墠绔紶緇欏悗绔殑鏁版嵁緇撴瀯鎵鍖呭惈鐨勪俊鎭腑錛実o/parser鍜実o/types鎵鑳芥彁渚涚殑闄や簡API灝辨病鍏朵粬鐨勪笢瑗夸簡銆傚鏋滀嬌鐢ㄨ繖浜涘簱鏉ユ浛浠e墠绔紝闇瑕佸啓浠g爜鏉ヨ漿鎹o/parser鍜実o/types鎵鑳芥彁渚涙暟鎹粨鏋勫埌鍚庣錛岃繖鏄竴涓潪甯稿娉涗笖鏄撳嚭閿欑殑宸ヤ綔銆傛垜浠浉淇′嬌鐢ㄨ繖浜涘簱鏄湁鎰忎箟鐨勶紝浣嗘洿鏄庢櫤鐨勬槸錛岀瓑鍒板皢緙栬瘧鍣ㄤ唬鐮佽皟鏁寸殑鏇村儚Go紼嬪簭錛屽垎鎴愮‘瀹氳竟鐣岀殑銆佸寘鍚鏄庢枃。鍜屽崟鍏儖箣璇曞瓙鍖呬箣鍚庡啀鋴社敤銆? 鏀懼純鐜版湁鐨勭紪璇戝櫒錛屼嬌鐢╣ccgo錛堟垨鑰単o/parser + go/types + LLVM, 鈥︼級銆傜幇鏈夌殑緙栬瘧鍣ㄦ槸Go璇█鏄懼緱姣旇緝鐏墊椿鐨勪竴涓噸瑕佺粍鎴愰儴鍒嗐傚鏋滃皾璇曚嬌鐢ㄥ熀浜庡ぇ閲忎唬鐮佺殑GCC鎴朙LVM鏉ュ紑鍙慓o紼嬪簭錛屾劅瑙変細鏈夌鍒癎o璇█鐨勭伒媧繪с傚彟澶栵紝GCC鏄ぇ閲廋浠g爜錛堢幇鍦ㄦ湁閮ㄥ垎C++錛夈丩LVM鏄ぇ閲廋++浠g爜鐨勭▼搴忋備互涓婂垪涓劇殑銆佺敤浜庤В閲婁笉浣跨敤鐜版湁緙栬瘧妗嗘灦浠g爜鐨勫嚑涓師鍥狅紝涔熼兘閫傜敤浜庢洿澶氱殑綾諱技鐨勪唬鐮佸簱銆? 涓磋繎緇撴潫錛岃繖涓鍒掕繕鐣欎笅浜嗙敱C鍐欐垚鐨凱lan9鐨勫伐鍏烽摼鐨勪竴閮ㄥ垎銆傚湪闀挎湡鍙戝睍涓紝榪樻槸灝嗘墍鏈夌殑C浠庝唬鐮佹爲鎺掗櫎鎺夋瘮杈冨ソ銆傛湰绔犺妭鎺ㄦ祴浜嗕竴涓嬭繖浠朵簨灝嗕細濡備綍鍙戠敓錛屼絾涓嶄繚璇佸叾鎸囧畾浼氬彂鐢熸垨鑰呮寜鐓ц繖縐嶅璺彂鐢熴? 榪愯鏃跺寘(runtime)銆?runtime鍖呯殑澶ч儴鍒嗛兘鏄敤C鍐欐垚錛屽熀浜庝竴浜涘悓鏍風殑鍘熷洜錛孏o緙栬瘧鍣ㄤ篃鏄敤C瀹炵幇銆備絾鏄紝runtime鍖呰繙姣旂紪璇戝櫒鐨勪唬鐮侀噺瑕佸皬錛屼笖瀹冪幇鍦ㄥ凡緇忔槸鐢℅o鍜孋娣峰悎緙栧啓銆傚皢C浠g爜杞崲涓篏o浠g爜鏃訛紝涓嬈¤漿鍖栦竴閮ㄥ垎璨屼技涔熸槸鍙鐨勩傚叾涓紝涓昏閮ㄥ垎鏈夛細璋冨害鍣紙scheduler錛夛紝鍨冨溇鍥炴敹錛坱he garbage collector錛夛紝鏁e垪鏄犲皠琛紙hash map錛夌殑瀹炵幇錛屽拰channel鐨勫疄鐜般傦紙榪欓噷Go鍜孋浠g爜娣峰悎鐨勫緢铻嶆唇錛屾槸鍥犱負榪欓噷浣跨敤鐨?c鑰屼笉鏄痝cc鏉ョ紪璇戠殑C浠g爜銆傦級 C緙栬瘧鍣ㄣ?Plan 9鐨凜緙栬瘧鍣ㄦ湰韜氨鏄敤C鍐欐垚錛屽鏋滄垜浠浠嶨o鍖呭疄鐜伴噷闈㈢Щ闄ゆ墍鏈夌殑C浠g爜錛岄偅涔堟垜浠皢縐婚櫎榪欎簺緙栬瘧宸ュ叿錛氣済o tool 6c鈥濈瓑絳夛紝鍙﹀錛?c鐨勬枃浠朵篃灝嗕笉琚敮鎸佸嚭鐜扮殑Go鍖呯殑鐩綍閲岄潰銆傛垜浠簲璇ユ彁鍓嶅0鏄庤繖鏍風殑璁″垝錛屼互渚夸嬌鐢–鐨勭涓夋柟鍖呮湁鏃墮棿鍘葷Щ闄よ繖綾籆浠g爜鐨勪嬌鐢ㄣ傦紙Cgo錛岀敱浜庝嬌鐢ㄤ簡gcc鏉ユ浛浠?c錛屾墍浠ュ畠浠嶇劧鍙互浣滀負涓涓斿緞鏉ュ湪Go鍖呬腑浣跨敤C瀹炵幇閮ㄥ垎鍔熻兘銆傦級鍦℅o1鐨勫吋瀹規ф枃妗d腑娌℃湁鍖呭惈宸ュ叿閾句慨鏀圭殑鎻忚堪錛屼篃灝辨槸璇村幓鎺塁緙栬瘧鍣ㄦ槸琚厑璁哥殑銆? 姹囩紪鍣ㄣ?Plan 9鐨勬眹緙栧櫒涔熸槸鐢–瀹炵幇鐨勶紝浣嗚繖涓眹緙栧櫒鍙笉榪囨槸涓緋誨垪瑙f瀽鏍戠粍鎴愮殑綆鍗曡В鏋愬櫒錛岃繖浣垮緱涓嶈鎵嬪姩榪樻槸鑷姩灝嗗畠緲昏瘧鎴怗o璇█閮芥瘮杈冪畝鍗曘? 榪炴帴鍣ㄣ?Plan 9鐨勮繛鎺ュ櫒涔熸槸鐢盋鍐欐垚銆傛渶榪戠殑涓浜涘伐浣滐紝宸茬粡灝嗗ぇ閮ㄥ垎鐨勮繛鎺ュ櫒宸ヤ綔鏀懼埌鐨勭紪璇戝櫒涓紝鑰屼笖錛屼篃宸茬粡鏈変釜璁″垝灝嗗墿浣欑殑閮ㄥ垎閲嶅啓鎴愪竴涓柊鐨勩佹洿綆鍗曠殑Go紼嬪簭銆傝漿縐誨埌緙栬瘧鍣ㄧ殑閮ㄥ垎榪炴帴鍣ㄤ唬鐮侊紝鐜板湪闇瑕侀殢鐫緙栬瘧鍣ㄧ殑鍘熸湁浠g爜涓璧瘋繘琛岀炕璇戙? 鍩轟簬Libmach鐨勫伐鍏? nm, pack, addr2line, 鍜宱bjdump銆?Nm鐜板湪宸茬粡浣跨敤Go璇█閲嶅啓銆侾ack鍜宎ddr2line鍙互浠諱綍涓澶╄閲嶅啓銆侽bjdump鐜板湪渚濊禆浜巐ibmach鐨勫弽姹囩紪鍣紝浣嗚繖浜涜漿鎹負Go涔熸槸姣旇緝綆鍗曠殑錛屼笉璁烘槸浣跨敤鏈烘榪樻槸浜哄伐緲昏瘧銆傛墍浠ュ熀浜庤繖鍑犵偣錛宭ibmach鏈韓灝嗘潵涔熷彲浠ヨ縐婚櫎銆? 鏉ユ簮: http://www.oschina.net/translate/go-1-3-compiler-overhaul C璇█鐨勯暱鏈熶嬌鐢?/h5>
]]>
鎼滅儲鍒癵ocode鐨勫紑鍙戦〉闈?a >https://github.com/nsf/gocode 緇撴灉鍙戠幇nsf榪欏浼欏眳鐒朵篃鏄痩uaBridge鐨勪綔鑰?
涓嬭澆鏈鏂扮殑gocode浠g爜, 瑙e帇鍚? 緙栬瘧:
windows涓嬪懡浠よ
go build gocode.go autocompletecontext.go autocompletefile.go client.go config.go cursorcontext.go decl.go declcache.go formatters.go os_windows.go package.go ripper.go rpc.go scope.go server.go utils.go
linux涓? 鍙渶瑕佸皢os_windows.go鎹負os_posix.go鍗沖彲
緙栬瘧瀹屾垚鍚? 灝嗗彲鎵ц鏂囦歡gocode瑕嗙洊鍒發iteIDE涓嬬殑鍚屽悕鏂囦歡, 鏉鎺塯ocode榪涚▼鍚庨噸鍚痩iteIDE鍗沖彲
error: missing binary operator before token "("
鏍規嵁鑰佸鐨勬弿榪? boost涓殑BOOST_PP_ITERATION_FLAGS浠?.49鐗堟湰鍚庡彂鐢熶簡涓浜涘彉鍖?
鍦╣it鎵懼埌涓涓猵atch, 閾炬帴鍦ㄦ
浠ヤ笅綆鍗曟弿榪?/p>
淇敼call_function.hpp, call_member.hpp鍙妛rapper_base.hpp
鍘繪帀#elif BOOST_PP_ITERATION_FLAGS() == 1
鏇存崲涓?/p>
#else
#if BOOST_PP_ITERATION_FLAGS() == 1
鐒跺悗鍦ㄦ簮鐮佸簳閮ㄥ姞涓涓?endif鍗沖彲
鍦ㄧ紪鍐欐湰鏂囧墠, 絎旇呬嬌鐢ㄨ繃璇稿libunwind絳夊簱榪涜閿欒鏃跺爢鏍堟墦鍗? 浣嗘槸鍏舵湰韜敱浜庨渶瑕佸紩鐢ㄧ涓夋柟搴? 浣跨敤榪樻槸紼嶅井楹葷儲.
緇忚繃Google鍚? 灞呯劧鎵懼埌涓綃?a >濂芥枃, 鍏墮氳繃鎹曡幏SIGSEGV淇″彿, 騫惰揩浣跨▼搴忚繘鍏db璋冭瘯闃舵, 鍒╃敤gdb寮哄ぇ鐨勮皟璇曞姛鑳藉彲浠ヨ繘琛屽悇縐嶉敊璇窡韙? 姝ゆ硶宸蹭笌Windows涓嬬▼搴忓穿婧冨悗寮瑰嚭VC璋冭瘯鍑犱箮鎺ヨ繎.
鎴戝湪姝ゆ枃鍩虹涓? 鎵╁睍浜嗗叾閫氱敤鎬у強渚垮埄鎬?/p>
1. 浣跨敤gdb鐨?-ex鍙傛暟, 鍦ㄦ寕鎺ョ▼搴忓悗, 鎵цbt鎸囦護鎵撳嚭紼嬪簭鍫嗘爤
2. 灝嗕俊鎭噸瀹氬悜鍒拌嚜瀹氫箟鐨勬枃浠?鍦ㄥ榪涚▼閮介渶瑕佽繘琛屽悗鍙拌緭鍑烘椂甯︽潵鏇村ぇ鐨勭伒媧繪? 鍚屾椂涔熻В鍐充簡gdb鍙兘鍦ㄥ墠鍙拌皟璇曠殑闂
浠g爜濡備笅
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <string.h> void dump(int signo) { char buf[1024]; char cmd[1024]; FILE *fh; snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid()); if(!(fh = fopen(buf, "r"))) exit(0); if(!fgets(buf, sizeof(buf), fh)) exit(0); fclose(fh); if(buf[strlen(buf) - 1] == '/n') buf[strlen(buf) - 1] = '/0'; snprintf(cmd, sizeof(cmd), "gdb %s %d -ex=bt > ./a.txt", buf, getpid()); system(cmd); exit(0); }
鍦ㄦ湇鍔″櫒寮鍚椂,娣誨姞 signal(SIGSEGV, &dump ); 榪涜淇″彿澶勭悊鎸傛帴鍗沖彲
寮曠敤: http://blog.csdn.net/kakaka2011/article/details/6597857 浣滆? kakaka2011
鈥滱fter a successful async_read_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent async_read_until operation to examine.鈥?/p>
鎰忔濇槸, streambuf涓茍涓嶄竴瀹氭槸鍒板垎闅旂鍓嶇殑鎵鏈夋暟鎹? 澶氫綑鐨勬暟鎹彲鑳戒竴鏍蜂細鍦╯treambuf涓? 涔熷氨鏄, 榪橀渶瑕佽嚜宸卞啀嬈″鐞嗕竴閬嶆暟鎹?..
鍔ㄦ墜鍛? async_read_until鐪嬩技灝辨槸涓涓簾鏌? 搴曞眰宸茬粡璐逛簡寰堝CPU鍦ㄩ愬瓧絎︿笌鍒嗛殧絎︾殑鍖歸厤涓? 鎶涗笂鏉ョ殑鏁版嵁灞呯劧榪樻槸鍗婃垚鍝?
浠g爜濡備笅, 嫻嬭瘯閫氳繃, 浣嗘槸瀹炲湪寰堣垂瑙d負鍟ラ潪瑕佸啀鍋氫竴嬈?.
boost::asio::streambuf* SB = SBP.get(); // 璁塊棶緙撳啿 const char* Buffs = boost::asio::buffer_cast<const char*>( SB->data() ); uint32 DataSize = 0; for ( uint32 i = 0; i < SB->size(); ++i ) { const char DChar = Buffs[i]; // 榪欓噷闇瑕佽嚜宸卞垽鏂瓧絎︿覆鍐呭, read_until鐨勬枃。閲寴q欎箞璇寸殑 if ( DChar == '\0' ) { DataSize = i; break; } } if ( DataSize > 0 ) { // 鍙栨垚瀛楃涓?/span> std::string FullText( Buffs, DataSize ); // 娑堣垂 SB->consume( DataSize ); mWorkService->post( boost::bind(&AsioSession::NotifyReadString, shared_from_this(), FullText ) ); }
鍙﹀, 涓轟簡淇濊瘉杈撳叆鎬у畨鍏? 鍙互鍦╯treambuf鏋勯犳椂鍔犱竴涓渶澶т竴涓鍙栭噺, 瓚呰繃姝ら噺浼氳繑鍥炴姤閿? 閬垮厤浜嗙紦鍐插尯琚拺鐖嗙殑鍗遍櫓
鏈榪戦亣鍒癉B鏈嶅姟鍣ㄤ腑鎶ュ嚭涓涓狹ySQL鐨勯敊璇?Commands out of sync; you can't run this command now,2014
鏌ラ槄寰堝浠g爜, 瑙e喅鏂規硶閮芥槸浣跨敤C鎺ュ彛鐨勬柟寮? 妯′豢鍏惰В鍐蟲柟娉?鍦∕ySQL++涓壘鍒頒簡姣旇緝濂界殑瑙e喅鏂規:
鏂規A: 娓呯┖姣忔鏈嬌鐢ㄧ殑璁板綍
for (int i = 1; DataQuery.more_results(); ++i) { DataQuery.store_next(); }
鍏朵腑 DataQuery綾誨瀷涓簃ysqlpp::Query
鏂規B: 瀵逛簬瀛樺偍榪囩▼涓?浣跨敤浜嗗涓猻elect璇彞榪斿洖鍚屾牱鐨勫垪緇撴灉, 灝遍渶瑕佷嬌鐢ㄤ互涓嬭鍙?/p>
static void print_multiple_results(Query& query)
{
// 鎵ц鏌ヨ騫惰緭鍑虹粨鏋滆〃
StoreQueryResult res = query.store();
print_result(res, 0);
for (int i = 1; query.more_results(); ++i) {
res = query.store_next();
print_result(res, i);
}
}
鍙傝冩枃绔?http://hi.baidu.com/freeknight/item/ea9fd88e7d291f854514cf43
浼犵粺鐨勬湇鍔″櫒/瀹㈡埛绔増鏈彂甯冩祦紼嬮兘闇瑕佺粡鍘嗕互涓嬫祦紼?
1. 鑾峰彇浠g爜
2. 緙栬瘧浠g爜
3. 灝嗛厤緗?浜岃繘鍒舵枃浠? 璧勬簮鎵撳寘
4. 鎸傛帴榪滅▼鏈嶅姟鍣ㄧ鐩樻嫹璐濇墦鍖呮枃浠?/font>
5. 榪滅▼鎿嶄綔瑙e帇鎵撳寘鏂囦歡
6. 淇敼璁劇疆,鎸囧悜鏈鏂扮増鏈?/font>
7. 閲嶅惎鏈嶅姟鍣?/font>
姝ゆ祦紼嬬箒鐞?閲嶅涓旀棤鑱? 鍚屾椂, 鐢變簬緗戠粶甯﹀,緗戦熺瓑綰︽潫, 姣忔鑻ヤ嬌鐢ㄥ畬鏁村寘鍙戝竷,浼犺緭璧鋒潵闈炲父鍚冨姏
鏈枃璁ㄨ鐨勫緗戞湇鍔″櫒鐢變簬瀹夊叏鎬ц姹?紱佹root鐧誨綍,鍙兘鐢ㄦ櫘閫氬笎鍙風櫥褰曟垨浼犺緭鍚? 鎻愭潈涓簉oot緇х畫榪涜浠ヤ笂鎿嶄綔, 鍥犳rsync鐨勪嬌鐢ㄥ彈鍒頒弗閲嶉檺鍒?/font>
鍗充究浣跨敤Windows涓嬬殑鍚屾杞歡, 涔熷嚑涔庝笉鍙兘.
HG浣滀負涓涓紭縐,灝忓閥鐨勮法騫沖彴浠g爜綆$悊杞歡鐨勭壒鎬?姝eソ鑳借В鍐充互涓婇棶棰? 涓昏鐗規?
1. 瀹夎綆渚? 鍙互浣跨敤浠g爜鐩存帴瀹夎
2. 鍒╃敤鏈湴鏄犲皠鐗堟湰鍙互瀵規柊鐗堟湰鍋氬樊寮傛瘮杈?/font>
3. 澧為噺鍖呬紶杈? 100%鍚屾, 鏈湴鏂囦歡鍒犻櫎鍚? 榪滅▼鏂囦歡涔熶細鍚屾鍒犻櫎
4. 浼犺緭鍘嬬緝
5. 澧為噺鍖呭彲浠ユ墦鍖呬負patch榪涜紱葷嚎鏇存柊
6. 鍙互鎭㈠鍒頒換鎰忕増鏈? 鎻愪氦鐗堟湰鏈夋嵁鍙煡
浠ヤ笅閮ㄧ講緋葷粺浠entOS涓哄熀紜, 鍏朵粬緋葷粺綾諱技
鏈枃鏉ヨ嚜鎴橀瓊灝忕瓚鐨勫崥瀹?a href="http://www.shnenglu.com/sunicdavy">http://www.shnenglu.com/sunicdavy 杞澆璇鋒敞鏄庢潵婧?/font>
yum install python-devel
wget http://mercurial.selenic.com/release/mercurial-2.1.tar.gz
tar zxvf ./mercurial-2.1.tar.gz
make all
make install
hg debuginstall
鎵懼埌浣犻渶瑕佸悓姝ョ殑鐩綍,榪涘叆鐩綍
鎵ц
hg init
vi .hg/hgrc
娣誨姞浠ヤ笅鍐呭,璁╄繖涓粨搴撴敮鎸佸閮╬ush
[ui]
username=鏈嶅姟鍣ㄦ彁浜ゅ悗鐪嬪埌鐨勭敤鎴峰悕
[web]
vi /etc/sysconfig/iptables
娣誨姞HG鏈嶅姟鐨?000绔彛
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT
寮鍚粨搴撳悓姝ユ湇鍔?/font>
hg serve
鏈湴鏈哄櫒鍚屾牱鎵懼埌鏂囦歡澶?鍒涘緩浠撳簱
hg init
浠ュ悗姣忔闇瑕佸悓姝ユ椂,浣跨敤鍛戒護,鎴栬呬箤榫烪G鐨勭晫闈㈠伐鍏鋒媺鍙栨湇鍔″櫒鏁版嵁鍗沖彲
hg pull http://鏈嶅姟鍣ㄥ湴鍧:8000
鐗堟湰鎻愪氦鏂規硶涓嶩G鏃ュ父浣跨敤綾諱技, 榪欓噷涓嶅啀闃愯堪
瀵逛簬鏌愪簺鏈嶅姟鍣ㄦ繁澶勯槻鐏鎴栬呭畨鍏ㄧ櫥褰曞悗鏂?涓嶈兘鐩存帴寮鍚?000绔彛鐨勬儏鍐?/p>
鍙互浣跨敤hg瀵煎嚭涓涓猵atch, 浼犺緭鍒拌繙紼嬫湇鍔″櫒, 浣跨敤hg import PATCH 鍗沖彲
[root@localhost bin]# ldd wkcenter
./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./wkcenter)
./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./wkcenter)
./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./wkcenter)
./wkcenter: /lib/libc.so.6: version `GLIBC_2.9' not found (required by ./wkcenter)
./wkcenter: /lib/libc.so.6: version `GLIBC_2.7' not found (required by ./wkcenter)
./wkcenter: /lib/libc.so.6: version `GLIBC_2.8' not found (required by ./wkcenter)
./wkcenter: /lib/libc.so.6: version `GLIBC_2.11' not found (required by ./wkcenter)
linux-gate.so.1 => (0xffffe000)
liblog4cpp.so.4 => not found
libprotobuf.so.7 => not found
libboost_filesystem.so.1.48.0 => not found
libboost_system.so.1.48.0 => not found
libboost_thread.so.1.48.0 => not found
libboost_program_options.so.1.48.0 => not found
libunwind-x86.so.7 => not found
libluabind.so.0.9.0 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x008ae000)
libm.so.6 => /lib/libm.so.6 (0x0044b000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00476000)
libc.so.6 => /lib/libc.so.6 (0x002c1000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0041d000)
librt.so.1 => /lib/librt.so.1 (0x00440000)
/lib/ld-linux.so.2 (0x002a2000)
涓婇潰綰㈠瓧閮ㄥ垎琛ㄧずglibc鍙奼libcxx搴撲緷璧栦笉姝g‘. 鏈漢浣跨敤鐨凩inux緙栬瘧鐗堟湰涓篗int 11(鍩轟簬Ubuntu), 涓鑸琔buntu鍙戣鐗堢殑glibc閰嶅闈炲父楂? 浣嗘槸涓婃枃涓殑鍙戝竷鐨凩inux鐗堟湰涓篊entOS 5.8
浣跨敤/lib/libc.so.6 鏌ョ湅libc鐗堟湰涓?.5, 榪滆繙浣庝簬寮鍙戠幆澧冪殑2.11
GNU C Library stable release version 2.5, by Roland McGrath et al.
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-51).
Compiled on a Linux 2.6.9 system on 2012-02-21.
Available extensions:
The C stubs add-on version 2.1.2.
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
GNU libio by Per Bothner
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
RT using linux kernel aio
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
鐢變簬Linux鎿嶄綔緋葷粺鐨勭壒鏈塭lf鍔犺澆欏哄簭. (鍙互鍙傝?a >姝ゆ枃). 铏界劧鍙互寰堝ぇ紼嬪害涓婅В鍐砏indows鏃╂湡鐗堟湰鐨刣ll hell闂, 浣嗘槸緇欓儴緗插甫鏉ヤ簡寰堝ぇ闅懼害
涓鑸父瑙佺殑瑙e喅鏂規硶鏄? 鎵懼埌涓涓笌鐩爣Linux鐗堟湰鍙奼libc鐗堟湰涓鑷寸殑Linux, 灝嗕唬鐮佸強渚濊禆鍖呮斁鍦ㄤ箣涓婄紪璇? 瀹屾垚鍚庡啀鍙戝竷.榪欑鏂規硶涓嶭inux涓嬪父瑙佽蔣浠跺畨瑁呮柟娉曠被浼? 浣嗘槸瀵逛簬鍟嗙敤鏈嶅姟鍣ㄩ儴緗叉楠ゆ潵璇存湭鍏嶇箒鐞? 瀹夊叏鎬т綆.
榪樻湁涓縐嶆柟娉?浣跨敤闈欐侀摼鎺? 灝嗘墍鏈夊彲鎵ц鏂囦歡鏂囦歡渚濊禆鐨勯潤鎬佸簱, 緋葷粺搴?鍏ㄩ儴闈欐侀摼鎺ュ埌鍙墽琛屾枃浠朵腑,鍙互涓嬈℃цВ鍐寵繖涓棶棰?/p>
姝ラ:
1. 鍦╣cc閾炬帴鍛戒護琛屼腑娣誨姞-static -static-libgcc -static-libstdc++
2. 灝嗙涓夋柟渚濊禆搴撴墦寮闈欐侀摼鎺ュ紑鍏? 灝嗗師鏉ラ摼鎺?so鐨勫簱,鍏ㄦ敼涓洪摼鎺?a
3. gcc瀵歸摼鎺ュ簱欏哄簭寰堟晱鎰? 閾炬帴搴撻『搴忛渶瑕佹寜鐓т粠鍓嶈嚦鍚庝負: 欏圭洰浜х敓鐨勯潤鎬佸簱 > 絎笁鏂瑰簱闈欐佸簱 > 緋葷粺闈欐佸簱
4. 閾炬帴鏃? 鑻ユ湁鏈В鍐崇殑symbol, 鍙互灝濊瘯鍦ㄦ渶鍚庢坊鍔?lpthread鍙?lrt瑙e喅
鍦ㄥ彂甯冪増鏈琇inux涓婅繍琛屽彲鑳介亣鍒扮殑闂:
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
瑙e喅鏂規硶: 鎵ц涔嬪墠榪愯export LC_ALL="C"
ServicePath=/usr/local/bin ServiceList=( "wkcenterd --toc /home/davy/dev/kaze/Config/CenterService.toc --logfile /tmp/centerd.log" "wkagentd --toc /home/davy/dev/kaze/Config/AgentService.toc --logfile /tmp/agentd.log" ) StartAll() { for((i = 0;i<${#ServiceList[*]};i=i+1)) do echo "start:" $ServicePath/${ServiceList[i]} $ServicePath/${ServiceList[i]} > /dev/null & done } StopAll() { for((i = 0;i<${#ServiceList[*]};i=i+1)) do echo "stop:" $ServicePath/${ServiceList[i]} svcname=`echo ${ServiceList[i]} | awk '{print $1}'` killall $svcname > /dev/null done } RestartAll() { StopAll StartAll } InstallService() { svcname=`basename $0` chmod +x $svcname cp $svcname /etc/init.d ln /etc/init.d/$svcname /etc/rc3.d/S03$svcname ln /etc/init.d/$svcname /etc/rc0.d/K03$svcname chkconfig --add $svcname chkconfig $svcname on chkconfig --list | grep $svcname } UninstallService() { svcname=`basename $0` chkconfig --del $svcname rm -f /etc/init.d/$svcname rm -f /etc/rc3.d/S03$svcname rm -f /etc/rc3.d/K03$svcname } case "$1" in start) StartAll ;; stop) StopAll ;; restart) RestartAll ;; install) InstallService ;; uninstall) UninstallService ;; *) echo "Usage: service $EXEC {install|start|stop|restart|uninst}" exit 1 esac exit $?
榪欓噷鏄竴涓猄hell鍙互灝嗕緷璧栧垪琛ㄤ腑鐨勬枃浠舵嫹璐濆埌鎸囧畾鐩綍
deplist=$( ldd $1 | awk '{if (match($3,"/")){ print $3}}' )
cp $deplist $2
浠g爜瑙i噴: ldd瀵煎嚭鍒楄〃, 榪欎釜鍒楄〃鎵撳嵃鍑烘潵寰堜笐
linux-gate.so.1 => (0x00ed2000)
liblog4cpp.so.4 => /usr/local/lib/liblog4cpp.so.4 (0x00657000)
libprotobuf.so.7 => /usr/local/lib/libprotobuf.so.7 (0x00360000)
libboost_filesystem.so.1.48.0 => /usr/local/lib/libboost_filesystem.so.1.48.0 (0x00a9a000)
libboost_program_options.so.1.48.0 => /usr/local/lib/libboost_program_options.so.1.48.0 (0x00110000)
libboost_system.so.1.48.0 => /usr/local/lib/libboost_system.so.1.48.0 (0x00a85000)
libboost_thread.so.1.48.0 => /usr/local/lib/libboost_thread.so.1.48.0 (0x00179000)
libunwind-x86.so.7 => /usr/lib/libunwind-x86.so.7 (0x00821000)
libluabindd.so.0.9.0 => /usr/local/lib/libluabindd.so.0.9.0 (0x00bb3000)
libmysqlpp.so.3 => /usr/local/lib/libmysqlpp.so.3 (0x00de5000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x001a9000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00782000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00aea000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00447000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00abd000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00193000)
libnsl.so.1 => /lib/i386-linux-gnu/libnsl.so.1 (0x00294000)
libunwind.so.7 => /usr/lib/libunwind.so.7 (0x002ab000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00e8a000)
libmysqlclient_r.so.16 => /usr/lib/libmysqlclient_r.so.16 (0x0083b000)
/lib/ld-linux.so.2 (0x00608000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x002c0000)
鎴戜滑鍙戠幇絎竴琛岀殑so娌℃湁瀵瑰簲鐨勫簱鍦板潃, 鍥犳鎴戜滑浣跨敤awk鐨勮剼鏈姛鑳?鍒ゆ柇絎笁涓弬鏁?涔熷氨鏄?>涔嬪悗鐨勮礬寰勫繀欏誨寘鍚?
涔嬪悗灝嗙涓琛岀殑杈撳嚭閲嶅畾鍚戝埌鍙橀噺涓? 鍐嶄嬌鐢╟p鎸囦護浠庡垪琛ㄦ嫹璐濆埌鎸囧畾鐩綍
鍙傝冮摼鎺?a >http://yubosun.akcms.com/tech/linux-daemon-program.htm
1: #include <unistd.h>
2: #include <signal.h>
3: #include <sys/types.h>
4: #include <sys/stat.h>
5: #include <stdio.h>
6: #include <stdlib.h>
7:
8: #ifndef NOFILE
9: #define NOFILE 3
10: #endif
11:
12: void init_daemon()
13: {
14: int pid;
15: int i;
16: if(pid = fork()) exit(0); //鐖惰繘紼嬶紝閫鍑?
17:
18: else if(pid < 0) exit(1); //fork澶辮觸
19:
20: /* 瀛愯繘紼嬬戶緇墽琛?*/
21: setsid(); //鍒涘緩鏂扮殑浼氳瘽緇勶紝瀛愯繘紼嬫垚涓虹粍闀匡紝騫朵笌鎺у埗緇堢鍒嗙
22:
23: /* 闃叉瀛愯繘紼嬶紙緇勯暱錛夎幏鍙栨帶鍒剁粓绔?*/
24: if(pid = fork()) exit(0); //鐖惰繘紼嬶紝閫鍑?
25:
26: else if(pid < 0) exit(1); //fork閿欒錛岄鍑?
27:
28: /* 絎簩瀛愯繘紼嬬戶緇墽琛?, 絎簩瀛愯繘紼嬩笉鍐嶆槸浼氫細璇濈粍緇勯暱*/
29:
30: //for(i = 0; i < NOFILE; i++) /* 鍏抽棴鎵撳紑鐨勬枃浠舵弿榪扮*/
31: //{
32: //close(i);
33: //}
34: chdir("/tmp"); /* 鍒囨崲宸ヤ綔鐩綍 */
35: umask(0); /* 閲嶈鏂囦歡鍒涘緩鎺╃爜 */
36: return;
37: }
38:
39: int main(int argc, char* argv[])
40: {
41: FILE *fp;
42:
43: signal(SIGCHLD, SIG_IGN); /* 蹇界暐瀛愯繘紼嬬粨鏉熶俊鍙鳳紝闃叉鍑虹幇鍍靛案榪涚▼ */
44:
45: init_daemon();
46:
47: while(1)
48: {
49: sleep(1);
50:
51: // 娉ㄦ剰, 鏃ュ織鍐欏埌榪欎釜鐩綍
52: if((fp = fopen("/var/tmp/test.log", "a")) != NULL)
53: {
54: fprintf(fp, "%s\n", "test message");
55: fclose(fp);
56: }
57: }
58:
59: return 0;
60: }
鍙傝冮摼鎺?a >http://blog.sina.com.cn/s/blog_57421ff80100c7nn.html
綰㈣壊瀛楁槸闇瑕佸~鍐欑殑閮ㄥ垎, 鏂囦歡澶撮儴鍒嗗彲浠ラ夊~
1: #!/bin/bash
2:
3: # chkconfig: 3 3 1
4:
5: # description: web kill center
6:
7: EXEC_PATH=/usr/local/bin
8:
9: EXEC=CenterServiced
10:
11: PID_FILE=/var/run/CenterServiced.pid
12:
13: DAEMON=/usr/local/bin/CenterServiced
14:
15: if ! [ -x $EXEC_PATH/$EXEC ] ; then
16:
17: echo "ERROR: $EXEC_PATH/$EXEC not found"
18:
19: exit 1
20:
21: fi
22:
23: stop()
24:
25: {
26:
27: echo "Stoping $EXEC ..."
28:
29: killall $DAEMON >/dev/null
30:
31: echo "Shutting down $EXEC: [ OK ]"
32:
33: }
34:
35: start()
36:
37: {
38:
39: echo "Starting $EXEC ..."
40:
41: $DAEMON > /dev/null &
42:
43: echo "Starting $EXEC: [ OK ]"
44:
45: }
46:
47: restart()
48:
49: {
50:
51: stop
52:
53: start
54:
55: }
56:
57: case "$1" in
58:
59: start)
60:
61: start
62:
63: ;;
64:
65: stop)
66:
67: stop
68:
69: ;;
70:
71: restart)
72:
73: restart
74:
75: ;;
76:
77: status)
78:
79: status -p $PID_FILE $DAEMON
80:
81: ;;
82:
83: *)
84:
85: echo "Usage: service $EXEC {start|stop|restart|status}"
86:
87: exit 1
88:
89: esac
90:
91: exit $?
92:
鍙傝冮摼鎺?a >http://hi.baidu.com/guanxiansun/blog/item/b4c7dcf55f6011e47709d724.html
灝嗘湇鍔℃枃浠舵嫹璐濆埌/etc/init.d涓?鍘繪帀鎵╁睍鍚? 鏂囦歡鍚嶅嵆鏄湇鍔″悕
chmod +x ./wkcenter
濡傛灉涓嶈緗惎鍔? 閭d箞service涓皢鏃犳硶鎵懼埌璇ユ湇鍔″強鎿嶄綔
鍒涘緩鍚姩閾炬帴
ln /etc/init.d/wkcenter /etc/rc3.d/S03wkcenter
鍒涘緩鍏抽棴閾炬帴
ln /etc/init.d/wkcenter /etc/rc0.d/K03wkcenter
chkconfig --add wkcenter
鏌ョ湅鏈嶅姟鏄惁瀛樺湪
chkconfig 鈥?list | grep wkcenter
鏌ョ湅鏈嶅姟鐘舵?
chkconfig wkcenter on
娉ㄦ剰, 紜wkcenter鍦?,3,4,5涓換鎰忔垨鑰呴儴鍒嗗紑鍚? 蹇呴』涓虹豢瀛? 鐏板瓧浠h〃鏈嶅姟鏃犳硶寮鏈哄惎鍔ㄦ垨鑰呭叾浠栭棶棰?
涓存椂寮鍚懡浠ゆ祴璇?
service wkcenter start
鍙傝冮摼鎺? http://blog.526net.com/?p=1706
1. 鏈嶅姟鍒囪涓嶅彲鏀懼湪鐢ㄦ埛home鐩綍, 鏈濂芥斁鍦?usr/local/bin鐩綍, 鏃ュ織鍐欏埌var涓? 鍚﹀垯鏈嶅姟嫻嬭瘯姝e父,浣嗘槸鏃犳硶鑷姩鍚姩
2. Linux涓? 鐖惰繘紼嬪惎鍔ㄧ殑紼嬪簭鐨勭敓鍛芥湡璺熼殢鐖惰繘紼? 鐖惰繘紼嬪彲浠ユ槸緇堢, 鐖惰繘紼嬩竴鏃︾粓姝? 瀛愯繘紼嬮兘蹇呴』緇撴潫. 鍥犳瀹堟姢榪涚▼闇瑕佽劚紱葷埗榪涚▼,閬垮厤琚埗榪涚▼鐢熷懡鏈熸帶鍒?
鍦ㄥ師鏉ュ師鍩虹涓?灝嗕唬鐮佹暣鐞?騫跺姞寮哄畨鍏ㄦ? 騫舵寜鐓indowsAPI璁捐, 娣誨姞杈撳嚭緙撳啿闀垮害鎺㈡祴鍔熻兘
褰揙utUTFString涓篘ULL鏃? 鍙互榪涜杈撳嚭鐨刄TF8瀛楃涓查暱搴︽帰嫻?/p>
1: uint32 UniCharToUTF8(wchar_t UniChar, char *OutUTFString)
2: {
3:
4: uint32 UTF8CharLength = 0;
5:
6: if (UniChar < 0x80)
7: {
8: if ( OutUTFString )
9: OutUTFString[UTF8CharLength++] = (char)UniChar;
10: else
11: UTF8CharLength++;
12: }
13: else if(UniChar < 0x800)
14: {
15: if ( OutUTFString )
16: {
17: OutUTFString[UTF8CharLength++] = 0xc0 | ( UniChar >> 6 );
18: OutUTFString[UTF8CharLength++] = 0x80 | ( UniChar & 0x3f );
19: }
20: else
21: {
22: UTF8CharLength += 2;
23: }
24: }
25: else if(UniChar < 0x10000 )
26: {
27: if ( OutUTFString )
28: {
29: OutUTFString[UTF8CharLength++] = 0xe0 | ( UniChar >> 12 );
30: OutUTFString[UTF8CharLength++] = 0x80 | ( (UniChar >> 6) & 0x3f );
31: OutUTFString[UTF8CharLength++] = 0x80 | ( UniChar & 0x3f );
32: }
33: else
34: {
35: UTF8CharLength += 3;
36: }
37: }
38: else if( UniChar < 0x200000 )
39: {
40: if ( OutUTFString )
41: {
42: OutUTFString[UTF8CharLength++] = 0xf0 | ( (int)UniChar >> 18 );
43: OutUTFString[UTF8CharLength++] = 0x80 | ( (UniChar >> 12) & 0x3f );
44: OutUTFString[UTF8CharLength++] = 0x80 | ( (UniChar >> 6) & 0x3f );
45: OutUTFString[UTF8CharLength++] = 0x80 | ( UniChar & 0x3f );
46: }
47: else
48: {
49: UTF8CharLength += 4;
50: }
51:
52: }
53:
54: return UTF8CharLength;
55: }
褰揙utUnicodeString涓篘ULL鏃? 鍙互榪涜杈撳嚭鐨刄nicode瀛楃涓查暱搴︽帰嫻?/p>
1: uint32 UTF8StrToUnicode( const char* UTF8String, uint32 UTF8StringLength, wchar_t* OutUnicodeString, uint32 UnicodeStringBufferSize )
2: {
3: uint32 UTF8Index = 0;
4: uint32 UniIndex = 0;
5:
6: while ( UTF8Index < UTF8StringLength )
7: {
8: unsigned char UTF8Char = UTF8String[UTF8Index];
9:
10: if ( UnicodeStringBufferSize != 0 && UniIndex >= UnicodeStringBufferSize )
11: break;
12:
13: if ((UTF8Char & 0x80) == 0)
14: {
15: const uint32 cUTF8CharRequire = 1;
16:
17: // UTF8瀛楃爜涓嶈凍
18: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
19: break;
20:
21: if ( OutUnicodeString )
22: {
23: wchar_t& WideChar = OutUnicodeString[UniIndex];
24:
25: WideChar = UTF8Char;
26: }
27:
28: UTF8Index++;
29:
30: }
31: else if((UTF8Char & 0xE0) == 0xC0) ///< 110x-xxxx 10xx-xxxx
32: {
33: const uint32 cUTF8CharRequire = 2;
34:
35: // UTF8瀛楃爜涓嶈凍
36: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
37: break;
38:
39: if ( OutUnicodeString )
40: {
41: wchar_t& WideChar = OutUnicodeString[UniIndex];
42: WideChar = (UTF8String[UTF8Index + 0] & 0x3F) << 6;
43: WideChar |= (UTF8String[UTF8Index + 1] & 0x3F);
44: }
45:
46: UTF8Index += cUTF8CharRequire;
47: }
48: else if((UTF8Char & 0xF0) == 0xE0) ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
49: {
50: const uint32 cUTF8CharRequire = 3;
51:
52: // UTF8瀛楃爜涓嶈凍
53: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
54: break;
55:
56: if ( OutUnicodeString )
57: {
58: wchar_t& WideChar = OutUnicodeString[UniIndex];
59:
60: WideChar = (UTF8String[UTF8Index + 0] & 0x1F) << 12;
61: WideChar |= (UTF8String[UTF8Index + 1] & 0x3F) << 6;
62: WideChar |= (UTF8String[UTF8Index + 2] & 0x3F);
63: }
64:
65:
66: UTF8Index += cUTF8CharRequire;
67: }
68: else if((UTF8Char & 0xF8) == 0xF0) ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
69: {
70: const uint32 cUTF8CharRequire = 4;
71:
72: // UTF8瀛楃爜涓嶈凍
73: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
74: break;
75:
76: if ( OutUnicodeString )
77: {
78: wchar_t& WideChar = OutUnicodeString[UniIndex];
79:
80: WideChar = (UTF8String[UTF8Index + 0] & 0x0F) << 18;
81: WideChar = (UTF8String[UTF8Index + 1] & 0x3F) << 12;
82: WideChar |= (UTF8String[UTF8Index + 2] & 0x3F) << 6;
83: WideChar |= (UTF8String[UTF8Index + 3] & 0x3F);
84: }
85:
86: UTF8Index += cUTF8CharRequire;
87: }
88: else ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
89: {
90: const uint32 cUTF8CharRequire = 5;
91:
92: // UTF8瀛楃爜涓嶈凍
93: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
94: break;
95:
96: if ( OutUnicodeString )
97: {
98: wchar_t& WideChar = OutUnicodeString[UniIndex];
99:
100: WideChar = (UTF8String[UTF8Index + 0] & 0x07) << 24;
101: WideChar = (UTF8String[UTF8Index + 1] & 0x3F) << 18;
102: WideChar = (UTF8String[UTF8Index + 2] & 0x3F) << 12;
103: WideChar |= (UTF8String[UTF8Index + 3] & 0x3F) << 6;
104: WideChar |= (UTF8String[UTF8Index + 4] & 0x3F);
105: }
106:
107: UTF8Index += cUTF8CharRequire;
108: }
109:
110:
111: UniIndex++;
112: }
113:
114: return UniIndex;
115: }
鐤楁晥: 鐢ㄤ簡姝や唬鐮佸晩, 鍐嶄篃涓嶇敤琚玦conv鎶樼(浜?/p>
1: #ifdef _WIN32
2: #include <hash_map>
3: #define HASHMAP_PREFIX stdext
4: #else
5: #include <ext/hash_map>
6: #define HASHMAP_PREFIX __gnu_cxx
7: #endif
瀵逛簬鍒濆妗跺ぇ灝忚緗?Linux涓嬩嬌鐢╤ash_map鏋勯犲嚱鏁板彲浠ヨ緗? Windows涓嬪垯娌℃湁瀵瑰簲鐨勮緗嚱鏁?
鏌ラ槄Windows涓媓ash_map鐨勬簮鐮?騫跺湪hash_map()榛樿鏋勯犲嚱鏁版梺杈規坊鍔犱竴涓祴璇曠敤鍒濆妗惰緗嚱鏁?/p>
1: hash_map( size_type _Buckets )
2: : _Mybase(key_compare(), allocator_type())
3: {
4: _Init( _Buckets );
5: }
鎺ヤ笅鏉ヤ嬌鐢ㄧ浉鍚岀殑嫻嬭瘯浠g爜
1: const uint32 Buckets = 1000;
2: HASHMAP_PREFIX::hash_map<uint32,uint32> MyHash( Buckets );
3:
4: TimeRuler Ruler;
5: for ( uint32 i = 0; i <1000000;i++)
6: {
7: MyHash[i] = i;
8: }
9:
10: printf("%d\n", Ruler.GetCostTime() );
榪欓噷鐨凾imeRuler鏄嬌鐢╞oost timer鐨勬椂闂存埑灝佽
Release涓嬫祴璇曠粨鏋?
OS \ Buckets | 8 ( default ) | 1000 |
Win7 | 430ms | 560ms |
Mint( VMware ) | 127ms | 127ms |
Windows鐨勬祴璇曠粨鏋滆鏄? 涓嶇粰鍑烘《鍒濆鍖栧嚱鏁版槸姝g‘鐨? 榛樿綆$悊姣旇嚜宸辮緗洿楂樻晥.
Linux騫沖彴鎰熻寰堣寮? 涓嶆竻妤氭槸涓嶆槸铏氭嫙鏈洪犳垚鐨勭粨鏋滀笉鍑嗙‘
鏌ラ槄bjam鐨勫弬鏁拌鏄庡強luabind鐨刯amroot鏂囦歡絎?40琛屾湁濡備笅鏂囧瓧
install stage
: luabind
: <location>$(stage-locate)
<install-no-version-symlinks>on
<install-dependencies>on
<install-type>LIB
;
璇存槑鍙傛暟搴旇鏄繖鏍風殑: bjam install [stage]
鑰屼笖鏂囩珷涓粰鍑虹殑鏄痓jam install 鍥犳榛樿鍑鴻皟璇曠増涔熸槸姝g‘鐨? 鑰屼笖浼拌浣滆呭彧緙栬瘧浜嗚皟璇曠増灝辨病鏈夊鐞唕elease鐗堜簡
姝g‘鐨刲uabind緙栬瘧娉曞簲璇ユ槸:
export BOOST_ROOT=/home/davy/dev/boost_1_48_0
export LUA_PATH=/usr/local/
/home/davy/dev/boost_1_48_0/bjam stage --toolset=gcc --with-date_time --with-fpic --with-filesystem link=static debug release
/home/davy/dev/boost_1_48_0/bjam install debug
/home/davy/dev/boost_1_48_0/bjam install release
鎴戣繖閲屽繀欏繪寚鏄巄jam鏄洜涓篵oost鐨刡jam鐗堟湰楂樹簬榛樿瀹夎鐨勭増鏈? 鍥犳浣跨敤楂樼増鏈紪璇?
浠ヤ笅灝嗚櫄鎷熸満鍐呯郴緇熷彨Guest, 榪愯VMWare鐨勭郴緇熷彨Host
灝哣MWare鐨勭綉緇滄柟寮忚涓築ridge妯″紡. 娉ㄦ剰Host-Only妯″紡鍙兘涓嶩ost榪炴帴,灞鍩熺綉鐨勬満鍣ㄥ強浜掕仈緗戞満鍣ㄦ棤娉曡闂?/p>
鍦℅uest鐨勭綉緇滆緗腑,灝咺P璁劇疆涓轟笌Host鍦ㄤ竴涓眬鍩熺綉緗戞鐨処P, 璁劇疆DNS
鍏抽棴Guest緋葷粺
鎺ヤ笅鏉ュ皢Host鐨勫彲浠ヤ笂緗戠殑榪炴帴娣誨姞鍏變韓,騫惰繛鎺ュ埌VMNet1
榪涘叆Guest緋葷粺, 嫻嬭瘯涓婄綉