Go指南6-函数的基本使用

207 阅读2分钟

1.形参和实参

之前学Python时,比较少接触这两个概念,所以做下备忘

// 形参就是方法定义的参数,如下面的变量a;实参就是实际传进的参数,比如下面的变量b
func test(a string){
	fmt.Println(a)
}

b := "aa"
test(b)

2.Go的参数和返回值

2.1 Go的参数类型在参数名后面,返回值在参数后面

// x,y是传递的参数,最终返回int类型
func add(x int, y int) int {
	return x + y
}

2.2 类型共享

// x, y类型一致,只需要声明一个类型即可
func split(sum int) (x, y int) {
	x = sum * 4 / 9
  y = sum - x
	return x, y
}

2.3 一个return关键字返回所有值,这种方式Go文档称为Named return values,不建议在比较复杂的函数内使用

func split(sum int) (x, y int) {
	x = sum * 4 / 9
  y = sum - x
	return  // 如下,这里的return关键字等同于return x, y
}

3.可变参数

Golang的可变参数使用...符号实现

3.1 同一类型的不定参数

// 不定参数,numbers等同于一个切片
func indefiniteParams(numbers ...int) {
	fmt.Println(reflect.TypeOf(numbers))  // []int
	for _, num := range numbers {
		fmt.Println(num)
	}
}

func indefiniteParamsTest() {
	indefiniteParams(1, 2, 3)
}

3.2 不同类型的不定参数

func diffTypeParams(args ...interface{}) {
	for _, arg := range args { //迭代不定参数
		switch arg.(type) {
		case int:
			fmt.Println(arg, "is int")
		case string:
			fmt.Println(arg, "is string")
		case float64:
			fmt.Println(arg, "is float64")
		case bool:
			fmt.Println(arg, "is bool")
		default:
			fmt.Println("未知类型")
		}
	}
}

func diffTypeParamsTest()  {
	diffTypeParams(11, 11.1, "22", false)
}

4.结构体方法

结构体方法,也可以简单理解为类方法

详细请戳: Go指南7-面对对象与结构体

5.闭包的实现

func getSequence() func() int  {
	i := 0
	fmt.Println("i", i)
	return func() int {
		i += 1
		return i
	}
}

func getSequenceTest() {
	// 初始化, 返回函数,此时 nextNumber 等价于 func() int { i += 1; return i }
	nextNumber := getSequence()
	// 由于nextNumber本质是一个函数,nextNumber()即执行该函数,只不过i的值会保留,所以i的值会一直累加
	fmt.Println(nextNumber())  // 1 
	fmt.Println(nextNumber())  // 2
	fmt.Println(nextNumber())  // 3
}