1. 程式人生 > >go的包

go的包

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)
}

在這裡插入圖片描述