這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近在看人民郵電出版社 許式偉 呂桂華編著的《Go語言編程》,看到【1.2.9 語言互動性】小節的cprint.go。未按照書中原始碼格式編寫,而是把 import "C" 和 import "unsafe" 合并放入小括弧中並和注釋結束符 */ 間隔了一行,這也是大多數Go語言學習和開發人員經常使用的代碼風格,我修改後的代碼如下:
package main
/*
#include <stdio.h>
#include <stdlib.h>
*/
import (
"C"
"unsafe"
)
func main() {
cstr := C.CString("Hello, world")
C.puts(cstr)
C.free(unsafe.Pointer(cstr))
}
結果在我的Windows 7 64位和CentOS 6.6 x86_64環境下go build cprint.go或者go run cprint.go都一直報錯如下:
# command-line-arguments
error: 'puts' undeclared (first use in this function)
error: 'free' undeclared (first use in this function)
尋找了很多文檔,研究了3天,一直未找到原因,包括換成舊版Go語言SDK,也未能解決。
偶爾看到一篇英文文檔,地址:http://stackoverflow.com/questions/18237738/linking-golang-with-xlib,提示匯入虛擬包C的格式必須單獨起一行,並且緊跟在注釋結束行後,於是重新按照提示修改後編譯和運行都通過了,嚴格按照《Go語言編程》書本格式編寫也正常。
修改後正常的代碼如下:
package main
/*
#include <stdio.h>
#include <stdlib.h>
*/
import "C"
import (
"unsafe"
)
func main() {
cstr := C.CString("Hello, world")
C.puts(cstr)
C.free(unsafe.Pointer(cstr))
}
Go語言的代碼格式非常嚴格,廣大Go語言愛好者有時經常不小心修改了格式或者使用了其他語言風格格式,編譯和運行都有可能出現各種莫名其妙的問題。再次提醒大家:import "C" 一定要緊跟C語言代碼注釋結束的最後一行,絕對不能空出一行,也不能和其他包合并寫到import小括弧內。