golang中沒有類似C語言中條件編譯的寫法,比如在C代碼中可以使用如下語法做一些條件編譯,結(jié)合宏定義來使用可以實現(xiàn)諸如按需編譯release和debug版本代碼的需求
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、萬柏林網(wǎng)站維護(hù)、網(wǎng)站推廣。
build tags 是通過代碼注釋的形式實現(xiàn)的,要寫在文件的最頂端;
go build指令在編譯項目的時候會檢查每一個文件的build tags,用來決定是編譯還是跳過該文件
build tags遵循以下規(guī)則
示例:
約束此文件只能在支持kqueue的BSD系統(tǒng)上編譯
一個文件可能包含多行條件編譯注釋,比如:
約束該文件在linux/386 或 darwin/386平臺編譯
需要注意的點
正確的寫法如下:
編譯方法:
具有_$GOOS.go后綴的go文件在編譯的時候會根據(jù)當(dāng)前平臺來判斷是否將該文件導(dǎo)入并編譯;同樣適用于處理器架構(gòu)判斷 _$GOARCH.go。
兩者可以結(jié)合起來使用,形式為: _$GOOS_$GOARCH.go
示例:
文件名必須提供,如果只由后綴的文件名會被編譯器忽略,比如:
這兩個文件會被編譯器忽略,因為以下劃線開頭的文件都會被忽略
go語言 一個主package包引入同級目錄下go文件包編譯出錯是設(shè)置錯誤造成的,解決方法為:
1、先使用import "strings"導(dǎo)入strings庫。
2、HasPrefix?判斷字符串?s?是否以?prefix?開頭。
3、HasSuffix?判斷字符串?s?是否以?suffix?結(jié)尾。
4、可以看看判斷的代碼。
5、在cmd下運行一下go run test.go,看看如下結(jié)果。
6、Contains?判斷字符串?s?是否包含?substr,也就是判斷一下S是否在strings中。
7、在cmd下運行g(shù)o run test.go看看結(jié)果。
Go 語言和 C 語言的一個很大的區(qū)別是, Go 語言只靜態(tài)編譯,做個測試:
一方面是 Go 語言編譯后的可執(zhí)行文件大小比 C 語言的大很多,
另一方面是 C 語言的可執(zhí)行文件需要依賴 glibc 動態(tài)庫,
用 ldd 命令可以看出來:
或者直接刪除 glibc 動態(tài)庫, C 可執(zhí)行程序報錯,而 Go 的還能運行:
這時候只有內(nèi)部命令可以運行,外部命令,包括 ln 甚至最常用的 ls 命令也不能運行了:
設(shè)置好 LD_PRELOAD 環(huán)境變量之后, ln 命令可以運行,但是 sudo 仍然不能運行
只能靠 root 用戶來重新創(chuàng)建軟連接了:
所以用 sudo 來 rm 文件要小心,還是用 root 比較好。如果沒有預(yù)先留一個打開的 root 終端,登錄都登不進(jìn)去。
go及gomobile的環(huán)境配置這里就不介紹了,直接說aar的生成和使用。
1. 設(shè)置環(huán)境變量GOPATH
GOPATH的值可以有多個,用半角分號間隔,但不能以其結(jié)束,設(shè)置完成后需要重新做 gomobile init 。
2. 在GOPATH里創(chuàng)建src文件夾,用于存放go的包和源文件
3. 在src中創(chuàng)建hello文件夾(go文件的包名)
4. 在hello中創(chuàng)建hello.go文件,并輸入內(nèi)容
5. 編譯
執(zhí)行命令: gomobile bind -target=android hello
會生成一個hello.aar文件
6. 導(dǎo)入到android工程
將hello.aar文件放入工程的libs中,并配置build.gradle
在根結(jié)點加入:
在dependencies結(jié)點下加入依賴:
7. 在Java中測試
運行后,結(jié)果會輸出 Hello, Android and Gopher