当前位置: 首页 > news >正文

golang学习总结--函数

1.go函数声明语法:func 函数名 (参数列表) (返回值列表){}

func add()(){
}

2.golang函数特点

  (1)不支持重载:一个包中不能有两个函数名称一样的函数,即使参数列表不同

  (2)多返回值

  (3)匿名函数

  (4)函数是一种类型,也可以赋值给一个变量

  (5)函数名大小写敏感,函数名首字母表示该函数可跨包调用,小写表示不可跨包调用

package main

import (
	"fmt"
)

type op_func func(int, int) int

//多返回值的例子
func Calc(a int, b int) (int, int) {
	sum := a + b
	avg := (a + b) / 2
	return sum, avg
}

func add(a, b int) int {
	return a + b
}

func calc(a, b int) (sum int, avg int) {
	sum = a + b
	avg = (a + b) / 2
	return
}

func operator(op op_func, a, b int) int {

	return op(a, b)
}

//可变参函数例子,第一个参数固定,从第二个开始是可变参
func add1(a int, arg ...int) int {
	var sum int = a
	for i := 0; i < len(arg); i++ {
		sum += arg[i]
	}

	return sum
}

func main() {
	c := add(100, 200)
	fmt.Println(c)

	var d op_func
	d = add
	fmt.Println(add)
	fmt.Println(d)

	//函数赋值例子,类似于c语言函数指针的使用方法
	sum := operator(d, 100, 200)
	fmt.Println(sum)

	//注意顺序不能反
	sum1, avg1 := calc(10, 20)
	fmt.Println("sum1: ", sum1, ", avg1: ", avg1)

	sum2 := add1(10, 3, 3, 3, 3)
	fmt.Println("sum2: ", sum2)
}

3.defer关键字

go语言中的defer关键字表示延迟执行,在函数结束时执行,因此可以在defer中做一些关闭文件描述符,资源释放,断开数据库连接等操作。

(1)defer的执行时机:defer语句在函数返回之前 或者 函数中 return语句(return语句可能调用另一个函数) 之后执行。例子:

package main

import (
	"fmt"
)

func main() {
	fmt.Println(deferReturn())
}

func deferReturn() (ret int) {
	defer func() {
		ret++
	}()
	return 10
}

输出结果是:11,原因是defer在return之后执行,对返回值ret的值10执行+1操作

(2)多个defer语句的执行顺序是先进后出

package main

import (
	"fmt"
)

func deferMulti() {
	for i := 0; i < 5; i++ {
		defer fmt.Printf("%d ", i)
	}
}

func main() {
	deferMulti()
}

输出结果:4 3 2 1 0

4._标识符,用来忽略函数返回值

package main

import (
	"fmt"
)

func calc(a, b int) (sum int, avg int) {
	sum = a + b
	avg = (a + b) / 2
	return
}

func main() {
	sum, _ := calc(10, 20)
	fmt.Println(sum)
}

输出结果:30

相关文章:

  • golang学习总结--结构体、接口
  • 解决运行时报错:error while loading shared libraries xxx.so,cannot open shared object file
  • 超实用:linux shell光标移动常用快捷键
  • git commit之后如何撤销
  • golang学习总结--协程、channel
  • 跟我一起写dockerfile
  • dockerfile中多个FROM指令的意义(multistage)
  • dockerfile实战:使用dockerfile制作c/c++程序docker镜像
  • c++11并发编程一(std::thread之:thread构造函数)
  • c++11并发编程二(std::thread之:线程入口函数)
  • 身份证校验码计算:根据身份证前17位计算第18位校验码-c++实现
  • c++11并发编程三(使用std::future、std::promise获取线程返回值)
  • mysql删除表时报错:Cannot delete or update a parent row: a foreign key constraint fails 解决办法
  • mysql C API 预处理接口
  • C++多个头文件中可以定义同名的namespace吗?
  • 【技术性】Search知识
  • 2017年终总结、随想
  • 78. Subsets
  • Angular 4.x 动态创建组件
  • Java程序员幽默爆笑锦集
  • Java多态
  • JAVA多线程机制解析-volatilesynchronized
  • Js基础知识(一) - 变量
  • Promise面试题,控制异步流程
  • Promise面试题2实现异步串行执行
  • Python进阶细节
  • Rancher-k8s加速安装文档
  • Sass Day-01
  • 浮现式设计
  • 关于List、List?、ListObject的区别
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 机器学习中为什么要做归一化normalization
  • 再次简单明了总结flex布局,一看就懂...
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 阿里云服务器如何修改远程端口?
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #图像处理
  • (6)设计一个TimeMap
  • (6)添加vue-cookie
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (十八)SpringBoot之发送QQ邮件
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (顺序)容器的好伴侣 --- 容器适配器
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .dwp和.webpart的区别
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net MySql
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net2005怎么读string形的xml,不是xml文件。
  • .net解析传过来的xml_DOM4J解析XML文件
  • .net连接oracle数据库
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)