GO 笔记FROM go语言编程

    xiaoxiao2023-03-24  4

     

    GO 笔记DJM

    概述

       Go语言是从C语言演化而来, 类似于面向对象的过程语言。介意C 和C++之间,还有点javascript特征.

    相关下载

    go语言编程 相关测试代码

    http://download.csdn.net/detail/princecnbj/9641660

    go语言编程   PDF

    http://download.csdn.net/detail/princecnbj/9641658

    go语言编程(丁建民注)

    http://download.csdn.net/detail/princecnbj/9641659

    go环境安装文档 

    http://download.csdn.net/detail/princecnbj/9641662

     

    Helloworld

    package main  

     

    import "fmt"// 我们需要使用 fmt 包中的 Println()函数 

     

    func main() {     

       fmt.Println("Hello, world.  你好,世界! ") 

    }

    环境

    附助工具

    Gow-0.8.0.exe      Windows 下的Shell命令

    Liteide   go IDE 开发环境

          LiteIde 配置  参考

         搭建Go开发及调试环境(LiteIDE + GoClipse) --Windows篇

        http://www.cnblogs.com/custa/p/3913526.html

     

    软件包

    go1.7.1.windows-amd64.msi

    https://storage.googleapis.com/golang/go1.7.1.windows-amd64.msi

    go1.7.1.linux-amd64.tar.gz

     https://storage.googleapis.com/golang/go1.7.1.linux-amd64.tar.gz

     

    运行

     行go run print.go 运行go程序

      go buildprint.go  把go程序编译成exe文件

    配置环境变量

    (1). 新建 变量名:GOBIN 变量值 :c:\go\bin

    (2). 新建 变量名:GOARCH 变量值:386

    (3). 新建 变量名:GOOS 变量值:windows

    (4). 新建 变量名: GOROOT 变量值:c:\go

    (5). 编辑 Path 在Path的变量值的最后加上 %GOBIN%

     

    如果是msi安装文件,Go语言的环境变量会自动设置好。

     

    访问Go安装包中的文档

    打开Windows中的命令提示符(cmd.exe)执行命令: godoc -http=:6060

    可以访问:  http://localhost:6060/doc/install.html

     

     

    语言特性

    注意事项

     

    1.    不得包含在源代码文件中没有用到的包,否则Go编译器会报编译错误。

    2.    有Go函数(包括在对象编程中会提到的类型成员函数)以关键字func 开头。一个常规的函数定义包含以下部分: 

    func  函数名 (参数列表 )( 返回值列表 ) { 

      //  函数体 

    Go支持多个返回值。

     

    对应的一个实例如下: func Compute(value1 int, value2float64)(result float64, err error) {

      //  函数体 

    }

     

    3.    代码注释与C++保持一致/*  块注释   */  //  行注释 

    4.    Go程序并不要求开发者在每个语句后面加上分号表示语句结束

    5.    Go语言的 main() 函数不能带参数,也不能定义返回值。命令行传入的参数在 os.Args 变量中保存。如果需要支持命令行开关,可使用flag 包。在本书后面我们将解释如何使用 flag 包来做命令行参数规范的定义,以及获取和解析命令行参数。

    6.    中数组是一个值类型(valuetype)。所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作

    7.    type Integer int    和C语言相反的定义 integer 为新类型  int 是原类型

    不支持重载

        Go语言也放弃了构造函数(constructor)和析构函数(destructor)

     

     

    非侵入性接口(interface)

     内置  字典类型( map )

     

    的数据类型:数组切片( Slice )类似vector

    提供了多返回值  

    func getName()(firstName, middleName, lastName, nickNamestring){

        return"May", "M", "Chen", "Babe"

    }

    关键字

     

    defer      无论函数什么时候,什么情况退出 都要执行defer定义的语句

    defer srcFile.Close()

     

    defer func() {  

        //  做你复杂的清理工作 

    } () 

     

    defer  panic 和 recover

       参考文档Go的异常处理 defer, panic, recover

                                        http://blog.csdn.net/wuwenxiang91322/article/details/9042503

     

    goroutine

    通过在函数调用前使用关键字 go ,我们即可让该函数以goroutine方式执行。goroutine是一种

    比线程更加轻盈、更省资源的协程。

     

     

    反射(reflection)

    最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)

    ,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量

    依赖于反射功能来实现。

    例子 

     

    语法

    变量声明

    var v1 int

    var v2 string

    var v3 [10]int     //  数组 

    var v4 []int      //  数组切片 

    var v5 struct {

        f int

    }

    数组切片

    流程控制

     条件语句,对应的关键字为 if 、else 和 else if ;

     选择语句,对应的关键字为 switch 、 case 和 select (将在介绍channel的时候细说);

     循环语句,对应的关键字为 for 和range ;

     跳转语句,对应的关键字为 goto 。

    ,Go语言还添加了如下关键字:break 、continue 和 fallthrough 。

     

    条件语句

    关于条件语句的样例代码如下:

     

    if a < 5 {

        return 0

    } else {

        return 1

    关于条件语句,需要注意以下几点:

     条件语句不需要使用括号将条件包含起来 () ;

     无论语句体内有几条语句,花括号 {} 都是必须存在的;

     左花括号 { 必须与if 或者 else 处于同一行;

     在 if 之后,条件语句之前,可以添加变量初始化语句,使用; 间隔;

     在有返回值的函数中,不允许将“最终的”return 语句包含在 if...else... 结构中,

    否则会编译失败:

    function ends without a return statement 。 

    失败的原因在于,Go编译器无法找到终止该函数的return 语句。编译失败的案例如下:

    func example(x int) int {

        if x == 0 {

            return 5

        } else {

            return x

        }

    }

    关键字

     Coroutine   协程    go <函数>

    goroutine是Go语言中的轻量级线程实现,由Go运行时(runtime)管理。

    在一个函数调用前加上 go 关键字,这次调用就会在一个新的goroutine中并发执行。当被调用的函数返回时,这个goroutine也自动结束了。需要注意的是,如果这个函数有返回值,那么这个返回值会被丢弃。

    程序退出,且程序并不等待其他goroutine(非主goroutine)结束。

    goroutine可创建的个数不受系统资源的限制,原则上一台服务器可以创建上百万个

    goroutine,

     

      Channel   通道 用于协程之间通信

    channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或

    多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。

    一般channel的声明形式为:

    var chanName chan ElementType

    与一般的变量声明不同的地方仅仅是在类型之前加了 chan 关键字。 ElementType 指定这个

    channel所能传递的元素类型。举个例子,我们声明一个传递类型为int 的channel:

    var ch chan int

     

    绍如何给channel带上缓冲 

    要创建一个带缓冲的channel,其实也非常容易:

    c := make(chan int, 1024)

    使用 range 关键来实现更为简便的循环读取:

    for i := range c {

       fmt.Println("Received:", i)

    }

    select 

    select 实现超时机制

    Go语言没有提供直接的超时处理机制,但我们可以利用 select 机制。

     

    //  首先,我们实现并执行一个匿名的超时等待函数 

    timeout := make(chan bool, 1)

    go func() {

        time.Sleep(1e9)//  等待1秒钟 

        timeout <- true

    }()

     

    //  然后我们把timeout 这个channel利用起来 

    select {

      case <-ch:

        //  从 ch 中读取到数据 

      case <-timeout:

        //  一直没有从 ch 中读取到数据,但从 timeout 中读取到了数据 

    channel可被传递的特性来实现我们的管道。

    type PipeData struct {

        value int

        handler func(int)int

        next chan int

    }

    type PipeData struct {

        value int

        handler func(int)int

        next chan int

    }

     

     

     

     

     

    函数

    函数的基本组成为:关键字 func 、函数名、参数列表、返回值、函数体和返回语句。

    因此需要先牢记这样的规则:小写字母开头的函数只在本包内可见,大写字母开头的函数才

    能被其他包使用。

    这个规则也适用于类型和变量的可见性。

    panic()

     

    当在一个函数执行过程中调用 panic() 函数时,正常的函数执行流程将立即终止,但函数中

    之前使用 defer 关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致

    逐层向上执行 panic 流程,直至所属的goroutine中所有正在执行的函数被终止。

    recover() 

       recover() 函数用于终止错误处理流程。

     

     

    软件包

    import "fmt"// 

     

    fmt.Println("The value of fval is", fval)

    fmt.Printf("fval=%f, ival=%d, sval=%s\n", fval,ival, sval)

    fmt.Printf("fval=%v, ival=%v, sval=%v\n", fval,ival, sval)

    math/cmplx

    复数

     

    import "flag"

       快速日解析析命令行参数

    import"time"

       获取时间

    strings   

    字符串操作

    Unicode

    Rune

    Runtime

    Runtime.NumCPU()

    runtime.GOMAXPROCS(16)

    sync.

     sync.Mutex

    sync.RWMutex

    syn.Once

    sync. Atomic

    import "net"

    func Dial(net, addr string) (Conn, error)

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1202055.html
    最新回复(0)