【Go學習筆記2】go語言中的基本資料型別和包的介紹(一)

zhongzhong05發表於2017-12-10

資料型別

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);
	
複製程式碼

輸出結果:

【Go學習筆記2】go語言中的基本資料型別和包的介紹(一)

到現在,我們應該知道,怎麼來宣告一個變數。

變數的作用域

在上面例子中,在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學習筆記2】go語言中的基本資料型別和包的介紹(一)

這樣看,好像go語言裡面的作用域和js(es5之前)中的差不多,在函式中定義的變數只能在函式中使用,在包裡面定義的變數可以在包裡的任意位置使用。

那麼,在go語言裡面有沒有包級別的私有變數呢,也就是說只有在變數定義的包內能訪問,而在其他的包裡面,訪問不了。答案是有的,來看下面的例子:

包的使用和包級別的私有變數

首先看下目錄結構:

【Go學習筆記2】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();
}
複製程式碼

上面的輸出結果:

【Go學習筆記2】go語言中的基本資料型別和包的介紹(一)

可以看到,我們可以在main.go裡面通過import匯入我們自定義的包,然後使用裡面的函式和變數。

如果去掉上面的main函式中的註釋,再次執行main.go,會出現以下的錯誤:

【Go學習筆記2】go語言中的基本資料型別和包的介紹(一)

可以看到,錯誤資訊提示,不能引用未匯出的名稱p.str,接著下面就提示了說p.str未定義。

通過上面的程式碼,你應該已經猜到,go語言中是如何來處理包級別的私有變數了吧。

在go語言中,如果在一個包中定義的變數或者函式需要在別的包中使用,則需要將變數名或者函式名的首字母大寫,如果不想被其他的包訪問的話則使用首字母小寫的方式。

總結

在go語言中,我們可以看到類似js的var的宣告變數的方式,但是go是強型別的語言。在go語言中,我們可以通過包來組織我們的程式碼結構,並且go語言支援包級別的私有變數,這在js中,我們需要通過閉包等手段來模擬的私有變數在go語言 中得到了支援。go語言的行末不需要加分號,但是加了分號也不會報錯。

相關文章