由菜鳥教程中做的筆記
package main
import "fmt"
func main()
第一行** package main 定義了包名。你必須在原始檔中非注釋的第一行指明這個檔案屬於哪個包,如:package main。package main表示乙個可獨立執行的程式,每個 go 應用程式都包含乙個名為 main 的包。
下一行 import "fmt" 告訴 go 編譯器這個程式需要使用 fmt 包(的函式,或其他元素),fmt 包實現了格式化 io(輸入/輸出)的函式。
下一行 func main() 是程式開始執行的函式。main 函式是每乙個可執行程式所必須包含的,一般來說都是在啟動後第乙個執行的函式(如果有 init() 函式則會先執行該函式)。
下一行 /*...*/ 是注釋,在程式執行時將被忽略。單行注釋是最常見的注釋形式,你可以在任何地方使用以 // 開頭的單行注釋。多行注釋也叫塊注釋,均已以 /* 開頭,並以 */ 結尾,且不可以巢狀使用,多行注釋一般用於包的文件描述或注釋成塊的**片段。
下一行 fmt.println(...) 可以將字串輸出到控制台,並在最後自動增加換行字元 \n。
使用 fmt.print("hello, world\n") 可以得到相同的結果。
print 和 println 這兩個函式也支援使用變數,如:fmt.println(arr)。如果沒有特別指定,它們會以預設的列印格式將變數 arr 輸出到控制台。
當識別符號(包括常量、變數、型別、函式名、結構字段等等)以乙個大寫字母開頭,如:group1,那麼使用這種形式的識別符號的物件就可以被外部包的**所使用(客戶端程式需要先導入這個包),這被稱為匯出(像物件導向語言中的 public);識別符號如果以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見並且可用的(像物件導向語言中的 protected )。
1、go 語言的字串可以通過 + 實現
3、 // %d 表示整型數字,%s 表示字串 fmt.sprintf 格式化字串並賦值給新串
var stockcode=123
var enddate="2020-12-31"
var url="code=%d&enddate=%s"
var target_url=fmt.sprintf(url,stockcode,enddate)
fmt.println(target_url)
4、定義變數 (宣告什麼型別)
// 沒有初始化就為零值
var b int
fmt.println(b)
// bool 零值為 false
var c bool
fmt.println(c)
數值型別為0 布林型別為false 字串為"" (空字串 )其他的型別一般是nil
5、定義變數(不宣告什麼型別)根據值自行判定變數型別
6、定義變數(使用:=確定變數型別並賦值)
var f string = "runoob" 簡寫為 f := "runoob";
因此
var intval int因此intval :=1 // 這時候會產生編譯錯誤,因為 intval 已經宣告,不需要重新宣告
出現在 := 左側的變數不應該是已經被宣告過的,否則會導致編譯錯誤只能被用在函式體內,而不可以用於全域性變數的宣告與賦值。使用操作符 := 可以高效地建立乙個新的變數,稱之為初始化宣告。
7、宣告全域性變數
// 這種因式分解關鍵字的寫法一般用於宣告全域性變數8、多變數宣告var (
vname1 v_type1
vname2 v_type2
)
var c, d int = 1, 2
9、值型別和引用型別
int、float、bool 和 string 這些基本型別都屬於值型別 這個時候複製是將值進行拷貝
引用型別是= 只是引用
10、定義語言常量
11、在定義常量組時,如果不提供初始值,則表示將使用上行的表示式。
const (12、iota 只是在同乙個 const 常量組內遞增,每當有新的 const 關鍵字時,iota 計數會重新開始。a = 1bc
d)func main()
const (13、左移右移i = iota
j = iota
x = iota
)const xx = iota
const yy = iota
func main()
// 輸出是 0 1 2 0 0
左移運算子 << 是雙目運算子。左移 n 位就是乘以 2 的 n 次方。 其功能把<<左邊的運算數的各二進位全部左移若干位,由<<右邊的數指定移動的位數,高位丟棄,低位補 0。
右移運算子 >> 是雙目運算子。右移 n 位就是除以 2 的 n 次方。 其功能是把>>左邊的運算數的各二進位全部右移若干位,>>右邊的數指定移動的位數。
14、運算子
運算子和其他語言類似
& 返回變數儲存位址,&a給出變數的實際位址
*指標變數,*a是乙個指標變數
15、for迴圈
第一種型別
for i := 0; i <= 10; i++
第二種型別
省略兩個值
for ; sum <= 10;
簡化後 (這時候就吧比較類似while語句了)
for sum <= 10
第三種型別
無限迴圈
for
第四種型別
for-each range 迴圈
strings := string
for i, s := range strings
numbers := [6]int
for i,x:= range numbers
0 google第一值從0開始迭代遞增1 runoob
第 0 位 x 的值 = 1
第 1 位 x 的值 = 2
第 2 位 x 的值 = 3
第 3 位 x 的值 = 5
第 4 位 x 的值 = 0
第 5 位 x 的值 = 0
第二個值是直到末尾
16、break語句
跳出迴圈,繼續執行剩下的語句
17、continue語句
跳出本次迴圈,執行下一次迴圈
18、語言函式
func 函式名(引數列表)返回型別
a, b := swap("google", "runoob") //呼叫的時候賦值給a和b
19、* 和&再次梳理
*代表的是取這個對應的值 比如 *a 是取a的位址裡面的值
&代表取位址 &a 是取a的位址
定義 *a int ; a是指標變數,專門用於存放位址
&需要與*配合使用,
1、如果p是int *指標變數,那麼*&p = p,&*p = p,都是p,但還沒定義p指向哪,存的是誰的位址。 由於p是指標變數,那麼它存放的資料就是正確的某個值的位址,這時候是合法的
2、如果p是乙個int變數,那麼*&p = p;而&*p是非法的,因為*p非法。
這裡p僅是乙個正常的變數,p指代的位址是不合法的,因此不能*p,這樣是非法的
20、函式引用傳遞值
func swap(x *int, y *int) {}21、陣列宣告呼叫 swap(&a, &b)
var balance [10] float3222、初始化陣列
var balance = [5]float32簡化後
balance := [5]float32陣列長度不確定,使用...代替陣列長度,編譯器會根據元素個數自行推斷陣列的長度:
var balance = [...]float32如果設定了陣列的長度,我們還可以通過指定下標來初始化元素:
// 將索引為 1 和 3 的元素初始化如果忽略 中的數字不設定陣列大小,go 語言會根據元素的個數來設定陣列的大小:balance := [5]float32
balance[4] = 50.0切片的初始化
s := arr[:] 初始化切片 s,是陣列 arr 的引用。
s := arr[:endindex] 預設 startindex 時將表示從 arr 的第乙個元素開始。
二維陣列初始化
a := [3][4]int , /* 第一行索引為 0 */23、go語言指標暫時不加以展開, /* 第二行索引為 1 */
, /* 第三行索引為 2 */
}
24、go語言結構體
type books struct
// 建立乙個新的結構體 對於沒有初始化的字段會預設為0或者空
fmt.println(books)
// 也可以使用 key => value 格式
fmt.println(books)
var book1 books
訪問結構體成員 book1.book_id
問題 陣列
指標26、go語言切片
27、go不支援隱式轉換型別,只支援顯示轉換型別
mean = float32(sum)/float32(count)
GO語言基礎語法
語言變數 go語言的語言符號又稱記法元素,共包括5類,標籤符 identifier 關鍵字 keyword 操作符 operator 分隔符 delimiter 字面量 literal 它們是組成go語言 和程式的最基本單位。go語言的所有源 都必須由 unicode 編碼規範的 utf 8 編碼格...
Go 語言基礎語法
go 標記 go 程式可以由多個標記組成,可以是關鍵字,識別符號,常量,字串,符號。如以下 go 語句由 6 個標記組成 fmt.println hello,world 6 個標記是 每行乙個 1.fmt 2.3.println 4.5.hello,world 6.行分隔符 在 go 程式中,一行代...
Go 語言基礎語法
上一章節我們已經了解了 go 語言的基本組成結構,本章節我們將學習 go 語言的基礎語法。go 程式可以由多個標記組成,可以是關鍵字,識別符號,常量,字串,符號。如以下 go 語句由 6 個標記組成 fmt.println hello,world 6 個標記是 每行乙個 1.fmt 2.3.prin...