gogo语言学习笔记五

author author     2022-08-21     283

关键词:

函数

1、函数的基本组成

  关键字func,函数名,参数列表,返回值,函数体,返回语句。

2、函数的定义

  举个栗子  

package mymath 
import "errors"

func Add(a int, b int) (ret int, err error) {
	if a < 0 || b < 0 { // 假设这个函数只支持两个非负数字的加法
	    err= errors.New("Should be non-negative numbers!")
		return
	}
	return a + b, nil // 支持多重返回值 
}

  如果参数列表中若干个相邻的参数类型的相同,比如上面例子中的a和b,则可以在参数列表 中省略前面变量的类型声明,如下所示: 

func Add(a, b int)(ret int, err error) { 
	// ...
}

  如果返回值列表中若干个相邻返回值类型相同,也可以如上面的方式合并

  如果只有一个返回值,还可以这样写

  

func Add(a,b int) int{
    //...
}

 3、函数的调用

函数的调用非常方便,只要事先引入了函数所在的包,就可以直接用下面的方式调用函数

 

import "mymath";

c := mymath.Add(a,b);

 注意:小写字母开头的函数,只在本包内可用,大写字母开头的函数才能被其他包使用,类型和变量也一样。 

 4、不定参数

  a、不定参数类型

不定参数是指传入参数的个数为不定数量,要做到这一点,首先要把函数定义成接受不定参数的类型:

func myfunc (args ...int) int {
  for _,arg := range args {
    fmt.Println(arg)
  }
}

 调用方式

myfunc(1,2,3)
myfunc(1,2,3,4,5)

  形如...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。它是一 个语法糖(syntactic sugar),即这种语法对语言的功能并没有影响,但是更方便程序员使用。通 常来说,使用语法糖能够增加程序的可读性,从而减少程序出错的机会。

从内部实现机理上来说,类型...type本质上是一个数组切片,也就是[]type,这也是为 什么上面的参数args可以用for循环来获得每个传入的参数。

  b、不定参数的传递

 

func myfunc(args ...int) { // 按原样传递
    myfunc3(args...)
	// 传递片段,实际上任意的int slice都可以传进去
    myfunc3(args[1:]...)
}

 

  c、任意类型不定参数

如果希望传递任意类型,可以把参数类型定义为interface{},看看fmt.Println的原型

func Println(format string, ...interface{}){
//...
}

 5、多返回值

如果调用方调用了一个具有多返回值的方法,但是却不想关心其中的某个返回值,可以简单 地用一个下划线“_”来跳过这个返回值,比如下面的代码表示调用者在读文件的时候不想关心函数返回的错误码:

_,c := read();

   6、匿名函数与闭包

匿名函数指不定义函数名的一种函数实现方式。

  a、匿名函数

在GO里面,函数可以像普通变量一样传递,跟C的回调函数比较相似,不同的是,GO语言支持在代码里定义匿名函数

func (a,b int ,z float){
  return a*b < int(z)  
}

 匿名函数可以直接赋值给一个变量或者直接执行:

f := func (a,b int){
     return a+b
}

func (ch chan char){
    return ch <- ACK
}(reply_chan)//函数后面直接跟参数列表表示函数调用

  b、闭包

匿名函数就是一个闭包。

闭包基本概念:

闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者 任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含 在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环 境(作用域)。

闭包的价值:

闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

GO语言中的闭包:

Go语言中的闭包同样也会引用到函数外的变量。闭包的实现确保只要闭包还被使用,那么被闭包引用的变量会一直存在,如下面代码所示:

package main

import (
    "fmt"   
)

