1. 程式人生 > 實用技巧 >go-用法

go-用法

1包

#1 包:模組的意思
#2 自定義包
    -go語言的程式碼必須放在gopath的src路徑下
    -包匯入是從gopath的src路徑下開始檢索(開始找)
    -除了main包以外,建議包名就叫資料夾名,一個資料夾下的包名必須一致
    -同一個包下,變數,函式只能定義一次
    -同一個包下的變數和函式可以直接使用
    -包內的函式或變數,想讓外部包使用,必須首字母大寫
    -以後下的第三方包都是放在gopath的src路徑下
# 3 init函式(特殊函式)
    -不需要呼叫就會執行
    -可以定義多個
# 4 包匯入的幾種方式
    -import
"day02/mypackage" -給包重新命名 -import 名字 "day02/mypackage" 名字.變數/函式 -包只匯入,不使用 import _ "day02/mypackage" # 5 go語言沒有一個統一包管理的地址,大家都放到github上 # 6 採用go mode模式 -兩種建立方式之一 -命令列下輸入:go mod init 專案名 在當前路徑下創建出go.mod(該專案依賴go的版本,第三方包版本) -專案路徑的cmd視窗,go get 第三方包,就會在go.mod中加入依賴
-以後把專案copy給別人,go install -自己寫的包,就放在自己專案路徑下 -加代理的方式:手動寫,goland中配置 -在goland中建立專案時,直接指定modules,可以配置環境變數(加代理)

2 if-else語句

package main

import "fmt"

