设为首页 加入收藏

TOP

Go语言学习笔记(二)十分钟上手(三)
2017-09-30 13:26:58 】 浏览:9618
Tags:语言学习 笔记 十分钟 上手
) time.Sleep(time.Second) } }
select栗子一
package main

import (
    "fmt"
    "time"
)

/*
channel超时处理
一直没有从ch中读取到数据,但从timeout中读取到了数据
*/

func main() {
    ch := make(chan bool)
    timeout := make(chan bool, 1)

    go func() {
        time.Sleep(time.Second*2)
        timeout <- true
    }()

    select {
    case <- ch:
        fmt.Println("This is ch.")
    case <- timeout:
        fmt.Println("This is timeout.")
    }
}
select栗子二(channel超时处理)

 

函数

Go 语言最少有个 main() 函数。

函数声明告诉了编译器函数的名称,返回类型,和参数。

不支持重载,一个包不能有两个名字一样的函数。

func function_name( [parameter list] ) [return_types] {
   函数体
}

 

命名返回值的名字(return可以不指定变量):

func add(a, b int) (c int) {
        c = a + b
        return?
}
栗子一
func calc(a, b int) (sum int, avg int) {
        sum = a + b
        avg = (a +b)/2
        return?
}
栗子二

 

_标识符,用来忽略返回值:

func calc(a, b int) (sum int, avg int) {
        sum = a + b
        avg = (a +b)/2
        return?}
func main() {
      sum, _ := calc(100, 200)
}
栗子

 

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

package main

import "fmt"

//申明一个函数类型
type add_func func(int, int) int

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

func operator(op add_func, a int, b int) int {
    return op(a, b)
}

func main() {
    c := add
    fmt.Println(c)    //0x1087050
    sum := operator(c, 1, 2)
    fmt.Println(sum)    //300
}

 

可变参数

其中arg是一个slice,我们可以通过arg[index]依次访问所有参数;通过len(arg)来判断传递参数的个数。

0个或多个参数
func add(arg…int) int {
}
1个或多个参数
func add(a int, arg…int) int {
}
2个或多个参数
func add(a int, b int, arg…int) int {
}
package main

import (
    "fmt"
)

//返回值指定为sum变量,默认会return这个变量
func add(a int, b int, arg ...int) (sum int) {
    sum = a + b
    for i := 0; i < len(arg); i++ {
        sum += arg[i]
    }
    return
}

func concat(s string, arg ...string) string {
    str := s
    for i := 0; i < len(arg); i++ {
        str += arg[i]
    }
    return str
}

func main() {
    sum := add(1, 2, 3, 4, 5, 6, 7)
    fmt.Println(sum)    //28
    str := concat("nick", " ", "and", " ", "dawn", ".")
    fmt.Println(str)    //nick and dawn.
}
多参数栗子

 

main & init & defer

main & init

init() 方法是在任何package中都可以出现;
main() 方法只能用在package main 中。
Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。
每个package中的init函数都是可选的,但package main就必须包含一个main函数。
main()函数不能带参数,也不能定义返回值。命令行传入的参数在os.Args变量中保存。如果需要支持命令行开关,可使用flag包。 
 

defer

  1. 当函数返回时,执行defer语句;
  2. 多个defer语句,按先进后出的方式执行;
  3. defer语句中的变量,在defer声明时确定变量
  4. 触发异常也会走defer语句。
package main

import "fmt"

//声明defer时,变量i就为0
func test1()  {
    i := 0
    defer fmt.Println(i)
    i++
    return
}

//栈,先进先出
func test2()  {
    for i := 0; i < 5; i++ {
        defer fmt.Printf("->%d", i)
    }
}

func main() {
    test1()
    test2()
}


输出:
0
->4->3->2->1->0
defer 栗子
package main

import (
    "fmt"
)

func main() {
    defer_call()
}

func defer_call() {
    defer func() { fmt.Println("打印前") }()
    defer func() { fmt.Println("打印中") }()
    defer func() { fmt.Println("打印后") }()

    panic("触发异常")
}

/*
打印后
打印中
打印前
panic: 触发异常
*/
defer 栗子二
 

作用域

  1. 在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部。
  2. 在函数外部声明的变量叫做全局变量,生命周期作用于整个包,如果是大写的,则作用于整个程序。
package main

import "fmt"
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go语言学习笔记(一)Let's .. 下一篇Go语言学习笔记(三)数组 & 切片..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目