GO 笔记 FROM go语言编程

来源:互联网 发布:儒尼尼奥任意球数据 编辑:程序博客网 时间:2024/04/25 20:36

 

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)

 

 



0 0
原创粉丝点击