func main(){
      var j int = 5
      a := func() (func()){
            var i int = 10
            return func(){
                    fmt.Printf("i , j: %d , %d
" , i , j)
            }
      }()
      a()
      j *= 2
     a()
}

  上面的执行结果是:

     i , j: 10 , 5
     i , j: 10 , 10

     在上面的例子中,变量a指向的闭包函数引用了局部变量i和j,i的值被隔离,在闭包外不 能被修改,改变j的值以后,再次调用a,发现结果是修改过的值。

     在变量a指向的闭包函数中,只有内部的匿名函数才能访问变量i,而无法通过其他途径访问到,因此保证了i的安全性。

 

 

 

  

 

 

  

 

gogo语言学习笔记三

7、数组:几乎是最常用的数据类型了。。。数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。常规的数组声明方法:[32]byte//长度为32的数组,每个... 查看详情

gogo语言学习笔记四

 流程控制1、条件语句举个栗子:ifx>5{return1;}else{return0;}注意:?条件语句不需要使用括号将条件包含起来();?无论语句体内有几条语句,花括号{}都是必须存在的;?左花括号{必须与if或者else处于同一行;?在if之后,条件语句之前,... 查看详情

gogo语言学习笔记一

a、为何学习GO语言?从个人角度来看,第一是被GO语言传说中的那样超高的开发效率和运行效率所吸引;第二是GO语言在语言层面支持并发,这在现在的编程业务中是很方便的;第三是由于前两点,我觉得以后GO会火起来;最后一... 查看详情

mongodb学习笔记五—查询

数据准备{"goods_id":1,"goods_name":"KD876","createTime":ISODate("2016-12-21T11:19:39.010Z")}{"goods_id":"4","goods_name":"诺基亚N85原装充电器","createTime":ISODate("2016-09-11T00:00:00Z")}{"goods_id":3,"goods_nam 查看详情

gogo语言环境安装(代码片段)

...工具  1、Linux(CentOS7.4版)  2、go1.11.2.linux-amd64.tarGo语言环境安装  1、下载安装包    安装包下载地址为:https://golang.org/dl/。      如果打不开可以使用这个地址:https://golang.google.cn/dl/。      2、将... 查看详情

deeplearning(深度学习)学习笔记整理系列五

DeepLearning(深度学习)学习笔记整理系列  声明:1)该DeepLearning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的。具体引用的资料请看参考文献。具体的版本声明也参考原文献。2)本文仅供学术交流... 查看详情

mybaits学习笔记(接口式编程)五

 一、在DAO层创建接口类  如:IUser.javapackagedao;importjava.util.List;importbean.User;publicinterfaceIUser{   publicList<User>queryUserList(Useruser);}二、包名及接口名作为User.xml文件的namespace  <mappernamesp 查看详情

spring学习笔记五

Bean的生命周期原文:http://997004049-qq-com.iteye.com/blog/1729793任何一个事物都有自己的生命周期,生命的开始、生命中、生命结束。大家最熟悉的应该是servlet的生命周期吧。和servlet一样spring bean也有自己的生命周期。本文讲述spring... 查看详情

吴恩达“机器学习”——学习笔记五

朴素贝叶斯算法(NaiveBayes)(续学习笔记四)两个朴素贝叶斯的变化版本x_i可以取多个值,即p(x_i|y)是符合多项式分布的,不是符合伯努利分布的。其他的与符合伯努利的情况一样。(同时也提供一种思路将连续型变量变成离散型的... 查看详情

activiti学习笔记五:流程变量

流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实... 查看详情

java学习笔记五——流程控制

分支结构  Java提供了两种常见的分支控制结构:if语句和switch语句。if语句  if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式:  第一种形式:if(5>3){System.out.println("5>3");}  第二种形式:if(5&... 查看详情

五lwip学习笔记之网际控制报文协议(icmp)

一、基础知识1、ICMP协议2、报文交付3、报文类型4、报文格式5、差错校验 二、ICMP的实现1、数据结构2、发送差错报文3、ICMP报文的处理4、ping命令5、ICMP洪水 查看详情

es6学习笔记五:promise异步任务

一:Promise对象Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。 二:创建与使用varpromise=newPromise(function(resolve,reject){//...somecodeif(/*异步操作成功*/){resolve(value)... 查看详情

hibernate学习笔记五:反向工程快速开发

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6768513.html  一:反向工程  Myeclipse提供由数据库表生成java pojo和hibernate映射文件的功能,这就是反向工程。二:由反向工程得到POJO类与映射文件  1:点击... 查看详情

学习react笔记五(useeffectuserefusecontext)(代码片段)

目录一、useEffect副作用 (1)使用useEffect(2)执行时机(第二个参数)(3)倒计时demo(4)请求ajax(5)useEffect的清理函数(6)图片移动demo(7& 查看详情

学习react笔记五(useeffectuserefusecontext)(代码片段)

目录一、useEffect副作用 (1)使用useEffect(2)执行时机(第二个参数)(3)倒计时demo(4)请求ajax(5)useEffect的清理函数(6)图片移动demo(7& 查看详情

前端乱煮之javascript学习笔记五

1window对象:所有浏览器都支持window对象,它表示浏览器窗口。所有javascript的全局对象、全局函数以及变量都自动成为window对象的成员。全局变量是window对象的属性,全局函数是window对象的方法。确定浏览器可视窗口的尺寸大小... 查看详情

codeigniter3学习笔记五(表单验证)(代码片段)

codeIgniter表单验证表单页面application/views/myform.php<html><head><title>Myform</title></head><body><?phpechovalidation_errors();?><?phpechoform_open('form 查看详情