go语言基础 | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1.go语言变量类型两种声明方式
1.var name = value 自动推导变量类型,也可以在定义中自己声明 2.name:=value 常量使用const 常量没有确定的类型,根据上下文自动确定类型 例:
package main
import (
"fmt"
"math"
)
func main() {
//变量
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f, g)
//常量
const s string = "limengcheng"
const h = 5000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
2.选择分支结构
if 条件 没括号{ 语句 } else if 条件{ 语句 } else{ 语句 } 例:
package main
import "fmt"
func main() {
if 7%2 == 0 {
fmt.Println("偶数")
} else {
fmt.Println("奇数")
}
if num := 9; num < 0 {
fmt.Println("负数")
} else if num > 10 {
fmt.Println("两位数以上")
} else {
fmt.Println("个位数")
}
}
3.循环
在go里面没有while循环、do while循环,只有唯一的一种循环,最简单的for循环就是在for后面什么都不写,代表一个死坏,循环途中你可以用break跳出,也可以使用经典的continue跳过
func main() {
i := 1
//死循环
for {
fmt.Println("loop")
break
}
//for循环
for j := 7; j < 9; j++ {
fmt.Println(j)
}
//continue break
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
}
4.数组和切片
go语言中的数组有两种,一种是静态数组,先定义变量名称然后赋值;另一种为动态数组直接使用make函数开辟空间并不赋值
var myArray1 [10]int
myArray2 := [4]int{1, 2, 3, 4}
var slice1 []int
slice1 = make([]int, 3)
5.函数和导包
init函数与import
首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次。
main函数
main 函数只能在package main中。
执行顺序
golang里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数在定义时不能有任何的参数和返回值。
虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。
go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是可选的,但package main就必须包含一个main函数。
程序的初始化和执行都起始于main包。
如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。
当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。
等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:
具体代码实例为
package main
import (
_ "golangstudy/import/lib1" //匿名导包,只导不用
mylib2 "golangstudy/import/lib2" //给包起别名
//使用. 将包融入main中,直接使用方法名调用
)
func main() {
//lib1.Lib1Test()
mylib2.Lib2Test()
}