锘??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> 鍦ㄥ畼緗戜笅杞芥渶鏂扮増鐨刅SCode: https://code.visualstudio.com/ 鎵撳紑鎵╁睍闈㈡澘 VSCode->鏌ョ湅->鎵╁睍 鎵懼埌Go鎻掍歡 鍦ㄦ悳绱㈡閲岃緭鍏o, 鎵懼埌絎簩琛屽啓鏈?Rich Go language support for Visual Studio Code鐨勬彃浠? 鐐瑰嚮瀹夎 娉ㄦ剰涓嶆槸鎺掑悕鏈楂樼殑 閲嶅惎緙栬緫鍣?/p> 鎵撳紑璋冭瘯闈㈡澘 VSCode->鏌ョ湅->璋冭瘯 娣誨姞璋冭瘯鐩爣 鍦?娌℃湁璋冭瘯"鐨勪笅鎷夋涓偣鍑?娣誨姞閰嶇疆.." 娣誨姞鐩爣璋冭瘯閰嶇疆 渚嬪瓙: 鍏朵腑: "port", "host"閮芥槸go鎻掍歡鑷姩鐢熸垚鐨?/p>
"env"涓鴻緗幆澧冨彉閲? 璁劇疆涓轟綘鐨勫伐紼嬬洰褰曞氨鍙互(鍖呭惈bin, src鐨勬枃浠跺す) 姝ゆ椂鎵懼埌main.go鎸塅5, 浼氭姤閿欐彁紺? 鎴戜滑浣跨敤go鍛戒護琛岀紪璇戣皟璇曞櫒 灝哾lv璋冭瘯鍣ㄦ斁鍦℅OPATH(宸ョ▼鐩綍)鐨刡in鐩綍涓?/p>
璋冭瘯蹇嵎閿拰Visual Studio緋諱竴鑷?/p>
娉ㄦ剰鐐?/p>
]]>
]]>鍩烘湰姒傚康
浠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}
]]>鍑嗗VSCode
瀹夎Golang鎻掍歡
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${fileDirname}",
"env": {
"GOPATH":"D:/Develop/vscodegolang"
},
"args": [],
"showLog": true
}
]
}
鍑嗗璋冭瘯鎻掍歡
Failded to continue:"Cannot find Delve debugger. Install from https://github.com/derekparker/delve & ensure it is in your "GOPATH/bin" or "PATH"
go get github.com/derekparker/delve/cmd/dlv
閫変腑瑕佽皟璇曠殑main.go, 鐐瑰嚮F5, 鏃㈠彲浠ュ紑濮嬭皟璇?/p>
鍦╨aunch.json涓彲浠ユ坊鍔犲緇勮皟璇曞叆鍙? 閫氳繃璋冭瘯闈㈡澘涓変腑瀵瑰簲鐨勯厤緗紑鍚笉鍚岀洰鏍囩殑璋冭瘯
{
"version": "0.2.0",
"configurations": [
{
"name": "client",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${fileDirname}",
"env": {
"GOPATH":"D:/Develop/vscodegolang"
},
"args": [],
"showLog": true
},
{
"name": "server",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceRoot}/src/server",
"env": {
"GOPATH":"D:/Develop/vscodegolang"
},
"args": [],
"showLog": true
}
]
}
"program"涓殑"${fileDirname}"鏄互褰撳墠閫変腑鏂囦歡浣滀負鍚姩鐐?/p>
鏇村緩璁嬌鐢?program"鐨?${workspaceRoot}", 浠ュ寘鍚嶄綔涓哄惎鍔ㄧ偣鐨勬柟寮忚繘琛岄厤緗?/strong>
鎴戜滑鍏堢湅涓嬫瀯閫犲嚱鏁扮殑瑙勫垯
鏋勯犲弬鏁伴噺: 0琛ㄧず娌℃湁鏋勯犲嚱鏁? 1琛ㄧず鏈夋瀯閫犲嚱鏁?涓弬鏁?/p>
鏈被鏋勯?/th> | 鐖剁被鏋勯?/th> | 澶勭悊鏂規硶 |
---|---|---|
0 | 0 | 涓嶅鐞?/td> |
1 | 0 | 璋冩湰綾籧tor |
0 | 1 | 璋冪埗綾籧tor |
1 | 1 | 璋冩湰綾籧tor, 鏈被ctor璋冪埗綾籧tor |
2 | 1 | 璋冩湰綾籧tor, 鏈被ctor璋冪埗綾籧tor |
1 | 2 | 鎶ラ敊, 鎵嬪姩璋冪埗綾籧tor |
2 | 2 | 鎶ラ敊, 鎵嬪姩璋冪埗綾籧tor |
瀹為檯鍙敤鑰冭檻鏈鍏稿瀷鐨勪竴縐嶈涓? 瀹炰緥鍖栧瓙綾? 杞負鐖剁被璋冪敤鏂規硶, 榪欎釜鏃跺?/p>
濡傛灉鏂規硶鏄痮verride, 璋冪敤鐨勬槸瀛愮被
濡傛灉鏂規硶鏄痸irutal鎴栬呬笉鎸囨槑, 璋冪敤鐨勬槸鐖剁被
鏁翠釜閲嶈澆榪囩▼, 瀛愮被緇濆涓嶄細闅愬紡璋冪敤鐖剁被鐨勮涓?/p>
鏋勯犲嚱鏁扮殑浼樼偣
鏋勯犲嚱鏁扮殑緙虹偣
鍏跺疄鎴戜滑瀵瑰垵濮嬪寲鍑芥暟鐨勯渶姹傚彧鏈?鏉? 鑷畾涔?/p>
鎵浠? 鍙互鐞嗚ВGolang涓嶅姞鍏ユ瀯閫犲嚱鏁扮殑璁捐鏄紜殑
鍗? 綆鍗? 娓呮櫚, 鏈夎寰?/p>
浠栦滑鍏跺疄榪樻槸綾誨簱鍔熻兘, 閮藉湪buildin鍖呴噷鐨? 緋葷粺榛樿緇欎綘鍋氫簡涓?/p>
import(
. "buildin"
)
灝哹uildin鐨勫寘鍐呭閮芥槧灝勫埌鍏ㄥ眬鑰屽凡, 鍏跺疄浣犱篃鍙互鐢ㄨ嚜宸辯殑鍖呰繖涔堝仛
鎯寵窡鑴氭湰涓鏍瘋皟璇曟墦鍗版暟鎹箞?
println("hello world")
鏃犻渶鍖呭惈浠諱綍鍖? 鍥犱負瀹冨湪buildin鍖呴噷
榪欐槸鍦╞uildin鍖呴噷鐨勫畾涔?/p>
// iota is a predeclared identifier representing the untyped integer ordinal
// number of the current const specification in a (usually parenthesized)
// const declaration. It is zero-indexed.
const iota = 0 // Untyped int.
鎯蟲兂map鍜屾暟緇勭殑瀹氫箟
鍙槸娉涘瀷娌℃湁寮鏀劇粰鐢ㄦ埛鐢ㄨ屽凡(鍙XX鏀劇伀,涓嶈XX鐐圭伅)
榪樺湪涓哄涓猭ey杞琲d鐨勫鏉傜畻娉曡屽ご鐤間箞?
type myKey struct{
number int
str string
}
func main(){
t := map[ myKey] int {
myKey{ 2, "world"}: 1,
}
fmt.Println(t[myKey{2, "world"}])
}
杈撳嚭: 1
榛樿瀹氫箟涓涓灇涓?/p>
type MyConst int
const (
MyConst_A MyConst = iota
MyConst_B MyConst = iota
)
func main(){
fmt.Println(MyConst_A)
}
杈撳嚭: 0
濡傛灉鎴戜滑鎯寵嚜鍔ㄥ寲杈撳嚭MyConst_A瀛楃涓叉椂
灝遍渶瑕佷嬌鐢╣olang鐨勪竴涓伐鍏烽摼:golang.org/x/tools/cmd/stringer
灝嗗叾涓嬭澆, 緙栬瘧鎴愬彲鎵ц宸ュ叿鍚? 瀵逛唬鐮佽繘琛岀敓鎴?nbsp;
鐢熸垚鐨勪唬鐮佷細澶氬嚭涓涓獂x_string.go
閲岄潰灝辨槸鏋氫婦鐨凷tring()string 鍑芥暟
type love struct{
}
func (self*love)foo(){
fmt.Println("love")
}
func main(){
var chaos interface{} = new(love)
chaos.(interface{
foo()
}).foo()
}
func( self*MyStruct) foo( p int ){
}
鍐欎笉鎯痳eceiver鐨勫啓娉? 濡傛灉榪欐牱鏀逛笅鍛?
func foo( self *MyStruct, p int ){
}
鎵浠ヤ負浠涔堣Golang榪樻槸涓涓狢璇█鍢?/p>
C#鏈堿ssembly姒傚康, 鍙互鍦ㄤ竴涓狝ssembly閲屾悳绱? 鍒涘緩瀹炰緥
Golang鏄潤鎬佺被鍨嬭璦, 濡傛灉闇瑕? 鍙兘娉ㄥ唽浣犻渶瑕佸垱寤虹殑緇撴瀯浣? 鐒跺悗灝嗘敞鍐屽ソ鐨刴ap鐢ㄤ簬鍒涘緩
濡傛灉浣犻渶瑕佽法騫沖彴鐨勫伐鍏鋒祦紼嬪鐞? 瀵筆ython涓嶇啛鎮? 鍙互浣跨敤
go run yourcode.go 鍙傛暟1 鍙傛暟2
鏂瑰紡鏉ヨ繘琛屽伐鍏峰鐞?nbsp;
瑙夊緱鎱? 鍙互緙栬瘧鎴愬彲鎵ц鏂囦歡
榪欐牱鍋氱殑濂藉: 濡傛灉鏈変簺綾誨簱鏈韓灝辨槸go鍐欑殑, Python鎯充嬌鐢ㄦ槸寰堥夯鐑︾殑, 鑰孏olang鏉ュ啓鍒欒交鑰屾槗涓?/p>
渚嬪瓙: 閫氳繃go鐨刾rotobuf搴? 瀵逛竴浜涙枃浠惰繘琛屽鐞?/p>
type myType struct{
}
func (self*myType) foo( p int){
fmt.Println("hello", p )
}
func main(){
var callback func( int )
ins := new(myType)
callback = ins.foo
callback( 100 )
}
鍋氳繃lua鐨凜++浠g爜緇戝畾鐨勭闉嬮兘娓呮: lua鍙敮鎸佸閮ㄩ潤鎬佹垨鑰呭叏灞鍑芥暟璋冪敤
濡傛灉瑕佽繘琛孋++綾繪垚鍛樺嚱鏁拌皟鐢ㄦ椂, 瑕佽嚜宸卞鐞唗his鍜屾垚鍛樺嚱鏁?nbsp;
榪欑鎶宸у洜涓烘棭璧風紪璇戝櫒鐨勮櫄琛ㄤ笉鍚屽鉤鍙板疄鐜扮粏鑺備笉緇熶竴闇瑕佷笓闂ㄥ鐞?nbsp;
鍚庨潰璺ㄥ鉤鍙拌櫄琛ㄧ粺涓鍚? 綾繪垚鍛樺嚱鏁扮殑璋冪敤鍐欐硶涔熸槸寰堟伓蹇冨鏉傜殑
浣嗘槸Golang鐨勫皬鐧藉紡鐢ㄦ硶, 鐩存帴鍚婃墦C++, 鐢氳嚦C#澶嶆潅鐨刣elegate
鎵懼埌 鑿滃崟->鏌ョ湅->閫夐」->閫氱敤->瀛樺偍->瀛樺偍璁劇疆鍒版湰鍦癷ni鏂囦歡
鍏抽棴LiteIDE
澶嶅埗LiteIDE鏁翠釜鐩綍, 鍛藉悕鏂囦歡澶逛負浣犵殑宸ョ▼鍚?/p>
姣忎釜宸ョ▼鎵鍦ㄧ殑LiteIDE鐨勯厤緗皢鏄嫭绔嬬殑, 涓嶄細浜掔浉騫叉壈
鍒互涓虹▼搴忎竴瀹氳鏄痬ain寮濮嬬殑鎵嶅彲浠ヨ皟璇?/p>
Golang鐨勬祴璇曠▼搴忚櫧鐒墮兘鏄竴涓釜Test寮澶寸殑鍑芥暟,浣嗘墽琛実o test鏃? 榪樻槸鏈塵ain鍏ュ彛
鍦↙iteIDE涓? 鍙互鍦?璋冭瘯->寮濮嬭皟璇曟祴璇曠▼搴忛噷榪涜嫻嬭瘯紼嬪簭璋冭瘯
go鐨勫伐鍏烽摼榛樿鏀寔浜ゅ弶緙栬瘧
鍦↙iteIDE涓? 鍙互閫氳繃鍒囨崲杈撳嚭騫沖彴, 杈撳嚭涓嶅悓騫沖彴鐨勫彲鎵ц鏂囦歡
Google瀹樻柟涓篏olang鐨勮皟璇曚緥瀛愰粯璁や嬌鐢ㄤ簡gdb
鐒惰? 浣跨敤gdb璋冭瘯go紼嬪簭浼氶亣鍒癵oroutine鐨勫悇綾婚棶棰? 鍥犱負gdb涓嶆噦go
鍥犳, 榪欓噷浣跨敤delve榛戠鎶鏉ヨ繘琛孏olang鐨勭▼搴忚皟璇?/p>
綰懡浠よ璋冭瘯鏂規硶鍦ㄧ綉涓婂緢瀹規槗鎼滅儲鍒? 鏈枃涓昏浠iteIDE鏉ヨ繘琛岀▼搴忚皟璇?/p>
姝e父go build/install鍑虹殑go紼嬪簭鏄畬鍏ㄤ紭鍖栬繃鐨? 寮鴻浣跨敤璋冭瘯鍣ㄦ寕鎺ヨ皟璇曟椂, 鏌愪簺local鍙橀噺/lamda琛ㄨ揪寮忔崟鑾風殑鍙橀噺浼氱洿鎺ヨ繘鍏ュ瘎瀛樺櫒, 鏃犳硶浣跨敤璋冭瘯鍣ㄦ煡鐪?/p>
鍒犳帀鎵鏈夌殑pkg, 涓篵uild鎴杋nstall鍙傛暟鍔犲叆鍏抽棴緙栬瘧鍣ㄤ紭鍖栫殑鍙傛暟 -gcflags "-N -l"
渚嬪:
go install -gcflags "-N -l" svc\gamesvc
LiteIDE鑷甫浜唃db, 浣嗘槸娌℃湁delve璋冭瘯鍣? 闇瑕佽嚜琛屽畨瑁? 鍛戒護濡備笅
go get github.com/derekparker/delve/cmd/dlv
delve璋冭瘯鍣ㄤ細琚斁鍒頒綘鐨凣OPATH/bin涓?/p>
鍦↙iteIDE鑿滃崟涓夋嫨 璋冭瘯->debugger/delve
榪欎釜鏃跺? LiteIDE渚濈劧鎵句笉鍒癲elve, 鍥犱負瀹冧笉鍦ㄧ幆澧冨彉閲廝ATH涓? 榪欓噷鏃犻渶淇敼鐜鍙橀噺, 鍙渶瑕丩iteIDE鐨勭幆澧冮厤緗?/p>
鍦↙iteIDE鑿滃崟涓夋嫨 鏌ョ湅->緙栬緫褰撳墠鐜, 鍦ㄥ脊鍑虹殑鏂囨。涓慨鏀?/p>
PATH=c:\mingw32\bin;%GOROOT%\bin;%PATH%;c:\your\path\to\delve
鍘繪帀PATH鍓嶇殑娉ㄩ噴#, 鍦?PATH%娣誨姞鍒嗗彿, 鐒跺悗鍜屼綘鍒癲elve璋冭瘯鍣ㄧ殑璺緞
閫夋嫨浣犵殑宸ョ▼, 鐐瑰嚮F5, 榪涘叆璋冭瘯妯″紡
LiteIDE浣跨敤delve璋冭瘯鏃? 鏃犳硶鍦?鍙橀噺 鐩戣絳夌獥鍙d腑姝g‘鎹曟崏delve璋冭瘯榪斿洖鏁版嵁(鍥犱負鏍煎紡澶鏉備簡…)
娌″叧緋? 鎴戜滑浣跨敤鍛戒護琛岄厤鍚堟樉紺哄嵆鍙?/p>
LiteIDE鎺у埗鍙版垨璋冭瘯杈撳嚭紿楀彛鍦╠elve璋冭瘯鏃? 瀹為檯涓婃槸涓涓爣鍑嗗懡浠よ
鍛戒護濡備笅
p 鍙橀噺鍚嶅彲浠ユ煡鐪嬪彉閲忓?/p>
locals鏌ョ湅灞閮ㄥ彉閲?/p>
ls鍙煡鐪嬪綋鍓嶆枃浠?/p>
stack鏌ョ湅鏍?/p>
help鍙互鏌ョ湅鍚勭甯姪
濡傛灉浣犵殑紼嬪簭鏄閮ㄧ▼搴? 鎴栬呬嬌鐢╣o install瀹夎鍒癎OPATH/bin鐩綍鐨勭▼搴? 閭d箞浣跨敤delve璋冭瘯鍣ㄥ惎鍔ㄧ▼搴忔椂, 鍙兘浼氱鍒板惎鍔ㄨ礬寰勯敊璇殑闂
浣跨敤LiteIDE鑿滃崟 璋冭瘯->璋冭瘯鍏朵粬搴旂敤紼嬪簭… 濉叆浣犺璋冭瘯紼嬪簭鐨勮礬寰勪互鍙婂伐浣滅洰褰? 鍙互瑙e喅榪欎釜闂
鎴戜滑瀵笹olang鐨勭粨鏋勪綋鍙橀噺璧嬪? 浠ュ強鍗曞弬鏁板嚱鏁拌皟鐢ㄨ繘琛屽弽灝勫拰native鎿嶄綔鐨勬祴璇?pre>
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)})
}
}
=== RUN TestNativeAssign
鈥?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 })
}
鍚勪綅鐪嬪畼蹇呴』鍚愭Ы鐢╢or鏉ラ亶鍘嗚幏鍙栨暟鎹? 浣嗗喎闈欎笅鏉ュ垎鏋? 榪欐牱鍋氭棤鍙帤闈?
璇曟兂濡傛灉reflect鍖呭湪鎴戜滑浣跨敤ValueOf鏃朵嬌鐢╩ap緙撳啿濂戒竴涓粨鏋勪綋鎵鏈夊瓧孌電殑璁塊棶鏁版嵁鍚? 鑲畾璁塊棶鎸囧畾瀛楁閫熷害浼氬緢蹇?br>浣嗘槸, 浠ョ┖闂存崲閫熷害鐨勯渶姹傚叾瀹炴渶澶氭弧瓚充簡1%鐨勯渶姹?
鍚屾牱鐨勪緥瀛愭槸鍥懼艦API閲岃闂甋hader鍙橀噺鐨勬柟娉? 鎬繪槸榛樿浣跨敤瀛楃涓茶幏鍙? 閫熷害寰堟參. 褰撲綘鎯沖揩閫熻闂椂, 璇鋒彁鍓嶆寜闇緙撳瓨瀛楁
閭d箞, Golang浣跨敤鐨勪篃鏄繖鏍風殑鎬濊礬. 铏界劧鏆村姏浜嗕竴鐐? 浣嗘槸鑳藉璁╃▼搴忚窇瀵? 鎬ц兘浼樺寲鐨勪笢瑗挎斁鍦ㄤ箣鍚庢潵鍋? 緙撳啿涓嬪氨鍙互瑙e喅
涓嬮潰浠嬬粛涓媝roto3鐨勪竴浜涚粏鑺傚彉鍖?/p>
榪欎釜鐗堟湰鐨刾rotoc鐨刾rotobuf緙栬瘧鍣ㄥ凡緇忓彲浠ユ敮鎸乸roto2璇硶鍜宲roto3鐨勮娉?/p>
濡傛灉浣犵殑proto鏂囦歡娌℃湁娣誨姞syntax璇存槑鐨勮瘽, 鐢ㄨ繖涓増鏈殑緙栬瘧鍣ㄤ細鎶ラ敊, 鎻愮ず浣犻粯璁roto2鏀寔, 璇鋒坊鍔犺娉曟爣璁?/p>
syntax = "proto2";
鍙繚鐣檙epeated鏍囪鏁扮粍綾誨瀷, optional鍜宺equired閮借鍘繪帀浜?/p>
瀹為檯浣跨敤璇佹槑, required鐨勮璁$‘瀹炴槸铔嬬柤, C++鐨勮皟璇曠増浼氬脊鍑篴ssert,release鐗堝拰optional涔熸病鍟ュ尯鍒?/p>
map緙栧啓鏍煎紡涓?/p>
map<key_type, value_type> map_field = N;
渚嬪:
map<string, Project> projects = 3;
浠g爜鐢熸垚紜鏀寔map, 榪欏浜庡緢澶氳璦鏉ヨ鍙堝彲浠ュ伔鎳掍簡
浣嶄簬proto2璇硶鐨勫瓧孌祅umber鍚庣殑[default=XX]
榪欎釜涓滆タ涓嶈兘鐢ㄤ簡, 鐞嗙敱鏄?
瀵逛簬鍚屼竴孌靛簭鍒楀寲鍚庣殑鏁版嵁, 濡傛灉搴忓垪鍖栫鐨刣efault鍜屽弽搴忓垪鍖栫鐨刣efault鎻忚堪涓嶄竴鏍蜂細瀵艱嚧鏈緇堢粨鏋滃畬鍏ㄤ笉涓鑷?/p>
鍗? 鍚屼竴涓暟鎹袱涓粨鏋? 榪欐槸涓嶅彲棰勬祴鐨勭粨鏋? 鍥犳騫叉帀榪欎釜鐗規?/p>
涓嶈繃鏈漢瑙夊緱, 瀵逛簬娓告垙鏉ヨ, 榪欎釜鍔熻兘鏈韓鍙互鍘嬬緝寰堝鏁版嵁,铏界劧浼氭湁闅愭偅
proto2閲岀殑榛樿鍊兼槸鏋氫婦鐨勭涓涓獀alue瀵瑰簲鐨勫? 涓嶄竴瀹氫負0
proto3鍦ㄤ綘瀹氫箟value鏃? 寮哄埗瑕佹眰絎竴涓煎繀欏諱負0
榪欎釜淇敼涓洪伩鍏嶉殣鎮h繕鏄湁甯姪鐨?/p>
any綾誨瀷, 鍙互浠h〃浠諱綍綾誨瀷, 鍙互鍏堣榪涙潵, 鍐嶈繘琛岃В鏋? 娌″叿浣撶敤, 姝ュ瓙璺ㄥぇ浜嗘曟壇鍒拌泲
榪欎釜鏋佸ソ, json鍐嶆琚悓鍖栦簡
js, objc, ruby, C#絳夌瓑
鐒惰? C#鐗堟湰鐨勫熀紜runtime搴撴槸鐢–# 6.0鐨勮娉曞啓鐨?榪欏浜嶶nity mono紲栦紶2.0鏉ヨ, 紜疄鎵埌铔嬩簡,娌℃硶鐢?/p>
緙栬瘧璧鋒潵紼嶅井楹葷儲, 榪樿涓嬩釜琚鎺夌殑cmake鈥?/p>
Golang鐨勫畼鏂筽rotobuf鏀寔: https://github.com/golang/protobuf
瀵逛簬proto2鐨勬枃浠? 鐢熸垚鐨刧o浠g爜涓殑緇撴瀯浣撲緷鐒朵嬌鐢ㄧ被鍨嬫寚閽堜綔涓洪粯璁ゅ瓨鍌? 鍏煎鑰佺殑緋葷粺
瀵逛簬proto3鐨勬枃浠? 鐢熸垚鐨刧o浠g爜涓殑緇撴瀯浣撶洿鎺ヤ嬌鐢ㄥ瓧孌典綔涓洪粯璁ゅ瓨鍌? 涓嶅啀浣跨敤GetXXX鏉ヤ綔涓哄瓧孌靛艱闂? 璧嬪兼椂涔熸棤闇浣跨敤proto.綾誨瀷() 鍑芥暟榪涜鎸囬拡綾誨瀷瀛楁鍊煎垱寤?
榪欎釜璋冩暣寰堟槸鏂逛究, 浣嗕涪澶變簡optional鍒ゆ柇鍔熻兘, 瀵瑰簲C++閲屽氨鏄痟asXXX鐨勫姛鑳? 涓嶈繃濂芥榪欎釜閫昏緫鐜板湪鐢ㄧ殑涓嶅浜?/p>
榪欎釜淇敼澶ф涔熸槸閰嶅悎json搴忓垪鍖栨潵鍋氱殑, go榛樿鐨刯son搴忓垪鍖栨椂, 鏃犳硶浣跨敤proto2鐢熸垚鐨勭粨鏋勪綋鐨? 鍥犱負閮芥槸鎸囬拡,鏃犳硶璧嬪?.
鏂版彃浠朵細緇欐瘡嬈$敓鎴愮殑鏂囦歡娣誨姞榪欐牱涓孌典唬鐮?/p>
var fileDescriptor0 = []byte{
// 220 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x64, 0x8f, 0xcd, 0x4e, 0xc5, 0x20,0x10, 0x85, 0x53, 0xbd, 0x35, 0x32, 0xb7, 0xdd, 0x4c, 0x5c, 0xb0, 0x70, 0x71, 0xd3, 0xb8, 0x70,0x75, 0x17, 0xfa, 0x04, 0xc6, 0xd8, 0xb8, 0x50, 0x63, 0xa8, 0x2f, 0x80, 0xed, 0x44, 0x89, 0x28,0x04, 0xc6, 0xbf, 0x47, 0xf1, 0x6d, 0x95, 0x49, 0x8d, 0x4d, 0x5c, 0x01, 0xdf, 0x39, 0x7c, 0x30,0x00, 0x1c, 0x82, 0xdf, 0xc6, 0x14, 0x38, 0xe0, 0xaa, 0xec, 0xbb, 0x37, 0x68, 0x2e, 0x3e, 0x62,0x48, 0x7c, 0x49, 0x76, 0xa2, 0x84, 0x47, 0xd0, 0xde, 0x96, 0xf8, 0xee, 0x33, 0xd2, 0x8d, 0x7d,0x26, 0x5d, 0x6d, 0xaa, 0x63, 0x65, 0xda, 0xb8, 0x84, 0xd8, 0x41, 0x63, 0xc2, 0x7b, 0xef, 0xc8,0x4f, 0x52, 0xda, 0x91, 0x52, 0x93, 0x16, 0x0c, 0x0f, 0x41, 0x89, 0xa9, 0x77, 0x9e, 0xf4, 0xae,0x14, 0x54, 0xfc, 0x05, 0xdd, 0x57, 0x05, 0x4a, 0xba, 0xd7, 0xc4, 0x16, 0xb7, 0x80, 0x03, 0x27,0xf7, 0xf2, 0x70, 0x72, 0xe5, 0x32, 0x0f, 0xd1, 0x3b, 0xa6, 0x34, 0x5b, 0x31, 0xff, 0x4b, 0x70,0x03, 0x6b, 0x43, 0x91, 0x2c, 0x9f, 0x3f, 0xd2, 0xf8, 0x24, 0xf6, 0x7d, 0xb3, 0x4e, 0x7f, 0x08,0x0f, 0xa0, 0x3e, 0xf3, 0xce, 0x66, 0xbd, 0x12, 0x49, 0x6d, 0xcb, 0xa1, 0x4c, 0x37, 0xbf, 0xf3,0xb3, 0xbc, 0x8e, 0xac, 0x6b, 0xb9, 0xd9, 0xe6, 0x25, 0xbc, 0xdf, 0x93, 0x6f, 0x9e, 0x7e, 0x07,0x00, 0x00, 0xff, 0xff, 0x0c, 0x9f, 0x10, 0xa8, 0x2e, 0x01, 0x00, 0x00,}
瀵逛簬meta淇℃伅鐨勬彁鍙栬繕鏄緢鏂逛究鐨?/p>
鐒惰?/p>
瀵逛簬澶氫釜鏂囦歡鐨勭敓鎴? 榪欐牱鍋氶潪甯哥殑楹葷儲, 鍥犱負榪欎釜瀛楁浼氶噸澶嶅鑷寸紪璇戦敊璇?/p>
寰堝浜哄湪璁哄潧閲屽悙妲? 瀹樻柟緇欏嚭鐨勮В鍐蟲柟娉曟槸, 浣跨敤protoc涓嬈℃т紶鍏ヤ竴涓猵ackage涓嬬殑鎵鏈夌殑proto鐩存帴鐢熸垚涓涓猤o
鑰屼笉鏄幇鍦ㄧ殑涓涓猵roto涓涓猤o
浠ュ墠榪欎釜浠g爜闇瑕佽嚜宸辨潵鍋? 鐜板湪瀹樻柟鎻愪緵浜嗘敮鎸? 寰堟槸鏂逛究
鐒惰? 涓轟粈涔堜笉鏀寔閬嶅巻鈥?孌嬪康鍟? 鍙堣鑷繁鍔ㄦ墜浜?/p>
https://github.com/davyxu/tabtoy
寮鍙戞晥鐜囷細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浼氭槸棣栭?
浣嗘葷殑涓鐐癸紝 榪樻槸鏍規嵁鍥㈤槦鐔熸倝搴︽潵閫夋嫨璇█錛岃錘鐒剁殑浣跨敤鏂拌璦鐨勯闄╀篃鏄緢澶х殑
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
Action[] a = new Action[3];
for (int i = 0; i < 3; i++)
{
a[i] = ( ) => { Console.WriteLine(i); };
}
for (int i = 0; i < 3; i++){
a[i]();
}
C#鎵撳嵃緇撴灉涓? 3 3
Golang鐨勪緥瀛?/p>
a := make([]func(), 3 )
for i := 0; i < 3; i++ {
a[i]= func( ){
fmt.Println(i)
}
}
for _, s := range a {
s()
}
Golang鎵撳嵃緇撴灉涓? 3 3
鏈鍚庢槸Lua鐨勪緥瀛?/p>
a = {}
for i = 1, 3 do
table.insert( a, function()
print(i)
end
)
end
for _, v in ipairs(a) do
v()
end
Lua鎵撳嵃緇撴灉涓? 2 3
宸紓鍦ㄤ簬, C#鍜孏olang灝嗗彉閲忔崟鑾峰埌闂寘鍐呮椂, 鍧囦嬌鐢ㄥ紩鐢ㄦ柟寮? 鍗沖綋鏈鍚庡紑濮嬭皟鐢ㄤ嬌鐢ㄥ彉閲忔椂, 鐢變簬鍙橀噺宸茬粡緇撴潫寰幆, 鎵浠ユ槸鏈緇堝?/p>
浣嗘槸Lua鎹曡幏鏂瑰紡鏄兼崟鑾? 鍥犳姣旇緝瀹規槗鐞嗚В, 鏄灝戝氨鏄灝?/p>
鍦ㄦ垜浠殑娓告垙欏圭洰涓嬌鐢ㄧ殑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鐨勬ц兘鎹熻楀浜庢暣涓昏緫鐨勫鐞嗘潵璇村潎鍙互蹇界暐涓嶈
浣嗕綔涓烘柊鐢熶唬璇█鐨勭壒鐐瑰氨鏄疄鎴? Golang榪欎竴騫撮噷, 宸茬粡涓洪」鐩彁渚涗簡紼沖畾鐨勬湇鍔″櫒鍜屽己澶х殑鎵╁睍鑳藉姏, 涓庡鎴風鐨刄nity3D閲岀殑C#涓鏍? 閮芥槸寮哄ぇ, 鏋佽嚧寮鍙戞晥鐜囦唬琛ㄧ殑浼樼寮鍙戣璦.
Golang鍒板簳鎷挎潵鍋氬暐? 鎴戦渶瑕佷箞?
楂樻晥(鎬ц兘,寮鍙?鐨勬湇鍔″櫒璇█. 鍖呮嫭Web, 娓告垙, App
緙栧啓妗岄潰綰I鏆備笉鏄緢閫傚悎
鎴戦渶瑕佹妸鐜板湪鐨凜++, Python, Erlang絳夋湇鍔″櫒鏀規垚Golang涔?
鎬ц兘鏈夌摱棰? 寮鍙戞晥鐜囦綆, 鏈夐挶鏈夋椂闂寸殑璇? 瀹屽叏鍙互
鍚繃澶鐨勪漢瀵笹olang鐨勮瘎浠? 澶ф鍒嗕負榪欎箞鍑犵被:
姝ょ被鍏氬憳瀵逛換浣曚簨鐗╅兘榪芥眰鏋佽嚧鐨?鎬ц兘. 榪樺ソGolang鏄洿鎺ョ敓鎴恘ative code, 鍚﹀垯浼氳鎵圭殑浣撴棤瀹岃偆. 浣嗘槸鐢變簬Golang搴曞眰涓哄茍鍙戝拰寮鍙戞晥鐜囪屽仛鍑虹殑涓浜涚郴緇? 綾諱技浜嶨C, 璋冨害鍣ㄥ拰鍒嗛厤鍣ㄧ瓑, 浼氬湪璇█灞備笂鎹熷け寰堝鎬ц兘. 鍥犳C/C++鍏氳繕鏄湁鐞嗙敱鎵笹olang鎬ц兘浣庝笅
浣滀負鐢典俊綰у厓鑰? Erlang鐨勬ā鍨嬪拰鏋舵瀯褰撲箣鏃犳劎, OTP鎵╁睍鎬ц秴綰у己. 瀹岀編鐨凙ctor妯″瀷涔熻閫昏緫緙栧啓姣擮O鏇村姞鐩磋
CSP涓嶢ctor鍖哄埆浠呬粎鍙槸鍦╟hannel鐨勫綊灞炶寖鍥磋屽凡, 浣嗚繖鐐圭粏寰樊鍒嵈瀵逛袱縐嶈璦鐨勫紑鍙戝彉鐨勮駿鐒朵笉鍚?/p>
Golang鍦ㄥ茍鍙戞ā鍨嬩笂閫夋嫨浜咰SP, 灝辨槸鑰冭檻鎶婃灦鏋勭殑璁捐鐣欑粰浣跨敤鑰? 鍍廋#涓鏍峰緩绔嬩竴涓被搴撶殑涓栫晫, 鑰屼笉鏄疢FC涓鏍風殑妗嗘灦涓栫晫. 璁╁紑鍙戞洿鑷敱
Erlang鐨凙ctor涔熸病閿? 璁╁紑鍙戞洿鐩磋, 璁╁穿婧冩彁鍓嶆潵鍒? 灝藉揩澶勭悊
Rust鍦ㄥ彂鏂囨椂宸茬粡鍙戝竷浜?.0. 榪欒R綺夊叴濂嬬殑絀挎浜庡悇澶ф妧鏈鍧涘拰璁ㄨ緹?/p>
浣哛ust鐨勭悊蹇靛湪鎴戠湅鏉ユ湁鐐瑰亸鎵т簡, 涓瀹氳鎶婂悇縐嶉敊璇湪緙栬瘧鏈熸毚闇插嚭鏉? 鎵浠ラ犲嚭浜嗗緢澶氫笉闇瑕佺殑綾誨瀷鍜屾蹇? 榪炶璦閮芥瘮C璇█鏇寸鍙瘋瘽
澶х櫧璇濊鏉? 鏈夌偣緙栫▼緇忛獙鐨勪漢鐪嬪埌JavaScript瀹屽叏鐪嬪緱鎳? 浣嗙湅Rust鍗村儚澶╀功
瀵規瘮鍚屾椂鏈熺殑TypeScript, Dart, Swift. Rust灝辨槸鏈夌偣閭d箞鐙緹韞婂緞
璇ュ厷鍏氬憳緇忓父鎬х殑鐢ㄥ悇縐嶇壒鎬у姣擥olang, 榪芥眰鍗曠壒鎬х殑浼樼.
浣嗗叾瀹? Golang鏈韓鏄竴闂ㄥ畬鏁村摬瀛? 寰堝璇█鐗規т簰鐩鎬箣闂存湁鍏寵仈. 鏈夎璁′笉褰撶殑鍦版柟, 褰撶劧鏇村鐨勬槸瀹屾暣浣撶郴. 涓嶆眰鍜屽叾浠栬璦姣?/p>
鍙拷姹傝В鍐抽棶棰樼殑閫熷害
浜戦鐪嬭繃Golang鍚? 鍥犱負璇ヨ璦鏈韓灝辨槸寮哄寲鐗堢殑C, 鍥犳棰囧彈浜戦鍠滄. 浣嗗湪涓鍫嗚瘎浠峰悗, 浜戦榪樻槸鏋滄柇閫夋嫨浜咰+lua鐨勭粍鍚堝啓鍑虹殑Skynet
铏界劧涓嶇煡閬撳師鍥? 浣嗘垜鐚滅殑璇? 姣曠珶鏄璇█鏈韓鐨勫彲鎺фц繕涓嶉偅涔堢湅濂?/p>
鍚屾椂, 鎴戜滑鍙戠幇Skynet浣跨敤鐨勬槸Actor妯″瀷, 涔熷彂鐜板ぇ紲炵駭鐨勭▼搴忓憳灝辨槸鏈夊厛瑙?
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
璁捐
韙忓叆Golang, 灝變笉瑕佸皾璇曡璁℃ā寮?/p>
浼犵粺鐨凮O鍦ㄨ繖閲屾槸闈炴硶鐨? 灝濊瘯妯℃嫙鍙槸涓縐嶆悶絎?/p>
鎶奜O鍦℅olang閲屾崲鎴愬鍚?鎺ュ彛
瀵瑰疄鐜拌呮潵璇? 鎶婂悇縐嶇粨鏋勯兘澶嶅悎璧鋒潵, 瀵瑰鏆撮湶鍑轟竴涓垨澶氫釜鎺ュ彛, 鎺ュ彛灝卞ソ鍍忎嬌鐢ㄨ呭湪瀹炵幇妯″瀷涓婃墦鍑虹殑寰堝媧?/p>
鍒曞叏灞鍑芥暟, 鍖?Package)鍙互鎺у埗鍏ㄥ眬鍑芥暟浣跨敤鑼冨洿.
娌″繀瑕佷粈涔堥兘鐢╥nterface瀵瑰灝佽, struct涔熸槸涓縐嶈壇濂界殑灝佽鏂規硶
Golang鏃犵戶鎵? 鍥犳鏃犻渶綾繪淳鐢熷浘. 娌℃湁媧劇敓榪欑鐐瑰鐐圭殑渚濊禆, 鍥犳涓嶄細鍦ㄥぇ閲忕被鍏崇郴鍒版潵鏃? 褰㈡垚綣佹潅涓嶅彲鍙樺寲鐨勬爲褰㈢粨鏋?/p>
瀹瑰櫒
鐢ㄤ簡寰堥暱鏃墮棿map, 鎵嶅彂鐜癎olang鎶妋ap鍐呭緩涓鴻璦鐗規ф椂, 宸茬粡鍘繪帀浜嗗緗瀷map鐨刟pi鐗規? 涓鍒囩殑璁塊棶鍜岃幏鍙栭兘鏄寜鐓ц璦鐗規ф潵鍋氱殑, 鍘熷瓙鍖?/p>
鏁扮粍鍙互鐞嗚В涓哄簳灞傚璞? 浣犲鉤鏃剁敤鐨勯兘鏄垏鐗? 涓嶆槸鏁扮粍, 鍒囩墖灝辨槸鎸囬拡, 鎸囧悜鏁扮粍. 鍒囩墖鏄交閲忕殑, 鍗充究鍊兼嫹璐濅篃鏄綆鎹熻楃殑
鍐呭瓨
Golang鍦ㄥ疄闄呰繍琛屼腑, 浣犱細鍙戠幇鍐呭瓨鍙兘浼氱柉娑? 浣嗚窇涓婁竴孌墊椂闂村悗, 灝變繚鎸佺ǔ瀹? 榪欏拰Golang鐨勫唴瀛樺垎閰? 鍨冨溇鍥炴敹鏈変竴瀹氱殑鍏崇郴
鐜頒唬鐨勭紪紼嬭璦鐨勫唴瀛樼鐞嗕笉浼氬緢綺楁毚鐨勭洿鎺ヤ粠OS閭h竟鍒嗛厤寰堝鍐呭瓨. 鑰屾槸鎸夐渶鐨勪笉鏂垎閰嶆垚鍧楃殑鍐呭瓨.
瀵逛簬闈炴搗閲忕駭搴旂敤, Golang鏈韓鐨勫唴瀛樻ā鍨嬪畬鍏ㄥ彲浠ユ拺寰椾笅鏉? 鏃犻渶鍍廋++涓鏍? 姣忎釜宸ョ▼蹇呭仛鍐呭瓨姹犲拰綰跨▼姹?/p>
Channel
Channel鍜岄攣璋佽交閲? 涓鍙ヨ瘽鍛婅瘔浣? Channel鏈韓鐢ㄩ攣瀹炵幇鐨? 鍥犳鍦ㄨ揩涓嶅緱宸叉椂, 榪樻槸灝介噺鍑忓皯浣跨敤Channel, 浣咰hannel灞炰簬璇█灞傛敮鎸? 閫傚害浣跨敤, 鍙互鏀瑰杽浠g爜鍙鍐?/p>
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
閿欒
瑙夊緱Golang涓嶅仠鐨勫鐞唀rr? 閭f槸鍥犱負騫蟲椂鍦ㄥ叾浠栬璦鏍規湰娌″鐞嗚繃閿欒, 瑕佷笉鐒跺氨鏄牴閮ㄤ竴嬈℃ry榪囨墍鏈夌殑寮傚父, 榪欐槸涓縐嶅嵄闄╃殑琛屼負
panic鍙互琚崟鑾? 鍥犳緙栧啓鏈嶅姟鍣ㄦ椂, 鍙互鍋氬埌涓嶆寕
鍗遍櫓鐨刬nterface{}
榪欎笢瑗垮氨璺烠/C++閲岀殑void*涓鏍風殑鍗遍櫓, nil琚玦nterface{}鍖呰9鍚庝笉浼氱瓑浜巒il鐩哥瓑, 浣唒rint鍑烘潵紜疄鏄痭il
妯℃澘浼拌鍙互瑙e喅瀹瑰櫒鍐呭甫interface{}鐨勯棶棰? 浣嗘柊涓滆タ寮曞叆, 浼拌鍙堜細璁╃幇鍦ㄧ殑鍝插涓浜涘噷涔?/p>
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
璇█瀛︿範鎸夌収瀹樼綉鐨勬暀瀛﹁蛋, 璺戝畬鍩烘湰灝變細浜?/p>
涓嬭澆涓涓狶iteIDE, 閰嶅悎Golang鐨凴untime,鍩烘湰寮鐜灝辨湁浜?/p>
Golang鐨勭被搴撹璁℃柟寮忓拰C#/C++閮戒笉鍚? 濡傛灉鏈塒ython緇忛獙鐨勪細鎰熻姣棤榪濆拰鎰?/p>
鏈変竴涓囦釜鐞嗙敱閫犺疆瀛愰兘璇蜂綇鎵? 綾誨簱閲屾湁浣犺鐨勪笢瑗?/p>
鍐欏ぇ宸ョ▼璇鋒悳绱? Golang欏圭洰鐩綍緇撴瀯緇勭粐
Golang璇█鏈韓鏈漢娌℃湁鍙戠幇bug, 鍗充究鏈変篃鏃╁氨琚ぇ紲炰滑鎹変綇浜? 鍞竴鐨勪竴涓劅瑙夎矊浼糱ug鐨? 緇忓父鏄粨鏋勪綋鎴愬憳棣栧瓧姣嶅皬鍐? 浣嗘槸json鍙堟棤娉曞簭鍒楀寲鍑烘潵鈥?/p>
鎱庣敤cgo. 瀹樻柟宸茬粡澹版槑鏈潵瀵筩go涓嶆彁渚涘畬鏁村吋瀹規? 浠諱綍涓闂ㄨ璦鍦ㄦ棭鏈熼兘闇瑕佸C鍋氬嚭鏀寔, 浣嗗悗鏈熷畬鍠勫悗鐨勪笉鍏煎閮芥槸甯告?/a>
杞澆璇鋒敞鏄? 鎴橀瓊灝忕瓚http://www.shnenglu.com/sunicdavy
// String returns the time formatted using the format string
// "2006-01-02 15:04:05.999999999 -0700 MST"
func (t Time) String() string {
return t.Format("2006-01-02 15:04:05.999999999 -0700 MST")
}
灝濊瘯灝?006-01-02 15:04:05鍐欏叆鍒拌嚜宸辯殑渚嬪瓙涓?pre>func nowTime() string {
return time.Now().Format("2006-01-02 15:04:05")
}
緇撴灉榪斿洖姝g‘. 璇㈤棶浜嗕笅, 鎹榪欎釜鏃ユ湡鏄痝olang璇炵敓鐨勬棩瀛愨?鍜嬮偅涔堣嚜鎭嬪憿鈥?