資料型別
go語言的資料型別非常豐富,包括int,string,boolean,byte,array,切片,對映等資料型別。當然使用者還可以自定義資料型別。
各種資料型別的預設值
從這裡我們總結一下go語言中各種型別變數的預設值:
- int型別,預設值為0
- string型別,預設值為空字串
- boolean型別,預設值為false
- byte型別,預設值為0
- 指標型別,預設值為nil(以後討論)
- 引用型別,預設值為每一個屬性對應的型別的預設值
go變數宣告方式
go語言中採用類似js的方式來宣告變數,看下面的程式碼:
var num int //宣告一個int型別的變數
var str string //宣告一個string型別的變數
num1 := 10 //宣告並初始化一個int型別的變數,注意這裡不寫var
var num2 int = 11 //宣告並初始化int型別的變數
複製程式碼
看下面的程式碼:
package main
import "fmt"
func main(){
var num int = 10
num1 := 11
var str string = "hello";
fmt.Println("num=",num);
fmt.Println("num1=",num1);
複製程式碼
輸出結果:
到現在,我們應該知道,怎麼來宣告一個變數。
變數的作用域
在上面例子中,在main函式鐘宣告的變數,都屬於-區域性變數。
既然有區域性變數,那就會有全域性變數,在go語言裡面,因為每一個程式都會屬於一個包,在這個包裡面定義的變數,可以在變數所屬包的裡面任何位置使用。 例如:
package main
import "fmt"
var globalVar int = 20
func main(){
fn()
fmt.Println("globalVar=",globalVar)
}
func fn(){
//這裡也可以訪問到globalVar
var temp int = globalVar + 1
fmt.Println("globalVar+1=",temp)
}
複製程式碼
這樣看,好像go語言裡面的作用域和js(es5之前)中的差不多,在函式中定義的變數只能在函式中使用,在包裡面定義的變數可以在包裡的任意位置使用。
那麼,在go語言裡面有沒有包級別的私有變數呢,也就是說只有在變數定義的包內能訪問,而在其他的包裡面,訪問不了。答案是有的,來看下面的例子:
包的使用和包級別的私有變數
首先看下目錄結構:
這裡我們新建一個新的目錄p,用來儲存p這個包下面的所有檔案,注意,在同一個目錄下的檔案的package必須一致,否則會報錯。
p1.go
package p
import "fmt";
//這個外界可以訪問
var PVar int = 10
//這個是包私有的,外界不能訪問
var str string = "hello zhongzhong"
//這個外界也可以訪問
func Fn(){
fmt.Println("from p package")
}
複製程式碼
main.go
package main
import (
"fmt"
"./p"
)
func main(){
fmt.Println("p.PVar=",p.PVar)
// fmt.Println("p.str=",p.str);
p.Fn();
}
複製程式碼
上面的輸出結果:
可以看到,我們可以在main.go裡面通過import匯入我們自定義的包,然後使用裡面的函式和變數。
如果去掉上面的main函式中的註釋,再次執行main.go,會出現以下的錯誤:
可以看到,錯誤資訊提示,不能引用未匯出的名稱p.str,接著下面就提示了說p.str未定義。
通過上面的程式碼,你應該已經猜到,go語言中是如何來處理包級別的私有變數了吧。
在go語言中,如果在一個包中定義的變數或者函式需要在別的包中使用,則需要將變數名或者函式名的首字母大寫,如果不想被其他的包訪問的話則使用首字母小寫的方式。
總結
在go語言中,我們可以看到類似js的var的宣告變數的方式,但是go是強型別的語言。在go語言中,我們可以通過包來組織我們的程式碼結構,並且go語言支援包級別的私有變數,這在js中,我們需要通過閉包等手段來模擬的私有變數在go語言 中得到了支援。go語言的行末不需要加分號,但是加了分號也不會報錯。