搭建網(wǎng)站程序網(wǎng)站點(diǎn)擊量與排名
!注: go中 對(duì)變量申明很是嚴(yán)格,申明了,在沒(méi)有使用的情況下,也會(huì)產(chǎn)生編譯錯(cuò)誤
1.行分隔符
一行就是代碼,無(wú);分割,如果需要在一行展示,需要以;分割,否則編譯出錯(cuò)
fmt.Println("hello world")fmt.Println(111)fmt.Println("hello world");fmt.Println(111)
2.標(biāo)識(shí)符
標(biāo)識(shí)符就是常量或者func命名方式:
不能使用關(guān)鍵字,數(shù)字開(kāi)頭,運(yùn)算符 如:case(關(guān)鍵字),1ab(數(shù)字開(kāi)頭無(wú)效字符),a+b(編譯不通過(guò))之類的來(lái)命名;也不允許使用預(yù)定義標(biāo)識(shí)符 如 byte bool等
3.關(guān)鍵字
25個(gè)關(guān)鍵字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
4.預(yù)定義標(biāo)識(shí)符
36個(gè)預(yù)定義標(biāo)識(shí)符
append bool byte cap close complex complex64 complex128 uint16
copy false float32 float64 imag int int8 int16 uint32
int32 int64 iota len make new nil panic uint64
print println real recover string true uint uint8 uintptr
5.go語(yǔ)言中的空格
go語(yǔ)言中的空格 為了提高代碼的閱讀性個(gè)規(guī)范,通常兩個(gè)變量之間必須要有空格隔開(kāi),在if條件中是為了提高閱讀性,在常量賦值中,沒(méi)有空格隔開(kāi),編譯出錯(cuò)。
const a int = 10
const b string = "ccc"func main() {var c int = 11if c < a {fmt.Print("a<10")} else {fmt.Print("a>10")}
}
6.格式化字符串
Go 語(yǔ)言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并賦值給新串:
Sprintf 根據(jù)格式化參數(shù)生成格式化的字符串并返回該字符串。
Printf 根據(jù)格式化參數(shù)生成格式化的字符串并寫入標(biāo)準(zhǔn)輸出。
等同于 java中string.format()
// %d 表示整型數(shù)字,%s 表示字符串var tempCode = 1234var endDate = "2023-12-24"var url = "Code=%d&endDate=%s"fmt.Println(fmt.Printf(url, tempCode, endDate))var target_url = fmt.Sprintf(url, tempCode, endDate)fmt.Println(target_url)
7.變量
go語(yǔ)言中變量同一個(gè)func中具有唯一性
只能申明一次
申明變量使用 var申明
var tempA, tempB, tempC int = 1, 2, 3 //申明同一種類型的變量可以采用這種方式fmt.Println(tempA)fmt.Println(tempB)fmt.Println(tempC)
先申明多個(gè)變量,在統(tǒng)一賦值
var tempA, tempB, tempC int //申明同一種類型的變量可以采用這種方式var stringVla stringtempA, tempB, tempC, stringVla = 1, 2, 3, "測(cè)試字符串"fmt.Println(tempA)fmt.Println(tempB)fmt.Println(tempC)fmt.Println(stringVla)
重復(fù)申明
var intVal intintVal := 1intVal1 := 10fmt.Println(intVal + intVal1)
go中 對(duì)變量申明很是嚴(yán)格
申明了,在沒(méi)有使用的情況下,也會(huì)產(chǎn)生編譯錯(cuò)誤
函數(shù)調(diào)用
//cc := "測(cè)試"var testStr string = "測(cè)試"v1, v2, v3 := disposeData(9, 1, testStr)fmt.Print(v1, v2, v3)
}func disposeData(d int, d1 int, c1 string) (int, int, string) {a, b, c := 1+d, 2+d1, "參數(shù)"+c1return a, b, c
}
8.常量
go中常量以 const(a,b,c)這種格式進(jìn)行來(lái)命名常量
普通常量
const (a = "常量測(cè)試"b = len(a)c = unsafe.Sizeof(a))
常量元素自動(dòng)+1(iota)
// 在const常量中,使用iota進(jìn)行計(jì)算,它后面的的值都會(huì)依次+1const (a = iotabc)fmt.Print(a, b, c)
9.語(yǔ)言運(yùn)算符
這里和傳統(tǒng)很多語(yǔ)言中的一樣就 不寫代碼實(shí)例了
運(yùn)算符 描述 實(shí)例
== 檢查兩個(gè)值是否相等,如果相等返回 True 否則返回 False。 (A == B) 為 False
!= 檢查兩個(gè)值是否不相等,如果不相等返回 True 否則返回 False。 (A != B) 為 True
> 檢查左邊值是否大于右邊值,如果是返回 True 否則返回 False。 (A > B) 為 False
< 檢查左邊值是否小于右邊值,如果是返回 True 否則返回 False。 (A < B) 為 True
>= 檢查左邊值是否大于等于右邊值,如果是返回 True 否則返回 False。 (A >= B) 為 False
<= 檢查左邊值是否小于等于右邊值,如果是返回 True 否則返回 False。 (A <= B) 為 True
邏輯運(yùn)算符
&& 邏輯 AND 運(yùn)算符。 如果兩邊的操作數(shù)都是 True,則條件 True,否則為 False。 (A && B) 為 False
|| 邏輯 OR 運(yùn)算符。 如果兩邊的操作數(shù)有一個(gè) True,則條件 True,否則為 False。 (A || B) 為 True
! 邏輯 NOT 運(yùn)算符。 如果條件為 True,則邏輯 NOT 條件 False,否則為 True。 !(A && B) 為 True
賦值運(yùn)算符
= 簡(jiǎn)單的賦值運(yùn)算符,將一個(gè)表達(dá)式的值賦給一個(gè)左值 C = A + B 將 A + B 表達(dá)式結(jié)果賦值給 C
+= 相加后再賦值 C += A 等于 C = C + A
-= 相減后再賦值 C -= A 等于 C = C - A
*= 相乘后再賦值 C *= A 等于 C = C * A
/= 相除后再賦值 C /= A 等于 C = C / A
%= 求余后再賦值 C %= A 等于 C = C % A
<<= 左移后賦值 C <<= 2 等于 C = C << 2
>>= 右移后賦值 C >>= 2 等于 C = C >> 2
&= 按位與后賦值 C &= 2 等于 C = C & 2
^= 按位異或后賦值 C ^= 2 等于 C = C ^ 2
|= 按位或后賦值 C |= 2 等于 C = C | 2
其他運(yùn)算符
& 返回變量存儲(chǔ)地址 &a; 將給出變量的實(shí)際地址。
* 指針變量。 *a; 是一個(gè)指針變量 int 4
運(yùn)算符優(yōu)先級(jí)
由高到低
5 * / % << >> & &^
4 + - | ^
3 == != < <= > >=
2 &&
1 ||
10.語(yǔ)言條件語(yǔ)句
if if-else 嵌套if switch selct
if語(yǔ)句
var a int = 10//var b int = 12if a < 10 {fmt.Print("a<10")}
if-else
var a int = 10//var b int = 12if a < 10 {fmt.Print("a<10")}else {fmt.Print("a>10")}```
嵌套if```bashvar a int = 10var b int = 12if a == 10 {fmt.Println("a<10")if b > 10 {fmt.Println("b>10")}}
switch
等于某個(gè)值走某一項(xiàng)
switch marks {case 90: grade = "A"case 80: grade = "B"case 50,60,70 : grade = "C"default: grade = "D" }switch {case grade == "A" :fmt.Printf("優(yōu)秀!\n" ) case grade == "B", grade == "C" :fmt.Printf("良好\n" ) case grade == "D" :fmt.Printf("及格\n" ) case grade == "F":fmt.Printf("不及格\n" )default:fmt.Printf("差\n" );}fmt.Printf("你的等級(jí)是 %s\n", grade );
select
接收到某個(gè)值走某一個(gè)
c1 := make(chan string)c2 := make(chan string)go func() {time.Sleep(1 * time.Second)c1 <- "one"}()go func() {time.Sleep(2 * time.Second)c2 <- "two"}()for i := 0; i < 2; i++ {select {case msg1 := <-c1:fmt.Println("received", msg1) // 獲取到c1的值執(zhí)行case msg2 := <-c2:fmt.Println("received", msg2) // 獲取到c2的值執(zhí)行}}
11.循環(huán)語(yǔ)句
這里的循環(huán)分為for,for-each 循環(huán)兩種
for循環(huán)
sum := 0for {sum++ // 無(wú)限循環(huán)if sum == 10 { // 增加條件跳出循環(huán)fmt.Print(sum + 1)break}}
for-each循環(huán)
array數(shù)組循環(huán)
// for-each//數(shù)組strings := []string{"abc", "ABC"}for i, s := range strings {fmt.Println(i, s) //rang==java總的 each strings 數(shù)組名 i元素index,s元素value index從0開(kāi)始}
map集合循環(huán)
// map集合map1 := make(map[int]string) //定義一個(gè)int(key) string(value)類型的map集合map1[1] = "a"map1[2] = "b"map1[3] = "c"map1[4] = "d"// 取出map集合中kvfor i, s := range map1 {fmt.Println(i, s)}// 讀取map集合中的kfor i := range map1 {fmt.Println(i)}// 讀取map集合中的vfor _, s := range map1 {fmt.Println(s)}
map集合和array數(shù)組結(jié)合使用測(cè)試
// map集合map1 := make(map[int]int) //定義一個(gè)int(key) string(value)類型的map集合tempInts := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //創(chuàng)建一個(gè)集合并賦值//var arr []int // 創(chuàng)建一個(gè)空數(shù)組if !reflect.ValueOf(tempInts).IsNil() {for i, tempInt := range tempInts {map1[i] = tempInt}} else {fmt.Println("集合為空!")}// 取出map集合中kvif len(map1) > 0 {for i, s := range map1 {fmt.Println(i, s)}}
在循環(huán)體當(dāng)中通常還有一些控制語(yǔ)句
break 語(yǔ)句 經(jīng)常用于中斷當(dāng)前 for 循環(huán)或跳出 switch 語(yǔ)句
continue 語(yǔ)句 跳過(guò)當(dāng)前循環(huán)的剩余語(yǔ)句,然后繼續(xù)進(jìn)行下一輪循環(huán)。
goto 語(yǔ)句 將控制轉(zhuǎn)移到被標(biāo)記的語(yǔ)句。
用到最多的通常為上面兩個(gè)
12.函數(shù)
函數(shù)也叫方法
一個(gè)函數(shù)當(dāng)中擴(kuò)了傳參的參數(shù),有些情況還包括了返回參數(shù)
// 函數(shù)調(diào)用var maxVal = maxVal(10, 12)fmt.Println(maxVal)// 返回多個(gè)參數(shù)v1, v2, v3 := disposeData(1, 2, "測(cè)試")fmt.Println(v1, v2, v3)
}// 返回最大值,類型為int型
func maxVal(val1, val2 int) int {var res intif val1 > val2 {res = val1} else {res = val2}return res
}// 返回多個(gè)參數(shù)
func disposeData(d int, d1 int, c1 string) (int, int, string) {a, b, c := 1+d, 2+d1, "參數(shù)"+c1return a, b, c
}
13.變量
變量分為全局變量和局部變量?jī)煞N;通常函數(shù)內(nèi)的變量為局部變量,函數(shù)外為全局變量
package mainimport "fmt"/* 聲明全局變量 */
var g intfunc main() {/* 聲明局部變量 */var a, b int/* 初始化參數(shù) */a = 10b = 20g = a + bfmt.Printf("結(jié)果: a = %d, b = %d and g = %d\n", a, b, g)
}
14.數(shù)組
// 數(shù)組語(yǔ)法格式為
var arrayName [size]dataType// 初始化數(shù)組
var arr1[10] int//初始化數(shù)組并賦值,兩種都可以,根據(jù)自己需求選擇
var numbers = [5]int{1, 2, 3, 4, 5}
tempInts := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
具體操作不在這寫了,循環(huán)操作那里有
15.指針
指針:go中的指針就是實(shí)體中的某個(gè)屬性,有指針名稱,指針名稱,指針地址;除了這個(gè)以外,還有空指針的概念
這個(gè)通常用于校驗(yàn)一個(gè)數(shù)據(jù)是否為空時(shí)使用。
指針使用流程:
1.定義指針變量。
2.為指針變量賦值。
3.訪問(wèn)指針變量中指向地址的值。
4.在指針類型前面加上 * 號(hào)(前綴)來(lái)獲取指針?biāo)赶虻膬?nèi)容。
// 指針var name *string //指向string類型var age *int //指向int型var i int = 20var tempAge *inttempAge = &i // 指向變量存儲(chǔ)地址fmt.Println(name, age, tempAge)
空指針
if(ptr != nil) // ptr 不是空指針
if(ptr == nil) // ptr 是空指針
16.結(jié)構(gòu)體
這個(gè)結(jié)構(gòu)和java中的實(shí)體對(duì)象一樣,只有賦值和取值方式有所區(qū)別
type Books struct {title stringauthor stringsubject stringbook_id int
}// 創(chuàng)建一個(gè)新的結(jié)構(gòu)體fmt.Println(Books{"go", "fetter", "go教程", 1111})// k-v形式結(jié)構(gòu)fmt.Println(Books{title: "go", author: "fetter", subject: "go教程", book_id: 1111})// 忽略某個(gè)字段fmt.Println(Books{title: "go", author: "fetter", subject: "go教程"})// 使用對(duì)象接收并獲取單個(gè)字段book := Books{title: "go", author: "fetter", subject: "go教程", book_id: 1234}fmt.Println(book.book_id)
17.切片
切片等元素截取,拼接
// 切片 數(shù)組元素截取,拼接//s := arr[startIndex:endIndex]// 開(kāi)始位置,結(jié)束位置;開(kāi)始位置包括本身,結(jié)束位置到結(jié)束的前一位numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}printSlice(numbers)// 打印原始切片fmt.Println("numbers ==", numbers)//打印子切片從索引1(包含) 到索引4(不包含)fmt.Println("numbers[1:4] ==", numbers[1:4])// 默認(rèn)下限為 0fmt.Println("numbers[:3] ==", numbers[:3])// 默認(rèn)上限為 len(s)fmt.Println("numbers[4:] ==", numbers[4:])//append 數(shù)組元素追加// 追加一個(gè)10numbers = append(numbers, 10)fmt.Println(numbers)// 追加兩個(gè)元素numbers = append(numbers, 10, 12)fmt.Println(numbers)}func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
18.語(yǔ)言范圍range
Go 語(yǔ)言中 range 關(guān)鍵字用于 for 循環(huán)中迭代數(shù)組(array)、切片(slice)、通道(channel)或集合(map)的元素。在數(shù)組和切片中它返回元素的索引和索引對(duì)應(yīng)的值,在集合中返回 key-value 對(duì)。
具體的操作上面有這里不做實(shí)例了
19.map集合
map是一個(gè)k-v集合,增加刪除查詢都是基于k來(lái)做的
// 創(chuàng)建一個(gè)集合var currentMap = make(map[int]string)currentMap[1] = "a"currentMap[2] = "b"currentMap[3] = "c"// 遍歷集合if len(currentMap) > 0 {fmt.Println("取出集合k-v")// 取出集合中的k-vfor i, s := range currentMap {fmt.Println(i, s)}fmt.Println("取出集合k")// 取出集合中的kfor i := range currentMap {fmt.Println(i)}fmt.Println("取出集合v")// 取出集合中的vfor _, s := range currentMap {fmt.Println(s)}}// 刪除集合元素// 根據(jù)key刪除fmt.Println("源集合", currentMap)delete(currentMap, 1)fmt.Println("刪除后集合", currentMap)
20.類型轉(zhuǎn)換
一種類型轉(zhuǎn)為另一種類型
// 類型轉(zhuǎn)換// int轉(zhuǎn)floatvar a int = 10var b float64 = float64(a)fmt.Println("int轉(zhuǎn)float64", b)//string轉(zhuǎn)intvar str string = "10"var num intnum, _ = strconv.Atoi(str)fmt.Println("string轉(zhuǎn)int", num)//int轉(zhuǎn)stringnum1 := 1234strVlue := strconv.Itoa(num1)fmt.Printf("整數(shù) %d 轉(zhuǎn)換為字符串為:'%s'\n", num1, strVlue)
21.接口 interface
// go變量 對(duì)象在前,類型在后var phone Phone// java 類型在前,對(duì)象在后//private Object objectphone = new(NokiaPhone)phone.call()
}type Phone interface {call()
}type NokiaPhone struct {
}// 實(shí)現(xiàn)了Phone中的call()接口
func (nokiaPhone NokiaPhone) call() {fmt.Println("I m nokiaPhone , I call you phone")
}
22.異常處理
異常處理有捕獲異常,返回響應(yīng)前端,也有自己處理,這里直接打印了。
type error interface {Error() string
}
func Sqrt(f float64) (float64, error) {if f < 0 {return 0, errors.New("math: square root of negative number")}
}