是程序運(yùn)行太快肉眼分辨不出了,可以睡眠5秒
公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出天臺免費(fèi)做網(wǎng)站回饋大家。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("hello world !")
time.Sleep(5 * time.Second)
}
應(yīng)用程序發(fā)生異常 未知的軟件異常
1.病毒木馬造成的,在當(dāng)今互聯(lián)網(wǎng)時代,病毒坐著為了獲得更多的牟利,常用病毒綁架應(yīng)用程序和系統(tǒng)文件,然后某些安全殺毒軟件把被病毒木馬感染的應(yīng)用程序和系統(tǒng)文件當(dāng)病毒殺了導(dǎo)致的。
2.應(yīng)用程序組件丟失,應(yīng)用程序完整的運(yùn)行需要一些系統(tǒng)文件或者某些ll文件支持的,如果應(yīng)用程序組件不完整也會導(dǎo)致的。
3.系統(tǒng)文件損壞或丟失,盜版系統(tǒng)或Ghost版本系統(tǒng),很容易出現(xiàn)該問題。
4.操作系統(tǒng)自身的問題,操作系統(tǒng)本身也會有bug 。
5.硬件問題,例如內(nèi)存條壞了或者存在質(zhì)量問題,或者內(nèi)存條的金手指的灰塵特別多。
應(yīng)用程序發(fā)生異常怎么辦
1.檢查電腦是否存在病毒,請使用百度衛(wèi)士進(jìn)行木馬查殺。
2.系統(tǒng)文件損壞或丟失,盜版系統(tǒng)或Ghost版本系統(tǒng),很容易出現(xiàn)該問題。建議:使用完整版或正版系統(tǒng)。
3.安裝的軟件與系統(tǒng)或其它軟件發(fā)生沖突,找到發(fā)生沖突的軟件,卸載它。如果更新下載補(bǔ)丁不是該軟件的錯誤補(bǔ)丁,也會引起軟件異常,解決辦法:卸載該軟件,重新下載重新安裝試試。順便檢查開機(jī)啟動項(xiàng),把沒必要啟動的啟動項(xiàng)禁止開機(jī)啟動。
4.如果檢查上面的都沒問題,可以試試下面的方法。
打開開始菜單→運(yùn)行→輸入cmd→回車,在命令提示符下輸入下面命令 for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1回車。
完成后,在輸入下面
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回車。
如果怕輸入錯誤,可以復(fù)制這兩條指令,然后在命令提示符后擊鼠標(biāo)右鍵,打“粘貼”,回車,耐心等待,直到屏幕滾動停止為止。(重啟電腦)。
一開始你只有一個主協(xié)程,如果子協(xié)程不啟動,即便主協(xié)程讓出了時間片,也沒有可運(yùn)行的子協(xié)程啊。交換順序就是起到了先啟動子協(xié)程的作用。
這個問題說來話長,我先表達(dá)一下我的觀點(diǎn),Go語言從語法層面提供區(qū)分錯誤和異常的機(jī)制是很好的做法,比自己用單個返回值做值判斷要方便很多。
上面看到很多知乎大牛把異常和錯誤混在一起說,有認(rèn)為Go沒有異常機(jī)制的,有認(rèn)為Go純粹只有異常機(jī)制的,我覺得這些觀點(diǎn)都太片面了。
具體對于錯誤和異常的討論,我轉(zhuǎn)發(fā)一下前陣子寫的一篇日志拋磚引玉吧。
============================
最近連續(xù)遇到朋友問我項(xiàng)目里錯誤和異常管理的事情,之前也多次跟團(tuán)隊(duì)強(qiáng)調(diào)過錯誤和異常管理的一些概念,所以趁今天有動力就趕緊寫一篇Go語言項(xiàng)目錯誤和異常管理的經(jīng)驗(yàn)分享。
首先我們要理清:什么是錯誤、什么是異常、為什么需要管理。然后才是怎樣管理。
錯誤和異常從語言機(jī)制上面講,就是error和panic的區(qū)別,放到別的語言也一樣,別的語言沒有error類型,但是有錯誤碼之類的,沒有panic,但是有throw之類的。
在語言層面它們是兩種概念,導(dǎo)致的是兩種不同的結(jié)果。如果程序遇到錯誤不處理,那么可能進(jìn)一步的產(chǎn)生業(yè)務(wù)上的錯誤,比如給用戶多扣錢了,或者進(jìn)一步產(chǎn)生了異常;如果程序遇到異常不處理,那么結(jié)果就是進(jìn)程異常退出。
在項(xiàng)目里面是不是應(yīng)該處理所有的錯誤情況和捕捉所有的異常呢?我只能說,你可以這么做,但是估計(jì)效果不會太好。我的理由是:
如果所有東西都處理和記錄,那么重要信息可能被淹沒在信息的海洋里。
不應(yīng)該處理的錯誤被處理了,很容易導(dǎo)出BUG暴露不出來,直到出現(xiàn)更嚴(yán)重錯誤的時候才暴露出問題,到時候排查就很困難了,因?yàn)橐呀?jīng)不是錯誤的第一現(xiàn)場。
所以錯誤和異常最好能按一定的規(guī)則進(jìn)行分類和管理,在第一時間能暴露錯誤和還原現(xiàn)場。
對于錯誤處理,Erlang有一個很好的概念叫速錯,就是有錯誤第一時間暴露它。我們的項(xiàng)目從Erlang到Go一直是沿用這一設(shè)計(jì)原則。但是應(yīng)用這個原則的前提是先得區(qū)分錯誤和異常這兩個概念。
錯誤和異常上面已經(jīng)提到了,從語言機(jī)制層面比較容易區(qū)分它們,但是語言取決于人為,什么情況下用錯誤表達(dá),什么情況下用異常表達(dá),就得有一套規(guī)則,否則很容易出現(xiàn)全部靠異常來做錯誤處理的情況,似乎Java項(xiàng)目特別容易出現(xiàn)這樣的設(shè)計(jì)。
這里我先假想有這樣一個業(yè)務(wù):游戲玩家通過購買按鈕,用銅錢購買寶石。
在實(shí)現(xiàn)這個業(yè)務(wù)的時候,程序邏輯會進(jìn)一步分化成客戶端邏輯和服務(wù)端邏輯,客戶端邏輯又進(jìn)一步因?yàn)樵O(shè)計(jì)方式的不同分化成兩種結(jié)構(gòu):胖客戶端結(jié)構(gòu)、瘦客戶端結(jié)構(gòu)。
胖客戶端結(jié)構(gòu),有更多的本地?cái)?shù)據(jù)和懂得更多的業(yè)務(wù)邏輯,所以在胖客戶端結(jié)構(gòu)的應(yīng)用中,以上的業(yè)務(wù)會實(shí)現(xiàn)成這樣:客戶端檢查緩存中的銅錢數(shù)量,銅錢數(shù)量足夠的時候購買按鈕為可用的亮起狀態(tài),用戶點(diǎn)擊購買按鈕后客戶端發(fā)送購買請求到服務(wù)端;服務(wù)端收到請求后校驗(yàn)用戶的銅錢數(shù)量,如果銅錢數(shù)量不足就拋出異常,終止請求過程并斷開客戶端的連接,如果銅錢數(shù)量足夠就進(jìn)一步完成寶石購買過程,這里不繼續(xù)描述正常過程。
因?yàn)檎5目蛻舳耸怯幸徊綌?shù)據(jù)校驗(yàn)的過程的,所以當(dāng)服務(wù)端收到不合理的請求(銅錢不足以購買寶石)時,拋出異常比返回錯誤更為合理,因?yàn)檫@個請求只可能來自兩種客戶端:外掛或者有BUG的客戶端。如果不通過拋出異常來終止業(yè)務(wù)過程和斷開客戶端連接,那么程序的錯誤就很難被第一時間發(fā)現(xiàn),攻擊行為也很難被發(fā)現(xiàn)。
我們再回頭看瘦客戶端結(jié)構(gòu)的設(shè)計(jì),瘦客戶端不會存有太多狀態(tài)數(shù)據(jù)和用戶數(shù)據(jù)也不清楚業(yè)務(wù)邏輯,所以客戶端的設(shè)計(jì)會是這樣:用戶點(diǎn)擊購買按鈕,客戶端發(fā)送購買請求;服務(wù)端收到請求后檢查銅錢數(shù)量,數(shù)量不足就返回?cái)?shù)量不足的錯誤碼,數(shù)量足夠就繼續(xù)完成業(yè)務(wù)并返回成功信息;客戶端收到服務(wù)端的處理結(jié)果后,在界面上做出反映。
在這種結(jié)構(gòu)下,銅錢不足就變成了業(yè)務(wù)邏輯范圍內(nèi)的一種失敗情況,但不能提升為異常,否則銅錢不足的用戶一點(diǎn)購買按鈕都會出錯掉線。
所以,異常和錯誤在不同程序結(jié)構(gòu)下是互相轉(zhuǎn)換的,我們沒辦法一句話的給所有類型所有結(jié)構(gòu)的程序一個統(tǒng)一的異常和錯誤分類規(guī)則。
但是,異常和錯誤的分類是有跡可循的。比如上面提到的痩客戶端結(jié)構(gòu),銅錢不足是業(yè)務(wù)邏輯范圍內(nèi)的一種失敗情況,它屬于業(yè)務(wù)錯誤,再比如程序邏輯上嘗試請求某個URL,最多三次,重試三次的過程中請求失敗是錯誤,重試到第三次,失敗就被提升為異常了。
所以我們可以這樣來歸類異常和錯誤:不會終止程序邏輯運(yùn)行的歸類為錯誤,會終止程序邏輯運(yùn)行的歸類為異常。
因?yàn)殄e誤不會終止邏輯運(yùn)行,所以錯誤是邏輯的一部分,比如上面提到的瘦客戶端結(jié)構(gòu),銅錢不足的錯誤就是業(yè)務(wù)邏輯處理過程中需要考慮和處理的一個邏輯分支。而異常就是那些不應(yīng)該出現(xiàn)在業(yè)務(wù)邏輯中的東西,比如上面提到的胖客戶端結(jié)構(gòu),銅錢不足已經(jīng)不是業(yè)務(wù)邏輯需要考慮的一部分了,所以它應(yīng)該是一個異常。
錯誤和異常的分類需要通過一定的思維訓(xùn)練來強(qiáng)化分類能力,就類似于面向?qū)ο蟮脑O(shè)計(jì)方式一樣的,技術(shù)實(shí)現(xiàn)就擺在那邊,但是要用好需要不斷的思維訓(xùn)練不斷的歸類和總結(jié),以上提到的歸類方式希望可以作為一個參考,期待大家能發(fā)現(xiàn)更多更有效的歸類方式。
接下來我們講一下速錯和Go語言里面怎么做到速錯。
速錯我最早接觸是在做的時候就體驗(yàn)到的,當(dāng)然跟Erlang的速錯不完全一致,那時候也沒有那么高大上的一個名字,但是對待異常的理念是一樣的。
在.NET項(xiàng)目開發(fā)的時候,有經(jīng)驗(yàn)的程序員都應(yīng)該知道,不能隨便re-throw,就是catch錯誤再拋出,原因是異常的第一現(xiàn)場會被破壞,堆棧跟蹤信息會丟失,因?yàn)橥獠孔詈竽玫疆惓5亩褩8櫺畔?,是最后那次throw的異常的堆棧跟蹤信息;其次,不能隨便try catch,隨便catch很容易導(dǎo)出異常暴露不出來,升級為更嚴(yán)重的業(yè)務(wù)漏洞。
到了Erlang時期,大家學(xué)到了速錯概念,簡單來講就是:讓它掛。只有掛了你才會第一時間知道錯誤,但是Erlang的掛,只是Erlang進(jìn)程的異常退出,不會導(dǎo)致整個Erlang節(jié)點(diǎn)退出,所以它掛的影響層面比較低。
在Go語言項(xiàng)目中,雖然有類似Erlang進(jìn)程的Goroutine,但是Goroutine如果panic了,并且沒有recover,那么整個Go進(jìn)程就會異常退出。所以我們在Go語言項(xiàng)目中要應(yīng)用速錯的設(shè)計(jì)理念,就要對Goroutine做一定的管理。
在我們的游戲服務(wù)端項(xiàng)目中,我把Goroutine按掛掉后的結(jié)果分為兩類:1、掛掉后不影響其他業(yè)務(wù)或功能的;2、掛掉后業(yè)務(wù)就無法正常進(jìn)行的。
第一類Goroutine典型的有:處理各個玩家請求的Goroutine,因?yàn)槊總€玩家連接各自有一個Goroutine,所以掛掉了只會影響單個玩家,不會影響整體業(yè)務(wù)進(jìn)行。
第二類Goroutine典型的有:數(shù)據(jù)庫同步用的Goroutine,如果它掛了,數(shù)據(jù)就無法同步到數(shù)據(jù)庫,游戲如果繼續(xù)運(yùn)行下去只會導(dǎo)致數(shù)據(jù)回檔,還不如讓整個游戲都異常退出。
這樣一分類,就可以比較清楚哪些Goroutine該做recover處理,哪些不該做recover處理了。
那么在做recover處理時,要怎樣才能盡量保留第一現(xiàn)場來幫組開發(fā)者排查問題原因呢?我們項(xiàng)目中通常是會在最外層的recover中把錯誤和堆棧跟蹤信息記進(jìn)日志,同時把關(guān)鍵的業(yè)務(wù)信息,比如:用戶ID、來源IP、請求數(shù)據(jù)等也一起記錄進(jìn)去。
為此,我們還特地設(shè)計(jì)了一個庫,用來格式化輸出堆棧跟蹤信息和對象信息,項(xiàng)目地址:funny/debug · GitHub
通篇寫下來發(fā)現(xiàn)比我預(yù)期的長很多,所以這里我做一下歸納總結(jié),幫組大家理解這篇文章所要表達(dá)的:
錯誤和異常需要分類和管理,不能一概而論
錯誤和異常的分類可以以是否終止業(yè)務(wù)過程作為標(biāo)準(zhǔn)
錯誤是業(yè)務(wù)過程的一部分,異常不是
不要隨便捕獲異常,更不要隨便捕獲再重新拋出異常
Go語言項(xiàng)目需要把Goroutine分為兩類,區(qū)別處理異常
在捕獲到異常時,需要盡可能的保留第一現(xiàn)場的關(guān)鍵數(shù)據(jù)
以上僅為一家之言,拋磚引玉,希望對大家有所幫助。
英文原文鏈接【Go, the unwritten parts】 發(fā)表于2017/05/22 作者JBD是Go語言開發(fā)小組成員
檢查程序的執(zhí)行路徑和當(dāng)前狀態(tài)是非常有用的調(diào)試手段。核心文件(core file)包含了一個運(yùn)行進(jìn)程的內(nèi)存轉(zhuǎn)儲和狀態(tài)。它主要是用來作為事后調(diào)試程序用的。它也可以被用來查看一個運(yùn)行中的程序的狀態(tài)。這兩個使用場景使調(diào)試文件轉(zhuǎn)儲成為一個非常好的診斷手段。我們可以用這個方法來做事后診斷和分析線上的服務(wù)(production services)。
在這篇文章中,我們將用一個簡單的hello world網(wǎng)站服務(wù)作為例子。在現(xiàn)實(shí)中,我們的程序很容易就會變得很復(fù)雜。分析核心轉(zhuǎn)儲給我們提供了一個機(jī)會去重構(gòu)程序的狀態(tài)并且查看只有在某些條件/環(huán)境下才能重現(xiàn)的案例。
作者注 : 這個調(diào)試流程只在Linux上可行。我不是很確定它是否在其它Unixs系統(tǒng)上工作。macOS對此還不支持。Windows現(xiàn)在也不支持。
在我們開始前,需要確保核心轉(zhuǎn)儲的ulimit設(shè)置在合適的范圍。它的缺省值是0,意味著最大的核心文件大小是0。我通常在我的開發(fā)機(jī)器上將它設(shè)置成unlimited。使用以下命令:
接下來,你需要在你的機(jī)器上安裝 delve 。
下面我們使用的 main.go 文件。它注冊了一個簡單的請求處理函數(shù)(handler)然后啟動了HTTP服務(wù)。
讓我們編譯并生產(chǎn)二進(jìn)制文件。
現(xiàn)在讓我們假設(shè),這個服務(wù)器出了些問題,但是我們并不是很確定問題的根源。你可能已經(jīng)在程序里加了很多輔助信息,但還是無法從這些調(diào)試信息中找出線索。通常在這種情況下,當(dāng)前進(jìn)程的快照會非常有用。我們可以用這個快照深入查看程序的當(dāng)前狀態(tài)。
有幾個方式來獲取核心文件。你可能已經(jīng)熟悉了奔潰轉(zhuǎn)儲(crash dumps)。它們是在一個程序奔潰的時候?qū)懭氪疟P的核心轉(zhuǎn)儲。Go語言在缺省設(shè)置下不會生產(chǎn)奔潰轉(zhuǎn)儲。但是當(dāng)你把 GOTRACEBACK 環(huán)境變量設(shè)置成“crash”,你就可以用 Ctrl+backslash 才觸發(fā)奔潰轉(zhuǎn)儲。如下圖所示:
上面的操作會使程序終止,將堆棧跟蹤(stack trace)打印出來,并把核心轉(zhuǎn)儲文件寫入磁盤。
另外個方法可以從一個運(yùn)行的程序獲得核心轉(zhuǎn)儲而不需要終止相應(yīng)的進(jìn)程。 gcore 可以生產(chǎn)核心文件而無需使運(yùn)行中的程序退出。
根據(jù)上面的操作,我們獲得了轉(zhuǎn)儲而沒有終止對應(yīng)的進(jìn)程。下一步就是把核心文件加載進(jìn)delve并開始分析。
差不多就這些。delve的常用操作都可以使用。你可以backtrace,list,查看變量等等。有些功能不可用因?yàn)槲覀兪褂玫暮诵霓D(zhuǎn)儲是一個快照而不是正在運(yùn)行的進(jìn)程。但是程序執(zhí)行路徑和狀態(tài)全部可以訪問。
1、下載go的zip文件。并且一定要把文件解壓到c:\go目錄下。
2、配置windows的高級環(huán)境變量。包括:GOROOT、GOOS、GOBIN、GOARCH。并且在path變量里面把c:\go\bin加入。以便可以在命令行直接運(yùn)行g(shù)o命令。
舉例:我的機(jī)器:
GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;
GOBIN=c:\go\bin;F:\workspace\goSample01\bin;
其中,c:\go是go的安裝路徑;
F:\workspace\goSample01是我寫的go語言項(xiàng)目的工程目錄;
F:\workspace\goSample01\bin是go語言項(xiàng)目的工程目錄下的可執(zhí)行文件路徑;
3、在完成環(huán)境變量配置后,打開一個命令行窗口,直接輸入go,然后回車,看看是否出現(xiàn)go的幫助信息。如果出現(xiàn),那么go的基本環(huán)境就OK了。
注意:這個基本環(huán)境不包含開發(fā)工具,也不能直接編譯帶C代碼的go程序。
4、(可選)為了支持Import遠(yuǎn)程包,最好裝個gomingw。下載地址:。如果下的是壓縮包,請把它解壓到C盤。例如,C:\gowin-env。里面有個Console.bat是以后使用go get的環(huán)境。舉例:有個文件a.go,里面import(
"fmt"
"github.com/astaxie/beedb"
_ "github.com/ziutek/mymysql/godrv"
為了編譯該a.go文件,需要啟動Console.bat,然后在該命令行窗口,進(jìn)入c:\go\src目錄下,執(zhí)行g(shù)o getgithub.com/astaxie/beedb
Go get github.com/ziutek/mymysql/godrv .
Go會自動下載該遠(yuǎn)程包并編譯和安裝這些包。
配置goclipse(可選)
(如果不喜歡eclipse開發(fā)工具,請?zhí)^這個配置。)
1、下載并安裝goclipse插件。Goclipse是go語言for eclipse的插件,下載地址:
2、啟動eclipse并創(chuàng)建go項(xiàng)目。然后寫個最簡單的helloworld.go文件,并運(yùn)行。代碼如下:
packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}
配置gocode(可選)
如果不需要go語法輔助和eclipse里面的(按ALT+/)彈出go語言自動輔助功能,請?zhí)^這個配置。
1、下載gocode的zip文件,解壓后放在go的bin目錄下。
2、下載并安裝Git軟件。并且在path里面配置git的執(zhí)行路徑。例如c:\git\bin
3、在命令行執(zhí)行:go build .\gocode。如果一切正常,那么將會編譯生成一個gocode.exe文件在go的bin目錄下。如果編譯失敗,那么就轉(zhuǎn)第4步。
4、如果第3步直接編譯gocode源文件成功,那就直接到第5步。否則,就需要通過git下載gocode源文件,然后再編譯。在命令行執(zhí)行:go get -u github.com/nsf/gocode 。就會生成gocode.exe文件。
5、在goclipse插件里面指定gocode的路徑。就可以在elcipse里面調(diào)用gocode來幫助寫編碼了。
從開發(fā)工具這塊看,go語言還不夠成熟,開發(fā)工具都還不完善,有待改進(jìn)。
下載go-tour教程源代碼(可選)
Google有個在線運(yùn)行g(shù)o語言的教程(),很不錯。支持在web上直接運(yùn)行大部分的go程序,想了解這個教程的源代碼的朋友可以通過以下方式獲取。如果沒興趣,可以跳過這個步驟。
1、下載安裝Mercurial軟件。
2、在命令行下輸入:
hg clone
這個URL是我從google的go-tour源代碼的一個clone。作為測試用的。如果把http改成https協(xié)議,下載就會失敗。搞不懂。
編譯帶調(diào)用C代碼的go文件(可選)
1、為了在windows下編譯帶C代碼的go程序,你首先需要下載并安裝MinGW或者Cygwin。
2、首選安裝MinGW。在安裝MinGW之后,記得要把MinGW安裝目錄\bin路徑設(shè)置在path環(huán)境變量里面,以便能在dos窗口下直接調(diào)用gcc。
3、下載一個gowin-env。下載地址:gowin-env。下載后解壓到某個目錄下,例如:C:\gowin-env. 然后,編輯go-env.bat。配置相關(guān)的go參數(shù)。例如,我的配置是:
set GOARCH=386
set GOOS=windows
set GOROOT=c:\go
set GOBIN=%GOROOT%\bin
set GOPATH=%GOROOT%;F:\workspace\goSample01;
設(shè)置好go-env.bat后,就可以點(diǎn)擊Console.bat來啟動編譯和運(yùn)行窗口。
4、編寫一個帶C代碼的go程序。例如,testc.go
5、編譯
例如:
go build -compiler gccgo test_c.go
運(yùn)行調(diào)用C代碼的go文件(可選)
1、testc.go.
創(chuàng)建rand目錄,然后在rand里面創(chuàng)建testc.go. 代碼如下:
package rand
/*
//
#include stdio.h
*/
import "C"
func PrintHello() {
C.puts(C.CString("Hello, world\n"))
}
2、a.go
在rand下創(chuàng)建a.go.代碼如下:
package rand
import "fmt"
func SayHello(name string){
fmt.Println(name)
}
3、test_import.go
在rand的上一級創(chuàng)建test_import.go。代碼如下:
package main
import "./rand"
func main(){
rand.SayHello("tom")
rand.PrintHello()
}
4、運(yùn)行test_import.go
go run test_import.go
在測試其它幾個C代碼的時候,發(fā)現(xiàn)windows版本的cgo還有些編譯問題,同樣的代碼轉(zhuǎn)移到蘋果的XCODE下就沒有問題。后來終于發(fā)現(xiàn)原因了,原來有些例子是unix平臺下的,而在windows平臺下,方法名和參數(shù)需要做調(diào)整。
例如:下面代碼在windows下編譯報(bào)一堆錯誤。
package rand
/*
#include stdlib.h
*/
import "C"
func Random() int {
return int(C.random())
}
func Seed(i int) {
C.srandom(C.uint(i))
}
這里需要把return int(C.random()) 修改為“return int(C.rand())”
C.srandom(C.uint(i))修改為“C.srand(C.uint(i))”編譯就OK了。
當(dāng)前題目:go語言進(jìn)程無法啟動 go重啟自己進(jìn)程
標(biāo)題路徑:http://www.rwnh.cn/article12/hiipgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站收錄、標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)