// init函数常用的一个例子就是用来设置初始表达式的值。
// 变量放在函数下面,会提升到函数上面
// 可以有多个init()
// main里面不能init()
package main
import "fmt"
func init() {
fmt.Println("init function --->", bb)
}
func init() { // 可以多个init
fmt.Println("init22 function --->", aa)
}
var precomputed = [20]float64{}
func init() {
var current float64 = 1
precomputed[0] = current
for i := 1; i < len(precomputed); i++ {
precomputed[i] = precomputed[i-1] * 1.2
}
fmt.Println(precomputed)
}
var _ int64 = ss()
var aa int = bb
var bb int = 1
func ss() int64 {
fmt.Println("111")
aa = 3
return 1
}
func main() {
fmt.Println("main --->", aa)
}
二、Go要求非常严格,不允许引用不使用的包。但是有时你引用包只是为了调用init函数去做一些初始化工作。此时空标识符(也就是下划线)的作用就是为了解决这个问题。
import _ "image/png"
三、父子导入包的顺序
四、方法和函数
- ⽅法是有接收者的,我们说的⽅法要么是属于⼀个结构体的,要么属于⼀个新定义的类型的。
可以用:structname.funname()访问
type bird struct {
name string
}
func (b bird) fly() { //多了形参,在函数名前面
fmt.Println(b.name + " fly")
}
func (b *bird) fly2() {
b.name = "duan"
fmt.Println("b.name", b.name)
}
func main() {
b := bird{"my bird"}
// whatFly(b)
b.fly()
b.fly2()
}
interface和struct结合使用
package main
import "fmt"
type Animal interface {
fly()
}
type bird struct {
name string
}
func (b bird) fly() { //多了形参,在函数名前面
fmt.Println(b.name + " fly")
}
func newAni() Animal {
return &bird{name: "duan"}
}
func main() {
var c Animal
c = new(bird) //不能传参数
c.fly()
d := newAni()// 可以传参数
d.fly()
}
- 函数是指不属于任何结构体、类型的⽅法,也就是说函数是没有接收者的。
func add (a, b int ) int {
// 函数
return a+b
}
func (t *T) add (a, b int ) int {
// 结构体
return a+b
}
闭包函数
package main
import "fmt"
func getSequence() func() int {
i := 0
return func() int {
i += 1
return i
}
}
func main() {
num1 := getSequence()
fmt.Println(num1())
fmt.Println(num1())
fmt.Println(num1())
num2 := getSequence()
fmt.Println(num2())
fmt.Println(num2())
}