變量
第一種,指定變量類型,聲明后若不賦值,使用默認值0
package mainimport "fmt"func main() {var a int //第一種,指定變量類型,聲明后若不賦值,使用默認值0。fmt.Printf(" a= %d\n", a)
}
打印
第二種,根據值自行判定變量類型
package mainimport "fmt"func main() {var a = 33 //第二種,根據值自行判定變量類型fmt.Printf("a= %d\n", a)
}
打印
第三種,直接定義 變量需首次定義之前不可以為已用過的變量?
package mainimport "fmt"func main() {
c := 3 //第三種,直接定義 變量需首次定義之前不可以為已用過的變量 fmt.Printf(" a= %d\n", c)
}
打印
const
常量
package mainimport "fmt"func main() {const LENGTH int = 3const WIDTH int = 10var area intconst a, b, c = 1, false, "str" //多重賦值area = LENGTH * WIDTHfmt.Printf("面積為 : %d\n", area)println(a, b, c)}
這里和Java的常量定義是相同的
打印
多重定義枚舉
const (Unknown = 0Female = 1Male = 2
)
iota
它簡化了常量用于增長數字的定義,給以上相同的值以準確的分類。
package mainimport "fmt"const (One int = 1 + iota // 1+0Two // 1+1Three // 1+2Four // 1+3Five // 1+4Six // 1+5)func main() {fmt.Println(One)fmt.Println(Two)fmt.Println(Three)fmt.Println(Four)fmt.Println(Five)fmt.Println(Six)}
打印
用于常量定義中,常量組中僅僅有一個標示符在一行的時候,它將使用增長的iota
取得前面的表達式并且再運用它
if
if語句和Java里的if相同
for循環
package mainimport "fmt"func main() {//常規for循環類似于Java 對比少了for(i := 0; i < 10; i++)少了括號for i := 0; i < 10; i++ {fmt.Println(i)}
}
打印
類似于Java里while的for循環
如下for循環實現當value=10的時候退出for循環?
package mainimport "fmt"func main() {value := 0for {value += 1fmt.Println(value)if value == 10 {break}}
}
打印
import和init
import導包和Java的import 差不多
目錄結構
fun1
package fun1 //這里的包名最好和目錄名保持相同import ("fmt"
)func init() {fmt.Println("fun1")
}
func TestFun1() {fmt.Println("testFun1")
}
fun2
package fun2 //這里的包名最好和目錄名保持相同import "fmt"func init() {fmt.Println("fun2")
}
func TestFun2() {fmt.Println("testFun2")
}
主函數
package mainimport ("fmt""githup.com/kanyu/moudles_test/basic/fun1""githup.com/kanyu/moudles_test/basic/fun2"
)func main() {fun1.TestFun1()fun2.TestFun2()fmt.Println("main")
}
打印
詳細執行流程
1,主函數導入依賴
2,依賴函數再次判斷有無依賴,有依賴再重復導入無依賴執行函數的init函數
3,執行其它的函數
指針
go語言中和C語言相同 用*來表達變量的地址 用&來取指針指向的數值
函數值傳遞與指針傳遞
值傳遞,即在函數傳參的過程中,原來的參數不會被調用函數的行為所改變值
在傳遞參數的時候會把值復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。 go默認值傳遞
package mainimport "fmt"func swap(x, y string) (string, string) {return y, x
}func main() {stra := "字符串a"strb := "字符串b"fmt.Println("交換之前打印")fmt.Println(stra, strb)a, b := swap(stra, strb)fmt.Println("交換之后打印")fmt.Println(a, b)
}
打印
指針傳遞
//引用傳遞
package mainimport "fmt"func main() {/* 定義局部變量 */var a int = 100var b int= 200fmt.Printf("交換前 a 的值為 : %d\n", a )fmt.Printf("交換前 a 的地址值為 : %d\n", &a )fmt.Printf("交換前 b 的值為 : %d\n", b )fmt.Printf("交換前 b 的地址值為 : %d\n", &b )/* 調用 swap() 函數* &a 指向 a 指針,a 變量的地址* &b 指向 b 指針,b 變量的地址*/swap(&a, &b)//調用時候傳入地址值fmt.Printf("交換后,a 的值 : %d\n", a )fmt.Printf("交換后 a 的地址值為 : %d\n", &a )fmt.Printf("交換后,b 的值 : %d\n", b )fmt.Printf("交換后 b 的地址值為 : %d\n", &b )}func swap(x *int, y *int) {//指針參數變量 這里的交換指的把對應指針指向的值給交換了 所以a和b的地址未變化var temp inttemp = *x /* 保存 x 地址上的值 */*x = *y /* 將 y 值賦給 x */*y = temp /* 將 temp 值賦給 y */
}
打印
defer
延遲函數,defer在rerurn之后再執行延遲函數 用于如打開/關閉文件、獲取/釋放鎖、連接/斷開連接等,確保資源被適當地釋放,即使在發生錯誤或提前返回的情況下也能保證執行
package mainimport "fmt"func deferFunc() int {fmt.Println("defer func called")return 0
}func returnFunc() int {fmt.Println("return func called")return 0
}func returnAndDefer() int {defer deferFunc()return returnFunc()
}func main() {returnAndDefer()
}
打印
參考
8小時轉職Golang工程師(如果你想低成本學習Go語言)_嗶哩嗶哩_bilibili