go入门笔记五(init函数&方法、interface&闭包函数)

// 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())
}


版权声明:本文为hkduan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。