go的包
阿新 • • 發佈:2018-12-13
go這種語言搞搞新意思,有些新奇的地方。比如函式多返回值,而且提取多返回值時可以指定提取哪個引數值;還可以對現有的型別進行擴充套件,類似C#裡的this語法糖。我只是初學,新玩意應該還有不要。這說明go是一門相對新潮的語言,有一些新思想。
其中我認為最大的特點是go是一門函數語言程式設計語言,裡面好像沒有類這些東東,不是面向物件的。當然裡面有個type,據說已經涵括了類而大於類。程式碼結構,基本就是包,包裡面是函式。而且函式都是public的,沒有什麼私有的概念。同一包名,函式直接使用;跨包的話,就包名.函式
這樣。
go的包有些約定,或者說可能是硬性規定。所謂約定大於配置。這種約定,也包括了程式碼檔案的存放結構。我記錄一下我的理解:
0、函式名首字母大寫是公有的,首字母小寫是私有的
1、如果想可執行,必須有main包
package main
import "fmt"
func main() {
fmt.Println("Hello World!");
}
2、包名應該與存放目錄一致
準確來說,除了main之外,包名應該與所在目錄名字保持一致。
3、相應地,一個目錄只能存放一種包的檔案
而且檔案應該是平鋪的,儘量避免巢狀,即使有巢狀,也不要太深,1、2層足矣。
以上是一些基本的條條框框。說容易,寫起來磕磕絆絆。如上圖,a.go與b.go同一包名main,
在a.go裡使用了b.go的函式,同時還使用了子目錄pc的c.go裡的函式。程式碼如下:
a.go
package main
import (
"fmt"
"ref/pc"
)
func main(){
_, reB := B()
_, reC := pc.C()
fmt.Println("Hello World!","\n\r" + reB,"\n\r" + reC)
}
b.go
package main
func B() (s1 string,s2 string){
return "yes","I am a duck!"
}
c.go
package pc
func C() (s1 string,s2 string){
return "emm","you confirm your mistake now!"
}
這幾個檔案存放在ref資料夾下,ref又位於%GOPATH%/src/
裡,在GoLand裡做相應配置,執行是沒有問題的:
一、GoLand裡執行
1)程式碼要在GOPATH範圍內
2、按包執行
二、命令列裡直接執行
如果只是執行檔案,a.go裡的寫法會報錯,說找不到包"ref/pc"。要改寫為“./pc”
package main
import (
"fmt"
"./pc"
)
func main(){
_, reB := B()
_, reC := pc.C()
fmt.Println("Hello World!","\n\r" + reB,"\n\r" + reC)
}