您的位置:首页 > 编程语言 > Go语言

GO 笔记 FROM go语言编程

2016-09-27 23:27 316 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: