第二天課程
[toc]
基本數據類型和操作符
- 文件名
- 所有的go源碼文件以
.go
結尾
- 所有的go源碼文件以
- 標識符以字母或下劃線結尾
_
是特殊標識符,用來忽略結果
- 保留關鍵字如下:
-
go程序基本結構
package main import( //導入本地包或者第三方包 "fmt" ) func main(){ //聲明函數必須以func開頭,用花括號包含 fmt.Println("hello world!!") }
詳細分析如下:
- 任何代碼文件隸屬於一個包
- import 關鍵字,用來引用其他包
- golang可執行程序,package main只有一個main入口函數
- 包中的調用:
- 在同一個包中的函數直接調用
- 不同包中的函數,通過包名+點+函數名進行調用
- 包的訪問控制規則:
- 大寫意味着這個變量/函數是可以導出的
- 小寫意味着這個變量/函數是私有的,在包外不能訪問
- 小練習一:
給定一個數字n,求出所有兩兩相加等於n的組合
package main import "fmt" func Sums(n int) { for i :=0;i <= n;i++{ fmt.Printf("%d+%d=%d\n",i,n-i,n) } } func main(){ Sums(5) }
- 小練習二:
一個程序包含兩個包add和main,其中add包裏面有兩個變量Name和Age,怎麼讓main去訪問
目錄結構如下:─ask_variables │ ├─add │ └─main
- add/add.go
package add var Name string = "Wanghui" var Age int = 23
- main/main.go
package main import ( "one/day2/ask_variables/add" "fmt" ) func main() { var a string = add.Name var b int = add.Age fmt.Printf("Name %s,Age %d",a,b) }
- add/add.go
- 包的別名應用
只需將上述的例子中的main.go修改成如下即可:package main import ( add_func "one/day2/ask_variables/add" "fmt" ) func main() { var a string = add_func.Name var b int = add_func.Age fmt.Printf("Name %s,Age %d",a,b) }
- 每個源文件都包含一個init函數,這個init函數自動被go運行框架調用,演示如下的功能,目錄結構如下:
├─add ├─main └─test
代碼如下:
- add/add.go
package add import( "fmt" _ "one/day2/init_test/test" ) var Name string var Age int func init() { Name = "init test" Age = 19 fmt.Println("This is in the init_test dir") }
- main/main.go
package main import ( "fmt" a "one/day2/init_test/add" ) func main() { fmt.Println("this is in the main func!!") fmt.Println("Name=",a.Name) fmt.Println("Age=",a.Age) }
- test/test.go
package test import "fmt" var Name string = "TEST PACKAGE" var Age int = 1000 func init(){ fmt.Println("this is in the test!!") fmt.Println("test.package.Name=",Name) fmt.Println("test.package.Age=",Age) }
包的初始化操作,直接在引用的時候加上
_
就好。函數的聲明和註釋
func 函數名(參數列表)(返回值列表){ 函數體 }
- add/add.go
- 註釋:
// 單行註釋 /*多行註釋*/
常量
- 只讀的,用const修飾的
- 只能修飾bool,數字和string類型
- 語法
const a string = "hello" const ( b = 1 c = 2 d = 3 ) 或者 const( b1 = iota b2 b3 )
- 小例子:
定義兩個常量,Man=1,Female=2,獲取當前系統的時間秒數,如果能被Femal整除,則在終端上打印female,否則打印man
- 代碼
package main import ( "time" "fmt" ) const( Man = 1 Female = 2 ) func main(){ for { second := time.Now().Unix() if (second % Female) == 0 { fmt.Println("F" + "Female") }else { fmt.Println("Man") } time.Sleep(1) } }
變量
- 語法: var 變量名 數據類型
var( a int //默認爲0 b string //默認爲空 d = 8 //定義爲8 )
- 小例子:獲取當前操作系統的主機名和PATH環境變量:
package main import ( "os" "fmt" ) func main(){ hostname,err :=os.Hostname() os_path := os.Getenv("PATH") fmt.Printf("hostname = %v\nos_path = %v",hostname,os_path,err) }
值類型和引用類型
- 值類型: var a int = 19;
- 包含:基本數據類型:int,float,string,數組,struct
- 引用類型: 函數的引用等
- 包含:指針,slice,chan
小例子:
寫一個程序來打印值類型和引用類型變量到終端,並觀察輸出結果
- 語法: var 變量名 數據類型
package main
import "fmt"
func main() {
var a string = "hello word!"
var b chan int = make(chan int,1)
b <- 13
fmt.Printf("a=%s\nb=%v",a,b)
}
小例子:交換兩個數字的值
package main
import "fmt"
func Test(a int,b int) (int,int){
return b,a
}
func main() {
var a int = 8
var b int = 9
a,b = Test(a,b)
fmt.Println("\n",a)
fmt.Println(b)
}