go语言中的函数

package main;

import "fmt"

func main() {
	a,b,c := A(1,2,3);
	fmt.Println(a,c);

	//调用函数B,虽然传入的是一个slice,但外部变量并未改变,说明是值拷贝
	B(a,c);
	fmt.Println(a,c);
	d := []int{1,3};
	//这里传入的是一个slice,但外部变量确改变了,说明是地址拷贝。
	C(d);
	fmt.Println(d);
	e := 2;
	//这里把e的地址传递过去
	D(&e);
	fmt.Println(e);

	//函数E赋值给f
	f := E;
	f();

	//匿名函数
	g := func() {
		fmt.Println("我是匿名函数");
	};
	g();

	//使用闭包
	h := F(66);
	//两次调用都使用了66
	fmt.Println(h(66));
	fmt.Println(h(88));

	//调用G函数,defer反向调用
	G();
	H();

	//调用I函数
	I();
}

//GO函数不支持嵌套,重载和默认参数

//定义函数
//func 函数名(参数列表) (返回值) {函数体}
func A(a int,b int,c int) (int,int,int) {
	return a * 2,b * 2,c * 2;
}

//不定长变参,必须作为参数列表最后的参数
//传入的是一个slice
func B(a ...int) {
	for k := range a {
		a[k] = a[k] * 2;
	}
}

//传递slice
func C(a []int) {
	for k := range a {
		a[k] = a[k] * 2;
	}
}

//传递指针
func D(a *int) {
	*a = 6;
}

//函数也是一个类型
func E() {
	fmt.Println("func E");
}

//闭包
//返回值是一个函数
func F(a int) (func(int) int) {
	//打印a的地址
	fmt.Printf("%p\n",&a);
	return func(b int) int {
		fmt.Printf("%p\n",&a);
		return a + b;
	};
}

//defer执行方式类似其它语言中的析构函数
//在函数体执行结束后,按照调用顺序的相反顺序逐个执行
//常用于资源清理,文件关闭,解锁
func G() {
	defer fmt.Println(1);
	defer fmt.Println(2);
	defer fmt.Println(3);
}

func H() {
	for i := 0; i < 3; i++ {
		//这里用到了闭包
		defer func() {
			//这里的i作为地址的引用,引用局部变量i
			//函数体结束后,i的值就变成了3,所以打印三次3
			fmt.Println(i)
		}();
	}

	//这里的输出就跟上面的不一样,输出2,1,0
	for i := 0; i < 3; i++ {
		//这里是作为参数传递,是值的拷贝
		defer func(a int) {
			fmt.Println(a);
		}(i);
	}
}

//GO里面没有异常机制,但有panic/recover来处理错误
//panic可以在任何地方引发,但recover只在defer调用的函数中有效
func I() {
	J();
	K();
	M();
}

func J() {
	fmt.Println("fucn J");
}

func K() {
	//defer必须在panic之前,因为panic之后函数不会执行了。
	//通过recover对程序进行恢复
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("recover in func K");
		}
	}();
	panic("panic in func K");
}

func M() {
	fmt.Println("func M");
}

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


类型转换 1、int转string 2、string转int 3、string转float 4、用户结构类型转换
package main import s &quot;strings&quot; import &quot;fmt&quot; var p = fmt.Println func main() { p(&quot;Contains: &quot;, s.Contains(&quot;test&quo
类使用:实现一个people中有一个sayhi的方法调用功能,代码如下: 接口使用:实现上面功能,代码如下:
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件信息 4、删除文件,成功返回true,失败返回false
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/intro/ 安装步骤: 一、GO环境安装 二、配置系统变量 三、Beego安装 一、GO环境安装 根
golang获取程序运行路径:
Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考