`
david_je
  • 浏览: 373126 次
  • 性别: 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  

相关推荐

    C语言中文网Go语言教程

    2. 编译型语言:Go 语言使用编译器来编译代码,编译器将源代码编译成二进制(或字节码)格式。 3. 并发型语言:Go 语言提供了强大的并发编程支持,可以轻松地编写高性能的并发程序。 4. 垃圾回收:Go 语言提供了自动...

    GO 语言学习辅导共220页.pdf

    Go语言,又称为Golang,是由Google开发的一种静态类型的、编译型的、并发型且垃圾回收的编程语言。它设计简洁、效率高,特别适合于编写服务器端和网络应用。Go语言的语法接近C语言,但同时也引入了诸如goroutine(轻...

    go语言圣经 .pdf

    Go语言,又称为Golang,是由Google公司推出的编程语言。其主要开发者包括肯·汤姆逊(Ken Thompson)、罗布·派克(Rob Pike)和罗伯特·格里泽默(Robert Griesemer)三位业界知名的大师级人物。以下是这三位开发者的简要...

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

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

    Go语言技术参考手册 中文PDF版

    ### Go语言技术参考手册知识点概览 #### 一、Go语言概述 - **起源与发展**: - **起源**:Go语言由Google公司的Robert Griesemer、Rob Pike及Ken Thompson三位计算机科学家共同设计,旨在解决现代软件开发中的...

    Go语言四十二章经.7z

    Go语言,也称为Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它设计的目标是提高开发效率,简化并发处理,并提供高效的工具链。 1. **Go语言的特点**: - **简洁的语法**...

    Go-基于GO语言和Saltstack开发的WEB运维平台

    - **编译速度和可移植性**:Go语言的编译速度快,且编译出的二进制文件跨平台兼容性好,方便在不同的操作系统上部署。 2. **Saltstack在运维中的作用** - **远程执行和状态管理**:Saltstack允许通过Master节点向...

    golang基础教程-go语言快速入门.zip

    Go语言,又称Golang,是Google在2009年推出的一种开源编程语言,由罗伯特·格瑞史莫、罗布·派克和肯特·贝克等大神设计。Go语言的设计目标是简单、高效、安全,特别适合构建网络服务和并发程序。它吸收了C语言的...

    Go 语言四十二章经

    Go 语言四十二章经

    Go语言最佳入门手册

    对于不同的操作系统,Go语言提供了相应的二进制文件供用户下载。 **2.2 Go环境变量** 为了正确配置Go开发环境,需要设置一些环境变量,例如`GOROOT`(指定Go语言的安装路径)、`GOPATH`(指定项目的工作目录)等。...

    go语言入门教程,新手必备

    #### 二、Go语言在谷歌的应用与推广 - **内部支持与应用**:Google不仅组建了一个专门的团队负责Go语言的开发工作,还在内部服务中大力推广Go语言的使用,尤其是在其战略产品Google App Engine(GAE)上提供了支持...

    Go web语言学习(Golang)

    知识点二:Go语言的应用场景 Go语言非常适合用于编写高性能的网络服务,如HTTP服务器、数据库、分布式系统等。由于其内存占用小、启动速度快和并发性能优异,Golang在构建Web应用、微服务架构、云基础设施、自动化...

    Go语言介绍_ppt

    #### 二、Go语言的历史沿革 Go语言的发展可以追溯到1995年的贝尔实验室,当时推出了Plan9系统,随后又发展了Inferno系统及其Limbo语言。2007年,Google的员工开始利用20%的时间研究Go语言,并在2008年将其转为全职...

    Go语言开发手册

    ### Go语言开发手册知识点概述 #### 一、Go语言简介 **Go语言**是由Google公司设计并开源的一种静态强类型编程语言,旨在提高程序的可靠性和效率。它结合了多种现代编程语言的优点,如简洁性、高效性以及易用性等...

    手撕Go语言v1.1.pdf

    Go语言(又称Golang)是一种静态类型的编程语言,由Google工程师Robert Griesemer、Rob Pike及Ken Thompson在2007年开始设计并开发,于2009年正式发布。它被设计成一种简洁、高效且易于学习的语言,旨在解决现代软件...

    Go 语言学习代码示例v2

    Go语言,又称Golang,是由Google推出的一种静态类型、编译型语言,具有简洁、快速、安全等特点,特别适合用于开发网络服务和并发程序。Go语言的设计兼顾了开发效率和系统性能,它是面向并发的编程语言,提供了轻量级...

Global site tag (gtag.js) - Google Analytics