//if-else
func main() {
    //1 if else
    a := test()
    //if a>10{
    //    fmt.Println("a大於10")
    //}else {
    //    fmt.Println("
a小於10") //} //2 if --else if--- else if a > 10 { fmt.Println("dayu 10") } else if a == 10 { fmt.Println("10101010") } else { fmt.Println("xiaoyu 10") } //3 條件語句後不能回車換行 //if a > 10 { // fmt.Println("dayu 10") //} else if a == 10 { // fmt.Println("10101010") //} else { // fmt.Println("xiaoyu 10") //} } func test() int { return 100 }

3 迴圈

package main

//for 迴圈
/* for 後面三部分,都可以省略
for 變數初始化;條件;變數自增/自減 {
    迴圈體內容
}

 */
func main() {
    //1 基本使用
    //for i:=0;i<10;i++{
    //    fmt.Println(i)
    //}

    //2 省略第一部分
    //i:=0   //作用域範圍大,不止在for內部,外部也可以用
    //for ;i<10;i++{
    //    fmt.Println(i)
    //}
    //2 省略第三部分
    //i:=0   //作用域範圍大,不止在for內部,外部也可以用
    //for ;i<10;{
    //    fmt.Println(i)
    //    i++
    //}

    //3 省略一和三部分的簡略寫法(這就是while迴圈)  for 條件{ 迴圈體內容}
    //i:=0
    //for i<10{
    //    fmt.Println(i)
    //    i++
    //}

    //4 死迴圈

    //for {
    //    fmt.Println("ssssss")
    //}

    //5 只是演示開多協程
    //for i:=0;i<4000;i++{
    //    go test2()
    //}

    //6 break :結束本次for迴圈,continue結束本次迴圈,繼續下一次迴圈
}

//func test2()  {
//    for  {
//        fmt.Println("sssss")
//    }
//
//}

4 switch語句

// switch 是一個條件語句,用於將表示式的值與可能匹配的選項列表進行比較,並根據匹配情況執行相應的程式碼塊。它可以被認為是替代多個 if else 子句的常用方式


package main

func main() {
    //1 基本使用
    //num:=4
    //switch num {
    //case 1:
    //    fmt.Println("1")
    //case 2:
    //    fmt.Println("2")
    //case 3:
    //    fmt.Println("3")
    //case 4:
    //    fmt.Println("4")
    //}

    //2 預設情況
    //num:=40
    //switch num {
    //case 1:
    //    fmt.Println("1")
    //case 2:
    //    fmt.Println("2")
    //case 3:
    //    fmt.Println("3")
    //case 4:
    //    fmt.Println("4")
    //default:
    //    fmt.Println("我沒有匹配")
    //}

    //3 多表達式判斷
    //num:=40
    //switch num {
    //case 1,2,3,4,5,6,7,8:
    //    fmt.Println("1")
    //case 10,11,16:
    //    fmt.Println("2")
    //case 30:
    //    fmt.Println("3")
    //case 40,44,45:
    //    fmt.Println("4")
    //default:
    //    fmt.Println("我沒有匹配")
    //}

    //4 無表示式的 switch
    //num:=80
    //switch  {
    //case num==12,num==13:
    //    fmt.Println("12,13")
    //case num==40,num==41:
    //    fmt.Println("40,41")
    //default:
    //    fmt.Println("我沒有匹配")
    //}


    //5 Fallthrough
    //num:=12
    //switch  {
    //case num==12,num==13:
    //    fmt.Println("12,13")
    //    fallthrough
    //case num==40,num==41:
    //    fmt.Println("40,41")
    //    //fallthrough  //穿透,只要看到fallthrough,無條件執行下一個case或者default
    //default:
    //    fmt.Println("我沒有匹配")
    //}
}

5陣列

package main

import (
    "fmt"
)

//陣列:陣列是同一型別元素的集合。可以放多個值,但是型別一致,記憶體中連續儲存
// Go 語言中不允許混合不同型別的元素
func main() {

    //1 陣列的定義,陣列的大小,在定義階段就確定了,而且不能改
    //定義了一個大小為3的string型別陣列,裡面可以放3個字串
    //var names [3]string
    //var ages [3]int8
    //fmt.Println(ages)

    //2 陣列賦值
    //var ages [3]int8
    //ages[0]=99
    //ages[2]=88
    //fmt.Println(ages)
    //fmt.Println(ages[1])

    //3 定義並初始化,
    //var ages [3]int=[3]int{1,2,3}
    //var ages [3]int=[3]int{1,2}
    //var ages [3]int=[3]int{}
    //var ages=[3]int{}
    //ages:=[3]int{1,3,4,7}  //不允許多放
    //fmt.Println(ages)

    //4 陣列定義並初始化的其他(瞭解)陣列只要定義,長度就固定了,。。。,後面放幾個值,陣列大小是多少
    //var ages [9]int=[...]int{1,2,3,4,5,6,7,8}   //不支援這個
    //var ages =[...]int{1,2,3,4,5,6,7,8}
    //ages :=[...]int{1,2,3,4,8}
    //fmt.Println(len(ages))

    //5 陣列的大小是型別的一部分
    //var a [2]int=[2]int{1,2}
    //var b [2]int=[2]int{1,3}
    //b=a   //如果不是同一種類型,不允許相互賦值
    //fmt.Println(b)

    //6 陣列是值型別
    //var a [2]int=[2]int{1,2}
    //fmt.Println(a)
    //test5(a)  //因為陣列是值型別,go函式傳參,都是copy傳遞,如果是值型別,函式內改了,不會影響原來的
    //fmt.Println(a)

    //7 陣列長度  len()  陣列長度在定義階段已經固定
    //var a [2]int=[2]int{1,2}
    //fmt.Println(len(a))

    //8 陣列迴圈
    //var a =[...]int{7,4,3,5,6,7}
    //fmt.Println(a[99])
    //fmt.Println(len(a))
    //普通迴圈
    //for i:=0;i<len(a);i++{
    //    fmt.Println(a[i])
    //}

    //通過range來迴圈  (range不是內建函式,是一個關鍵字,forifelse),打印出索引
    //for i:=range a{
    //    fmt.Println(i)
    //}

    //如果用一個變數來接收,這個值是可迭代的索引
    //如果用兩個變數來接收,這兩個變數,一個是索引,一個具體的值
    //for i,value:=range a{
    //    fmt.Println(i)
    //    fmt.Println(value)
    //}
    //把陣列迴圈打印出來
    //for _,value:=range a{
    //    fmt.Println(value)
    //}

    // 9 多維陣列
    //var a [3][3]int  //定義
    //a[0][1]=99      //使用
    //fmt.Println(a)

    //定義並賦初值
    //var a [3][3]int=[3][3]int{{1},{1,2,3},{4,4,4}}
    //var s =[3][3]string{{"lqz","xxx","yyy"},{},{}}
    //fmt.Println(s)
    //
    ////迴圈多維陣列
    //for _,value:=range s{
    //    for _,in_value:=range value{
    //        fmt.Println(in_value)
    //    }
    //}

    //10 陣列定義並指定位置初始化
    //var names [100]int=[100]int{10:99,99:99}
    //var names [100]int=[100]int{10,11,2,44,99:99,45:88}
    //fmt.Println(names)



}

func test5(a [2]int)  {
    a[0]=99
    fmt.Println(a)

}

6 切片

package main

import "fmt"

//切片:切片是由陣列建立的一種方便、靈活且功能強大的包裝(Wrapper)。切片本身不擁有任何資料。它們只是對現有陣列的引用

func main() {
    //1 切片定義的第一種方式
    //定義一個數組
    //var a =[10]int{9,8,7,6,5,4,3,2,1,0}
    ////基於陣列,做一個切片
    ////[]int 中括號中不帶東西,就是切片型別
    //var b []int
    //b=a[:]
    //fmt.Println(b)
    //fmt.Printf("%T",b)
    //fmt.Println()
    //fmt.Printf("%T",a)
    //fmt.Println()
    //
    ////2 使用切片
    //fmt.Println(b[0])
    //fmt.Println(b[1])
    //
    ////3 修改切片,會影響陣列
    //b[0]=999
    //fmt.Println(b)
    ////陣列會被修改
    //fmt.Println(a)
    //
    ////4 修改陣列,是否會影響切片?會
    //a[3]=333
    //fmt.Println(a)  //陣列
    //fmt.Println(b) //切片

    // 5 切片只切陣列一部分
    //var a =[10]int{9,8,7,6,5,4,3,2,1,0}
    //var b []int=a[3:5]
    //fmt.Println(b)
    ////修改切片
    //b[0]=999
    //fmt.Println(b)
    //fmt.Println(a)
    //a[4]=888
    //fmt.Println(b)
    //fmt.Println(a)

    //6 當多個切片共用相同的底層陣列時,每個切片所做的更改將反映在陣列中
    //var a =[10]int{9,8,7,6,5,4,3,2,1,0}
    //var b []int=a[3:5]
    //var c []int=a[4:6]
    //fmt.Println(a)
    //fmt.Println(b)
    //fmt.Println(c)
    //b[1]=555
    //fmt.Println(a)
    //fmt.Println(b)
    //fmt.Println(c)

    //7 切片的長度和容量
    var a =[10]int{9,8,7,6,5,4,3,2,1,0}
    //var b []int=a[3:5]
    var b []int=a[7:8]
    fmt.Println(a)
    fmt.Println(b)
    // 切片長度
    fmt.Println(len(b))
    // 切片容量(我最多能存多少值)
    fmt.Println(cap(b))

    //8 切片追加值
    b=append(b,3)
    b=append(b,999)
    //到了臨界點再追加
    b=append(b,888)
    fmt.Println(b)
    fmt.Println(a)

    fmt.Println(len(b))// 長度是4
    fmt.Println(cap(b))  //容量是6
    b[0]=111
    fmt.Println(b)
    fmt.Println(a)

}