golang学习笔记3——函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yubo_725/article/details/89533009

函数

函数的形式

func 函数名称(函数参数 参数类型) 返回值 {

}

例如:

package main

import "fmt"

// 一个简单的add函数,传入两个整数,返回两个数的和
// 参数类型都是int,所以合并写参数类型
func add(a, b int) int {
	return a + b
}

// 参数类型不一致,分开写参数类型
func SayHello(age int, name string) string {
	return fmt.Sprintf("This is %v, I am %d years old.", name, age)
}

// 函数有两个返回值
func test(a, b int) (int, string) {
	return a * 2, fmt.Sprintf("hello %d", b)
}

// 命名返回值
func namedReturnVar() (a, b int) {
	a = 1
	b = 2
	return
}

func main() {
	// 输出:3
	fmt.Println(add(1, 2))
	// 输出:This is zhangsan, I am 20 years old.
	fmt.Println(SayHello(20, "zhangsan"))
	// 输出:20 hello 20
	fmt.Println(test(10, 20))
	// 输出:1 2
	a, b := namedReturnVar()
	fmt.Println(a, b)
}

函数作为一种数据类型

golang中的函数对应一种数据类型,如下代码所示:

func hello() {
	fmt.Println("hello golang!")
}

func main() {
	var f func()
	f = hello
	f() // 输出: hello golang!
}

下面的代码用于处理一个字符串数组,将数组中的每个字符串都去除前缀和空格:

package main

import (
	"fmt"
	"strings"
)

// 去除字符串前缀
func removePrefix(s string) string {
	return strings.TrimPrefix(s, "hello")
}

// 处理字符串数组,第二个参数为一个函数数组,每个字符串都会被这个函数数组中的函数处理
func processStrs(strs []string, chain []func(string) string) {
	for index, str := range strs {
		// 拿到一个字符串
		item := str
		// 遍历函数数组,将每个函数都作用于字符串上
		for _, f := range chain {
			item = f(item)
		}
		// 将处理完的字符串放回原来的数组
		strs[index] = item
	}
}

func main() {
	strs := []string{
		"hello world!",
		"hello golang!",
		"hello Java!",
		"hello C++!",
		"hello Python!",
	}
	processStrs(strs, []func(string) string{
		removePrefix,
		strings.TrimSpace,
	})
	for _, s := range strs {
		fmt.Println(s)
	}
}

上面的代码运行结果为:

world!
golang!
Java!
C++!
Python!

匿名函数

package main

import "fmt"

func main() {
	// 定义匿名函数
	f := func(s string) string {
		return s + " world"
	}
	// 调用匿名函数
	str := f("hello")
	fmt.Println(str)
}

函数的可变参数

package main

import "fmt"

// 可变参数
func test(a int, b ...interface{}) {
	fmt.Printf("a = %d\n", a)
	for _, item := range b {
		fmt.Println(item)
	}
}

func main() {
	test(1, "hello", 20.0, true)
}

上面的test函数,第一个参数为整型,后面...interface{}表示可变参数,且可以为任意个,在调用test函数时,第一个参数为1,后面的参数类型和参数个数不固定。

defer语句

defer语句是延迟执行语句,用于在函数返回后执行某段代码,如下面的例子:

func main() {
	fmt.Println("start...")

	defer fmt.Println(1)

	defer fmt.Println(2)

	fmt.Println("end")
}

打印结果为:

start...
end
2
1

defer语句会在函数返回后才被执行,并且如果有多个defer语句的话,defer语句是按照声明的顺序反向执行的,可以当作defer语句是放到栈中的,执行时依次出栈。

defer的用途主要是关闭文件句柄,资源的加锁解锁等。

展开阅读全文

没有更多推荐了,返回首页