Go语言基础:函数

原创 2016年08月31日 16:02:44

函数是程序的核心部分,所有的程序都是由一个一个的函数组成的。

函数声明几种格式

func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
//这里是处理逻辑代码
//返回多个值
return value1, value2
}
func funcName(input1 type1, input2 type2)(type1, type2) {
//这里是处理逻辑代码
return value1, value2
}
func funcName(input1 type1, input2 type2)type1 {
//这里是处理逻辑代码
return value1
}
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
//这里是处理逻辑代码
output1 = value1
output2 = value2
return
}

从上面可以看出:

  • Go中用关键词func来声明一个函数 funcName
  • 函数可以有多个返回值,这点跟C、JAVA等很不一样
  • 返回值变量你可以声明,也可以不声明,直接就两个类型
  • 当只有一个返回值时,声明中可以省略括号
  • 直接在函数里初始化,返回值不带任何参数,直接return返回

变参的格式

func myfunc(arg...int) {
}

arg…int告诉Go这个函数接受不定数量的参数。在函数体中,变量arg是一个int的slice。

package main

import "fmt"

func myfunc(arg ...int32) {

    fmt.Print(arg)
    for _, n := range arg {
        fmt.Printf(" %d", n)
    }
}

func main() {
    myfunc(1, 2, 3, 4)
}

输出:

[1 2 3 4] 1 2 3 4

延迟defer

defer在声明时不会立即执行,而是在函数return前,按照先进先出的原则依次执行每一个defer语句,然后再return。类似于面向对象的析构函数。
具体的机制参考:Go语言的defer,你真的懂了吗?

main函数和init函数

Go 里面有两个保留的函数: init 函数(能够应用于所有的 package )和 main 函数(只能应用于 package main )。

  • 两个函数定义时不能有任何参数和返回值
  • 建议在每一个package中每个文件只写一个init函数。尽管可以拥有多个init函数
  • init函数不能被其他函数调用,而是main函数执行前,自动调用
  • 对同一个go文件的init()调用顺序是从上到下的
  • 对同一个package中不同文件按提交给编译器的源文件名顺序来调用init函数
  • 对于对不同的package,如果不相互依赖的话,按照main包中”先import的后调用”的顺序调用其包中的init();如果package存在依赖,则先调用最早被依赖的package中的init();最后调用main函数

main 函数引入包初始化流程图

程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到 fmt 包,但它只会被导入一次,因为没有必要导入多次)。 当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行 init 函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对 main 包中的包级常量和变量进行初始化,然后执行 main 包中的init 函数(如果存在的话),最后执行 main 函数。具体的执行流程如下图:
这里写图片描述

import

点操作

import(
    ."fmt"
)

这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的 fmt.Println(“hello world”)可以省略的写成 Println(“hello world”)

别名操作

import (
    f "fmt"
)

别名操作的话调用包函数时前缀变成了我们的前缀,即 f.Println(“hello world”)

_操作

import (
    "database/sql"
    _ "github.com/ziutek/mymysql/godrv"
)

_ 操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数。_ 操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数。

http://blog.csdn.net/htyu_0203_39/article/details/50948193

版权声明:本文为博主原创文章,转载请注明转载地址。

GO语言零基础入门资料整理

GO语言跟它名字一样是门比较装逼的语言,鲜有菜鸟初学者教程,所以没有语言基础的话,理解起来会有点困难。闲来没事整理了一个GO零基础入门资料。 安装与简介 因为国内老被墙,被墙之后请在网上直接下...
  • weiyuefei
  • weiyuefei
  • 2015年11月19日 23:32
  • 4054

从例子中学习 go 语言 —— 基本语法

go 语言或是 golang 官网上有个 tour。从例子中学习一门语言虽然具有片面性,但是往往是一个入门的好方法;如果一开始就去是看手册的话,有些凌乱,摸不着头脑,有点看字典的味道。所以,先从例子中...
  • wuwenxiang91322
  • wuwenxiang91322
  • 2013年06月03日 13:19
  • 8344

Go语言基础:method

我们在C语言中,struct中声明函数,而Go中则不能再struct中声明函数。而是采用另外一种形态存在,Go中叫method。method的概念method是附属在一个给定的类型上,语法和函数的声明...
  • uudou
  • uudou
  • 2016年09月02日 15:47
  • 1227

go语言自带标准库函数解析示例

  • 2017年12月19日 12:52
  • 1.12MB
  • 下载

Go语言基础文档

  • 2017年12月03日 18:19
  • 9.91MB
  • 下载

GO语言基础学习文档

  • 2014年01月08日 10:22
  • 287KB
  • 下载

GO語言WEB編程基礎教程

  • 2013年08月26日 15:04
  • 5.79MB
  • 下载

GO語言基礎教程:Hello world!

首先簡單地說一下GO語言的環境安裝,從 http://golang.org/dl/ 針對自己的操作系統選擇合適的安裝包,然後下載安裝即可,下載的時候注意別選錯了的操作系統,例如go1.3.1.darw...
  • sibang
  • sibang
  • 2014年08月21日 16:57
  • 763

Go语言2-基础类型及使用

基础类型及使用
  • zjl103
  • zjl103
  • 2015年06月01日 22:29
  • 886

Go语言基础学习七-指针与切片操作

Go语言基础学习七-指针与切片操作     一.值,指针和引用类型         与C和C++不同 Go语言中的数组是按值传递的,所以传递一个大数组的代价特别大,幸运的是,在Go语言中不常用数组,因...
  • qq_21898173
  • qq_21898173
  • 2017年03月31日 10:49
  • 601
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Go语言基础:函数
举报原因:
原因补充:

(最多只允许输入30个字)