package main //非注釋區的一個行要引入一個包,這個包的名字必須要是 mainimport "fmt"import "unsafe"func main(){ // 這是我的第一個 go 程式 fmt.Println("This is my first Go programma"); // myFunc1() //變數 // myFunc2() //常量 // myFunc3() //運算子 funcTest() //函數}// 函數funcTest(){}//返回最大值func max(a,b int) int{}// 運算子func myFunc3(){ // go 語言中的其它運算子: &(給出變數的實際地址) / *(是一個指標變數) var a = 10 var b int32 = 20 var c float32 var d *int fmt.Printf("a 的類型為:%T\n",a); //int fmt.Printf("a 的類型為:%T\n",b); //int32 fmt.Printf("a 的類型為:%T\n",c); //float32 fmt.Printf("a 的類型為:%T\n",d); //*int d = &a fmt.Println("a 的地址:",d) //0xc04200e0b0 (受多種因素影響) fmt.Printf("a 的值為:%d\n",a) //10 fmt.Printf("d 地址儲存的值為:%d",*d) //10}// 變數var a = 4var b int = 6//定義的全部變數,不在在函數外修改它的值:// syntax error: non-declaration statement outside function body// a = 444var c boolvar j,k = "jjj","kkk"var p,q = 30,"qqq"func myFunc1(){ // 這種不帶聲明格式的只能在函數體中 d := 777 a = 444 //如果在函數內只定義不使用,會報編譯錯誤:y declared and not used // y := "fafafa" fmt.Print(a,b,c,d,"\n") //444 6 false 777 fmt.Print(p,q,j,k,"\n") //30 qqq jjj kkk fmt.Println("j 的值:",j," ; k 的值:",k) //jjj kkk // 交換兩個數的值 j,k = k,j fmt.Println("j 的值:",j," ; k 的值:",k) //kkk jjj}// 常量func myFunc2(){ // 常量的使用 const conA = "aaa" const conB = "bbb" const conC,conD = 888,"ddd" // cannot assign to conA // conA = "AAA" fmt.Println("conA:", unsafe.Sizeof(conA)); //conA: 16 //conA: 16 (第一個域是指向該字串的指標,第二個域是字串的長度,每個域佔8個位元組,但是並不包含指標指向的字串的內容,這也就是為什麼sizeof始終返回的是16) /* * 一、如果 x 為一個切片,sizeof 返回的大小是切片的描述符大小(24),而不是切片所指向的記憶體的大小。 * 二、如果 x 是一個數組,(sizeof 總是在編譯期就進行求值,而不是在運行時,這意味著 sizeof 的傳回值可以賦值給常量)sizeof 在編譯期求值,意味著可以獲得數組所佔的記憶體大小,因為數組總是在編譯期就指明自己的容量,並且在以後都是不可變的。 * 三、如果 x 是一個字串,不論字串的 len 有多大,sizeof 始終返回 16;這是因為字串類型對應一個結構體,該結構體有兩個域,第一個域是指向該字串的指標,第二個域是字串的長度,每個域都占 8 個位元組,但是並不包含指標指向的字串的內容。 */ fmt.Println(conA,conB,conC,conD) //aaa bbb 888 ddd //枚舉(iota 是特殊的常量,在每一個關鍵字 const 出現時,都會被置為0,然後在下一個 const 出現之前,每出現一個 iota,其值會自動增加 1) const ( it0 = iota //0 it1 = iota //1 it2 = iota //2 ) const it3 = iota //0 fmt.Println("iota 測試:", it0, it1, it2, it3); const ( i0 = iota //0 i1 //1 i2 //2 ) fmt.Println("枚舉測試 i0,i1,i2:",i0,i1,i2); const ( aa1 = iota //0 aa2 //1 aa3 //2 aa4 = "hei" //hei aa5 //hei aa6 = 100 //100 aa7 //100 aa8 = iota //7 aa9 //8 ) //發現一個有趣的現象:枚舉時,如果沒有給變數賦值,預設會將前面的值賦值給該變數,並且 iota 都會在之前的基礎上每次遞增 1,即使其它運算式中沒有出現 iota fmt.Println("aax:",aa1,aa2,aa3,aa4,aa5,aa6,aa7,aa8,aa9); // 再看一個有趣的現象 const ( i = 1 << iota j = 3 << iota k l ) fmt.Println("i j k l:",i,j,k,l) //1 6 12 24}