`
david_je
  • 浏览: 368736 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Go语言(二)

    博客分类:
  • go
 
阅读更多

            指针

            Go也有指针

·         

p := 2
pInt := &p //定义一个指针变量,赋值为变量p的地址,编译器可以自动识别
fmt.Printf("p=%d\tpInt=%p\n",p,pInt)
*pInt = 123445
fmt.Printf("p=%d\tpInt=%p\n",p,pInt)

输出
p=2     pInt=0x12060140
p=123445        pInt=0x12060140

   

    函数在前面说过了,这里说一下函数的调用

    不定参数

   

不定参数是指函数传入的参数个数为不定数量
首先需要将函数定义成接受不定参数类型
func myFunc(args ...int){
    for _,arg:= range args{
         fmt.Println(arg)
    }
}

或者为
func myFunc(args []int){
       ...........
}

如果想不限定传递参数的类型,可以指定interface{}
如Go语言标准库中的fmt.Printf()函数
func Printf(format string,args ...interface{}){
     //....
}

  

 

    函数返回多个值

    Go语言也提供了像Python一样返回多个值语法,一般来说Go中很多package都返回两个值,一个是正常期望返回的值,一个是错误error.

    

比如File.Read()函数可以同时返回读取的字节数和错误信息
func (file *File)Read(b []byte)(n int,err Error)

 

     匿名函数

     匿名函数指的是不需要定义函数名的一种函数实现方式

     

f := func (a,b int,z float64) bool{
    return a*b < int(z)
}
可以赋给一个变量或者直接执行

   

    闭包

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

    

package main

import "fmt"

func main(){
   var j int = 5
   a := func()(func()){
         var i int = 10
         return func(){
              fmt.Println("i, j: %d\n",i ,j)
         }
   }()

   a()
   j*=2
   a()
}

输出
i, j: 10,5
i, j: 10,10

 

 

    错误处理

    Go中引入了一个错误处理的标准模式,error接口

    

type error interface{
    Error() string
}

 

    在Go中大多函数,如果要返回错误,大致上都可以定义为如下模式,将error作为多种返回值中的最后一个,当然这个并非是强制要求(怎么看都有点javascript的感觉,哈哈)。

     

func myFunc(param string)(str string,err error){
    //...
}

调用时的代码
n, err := myFunc("")
if err := nil {
   //...
}else{
  //...
}

那如何应用到实际中呢?

在Go中,接口的实现,根本不需要明确类型和接口之间的关系

type myError struct{
     msg string
}

要想让编译器知道myError可以当做一个error来处理,这个时候就要去实现Error()方法了

func (e *myError)Error()string{
     return e.msg
}

例子
func myFunc(name string)(string,error){
    if len(name)<10 {
         return name+" is right",nil
    }else{
         return name+" is not right",&myError("incorrect!")
    }
}

 

 

   defer

   defer的出现简直就是C/C++程序员的福音,在程序中,特别是在调用一个资源的时候,比如数据库连接,但是程序出现异常的地方可能有很多,每一个可能的地方都有一个return的位置,该关闭的可能就没有来得及关闭,使用defer就可以很轻松解决这个问题,而且增加代码的可读性和优雅性。

    

    

func CopyFile(dst,src string)(w int64, err error){
    srcFile, err := os.Open(src)
    if err != nil{
        return
    }
    defer srcFile.CLose()
    }

    dstFile,err := os.Create(dst)
    if err != nil {
       return
    }

    defer dstFile.Close()

    return io.COpy(dstFile,srcFile)

}
即使其中Copy()函数抛出异常,Go仍然会保证dstFile和srcFile被正常关闭。
一个函数里面可以有多个defer,他们按照栈的方式执行,先进后出

 

    panic()和recover()

    Go语言引入了两个内置函数panic()和recover()以报告和处理运行时错误和程序中的错误场景。

    func panic(interface())

    func recover(interface())

    当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数终止之前使用defer关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致逐层向上执行panic流程,直至所属的goroutine中所有正在执行的函数终止,错误信息将被上报,包括panic()函数传入的参数。

    recover()函数用于终止错误处理流程。一般情况下,recover()应该在一个使用defer关键字的函数中执行有效的截取错处理流程。如果没有在发生异常的goroutine中明确调用恢复过程(使用recover()关键字),会导致该goroutine所属的进程打印异常信息后直接退出。

   

 defer func(){
           if r := recover(); r !=nil {
                     log.Printf("Runtime error caught: %v", r)
           }
     }()

 

 

 

分享到:
评论
1 楼 david_je 2013-05-06  

相关推荐

    Go语言15套教程(百度网盘)

    01 Go语言基础(一)02 Go语言基础(二)03 GO名库讲解 04 Go语言实战开发一个WEB项目博客系统05 Go语言深度讲解(推荐 2018年1月更新)06 Go语言快速入门(2018年2月更新)07 Go语言协程流量统计(2018年3月更新)08...

    Go 语言四十二章经

    Go 语言四十二章经

    go语言圣经 .pdf

    二、开发Go语言的初衷  根据Go语言开发者自述,近10多年,从单机时代的C语言到现在互联网时代的Java,都没有令人满意的开发语言,而 C++往往给人的感觉是,花了100%的经历,却只有60%的开发效率,产出比太低,Java...

    Go语言程序设计中文版[人民邮电大学出版]

    8.1.4 处理Go语言二进制文件 307 8.1.5 处理自定义的二进制文件 309 8.2 归档文件 317 8.2.1 创建zip归档文件 317 8.2.2 创建可压缩的tar包 319 8.2.3 解开zip归档文件 321 8.2.4 解开tar归档文件 322...

    GO编程实战第二版

    Go语言(或称Golang)是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率,Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持...

    Go语言程序设计

    Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。 Go语言专门...

    Go语言实战

    Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。

    Go 语言程序设计

    8.1.4 处理Go语言二进制文件 307 8.1.5 处理自定义的二进制文件 309 8.2 归档文件 317 8.2.1 创建zip归档文件 317 8.2.2 创建可压缩的tar包 319 8.2.3 解开zip归档文件 321 8.2.4 解开tar归档文件 322...

    Go语言四十二章经.7z

    Go语言四十二章经.pdf Go非常适合用来进行服务器编程,网络编程,包括Web应用、API应用,分布式编程等等。

    Go语言,也被称为Golang,是由Google设计和开发的一种编程语言

    编译与执行: Go语言是编译型语言,编译后的二进制文件可以在各种操作系统和硬件上运行。 性能: Go语言的性能非常出色,它的执行速度与C和C++相当,而且具有更高的可靠性和可读性。 并发原语: Go语言内建了并发...

    安卓版go语言编程指南

    Go语言是谷歌2009发布的第二款开源编程语言,本应用为Go语言入门级编程指南。

    Go-Go语言四十二章经

    写《Go语言四十二章经》,纯粹是因为开发过程中碰到过的一些问题,踩到过的一些坑,感觉在Go语言学习使用过程中,有必要深刻理解这门语言的核心思维、清晰掌握语言的细节规范以及反复琢磨标准包代码设计模式,于是才...

    GO语言基础学习文档

    一、 GO语言环境搭建 2 二、 Go 命令 2 go build 3 go clean 4 go fmt 4 go get 4 go install 4 go test 4 go doc(godoc) 5 三、 Go基础 5 关键字 5 定义变量 5 常量 6 内置基础类型 6  Boolean 6  数值类型 6 ...

    Go高级编程.pdf

    Go语言学习手册,有助于学习Go语言,提升Go语言的开发水平

    Go语言四十二章经

    在Go语言学习使用过程中,有必要深刻理解这门语言的核心思维、清晰掌握语言的细节规范以及反复琢磨标准包代码设计模式。

    GO语言开发2048小游戏

    GO语言开发2048小游戏

    go语言编程

    Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。

Global site tag (gtag.js) - Google Analytics