38.笔记go语言——进阶Go有指针,但是没有指针运算。不能用指针变量遍历字符串的各个字节。因此它们更象是引用而不是你所知道的来自于C的指针。指针非常有用。Go同样也垃圾收集,也就是说无须担心内存分配和回收。Go有两个内存分配原语,new和make。它们应用于不同的类型,做不同的工作,可能有些迷惑人,但是规则很简单。用new分配内存内建函数new本质上说跟其他语言中的同名函数功
5.笔记go语言——基本类型
基本类型
Go 的基本类型有Basic types
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 代表一个Unicode码
float32 floa
6.笔记go语言——for循环
for
Go 只有一种循环结构——`for` 循环。
基本的 for 循环除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中做的一样,而 `{ }` 是必须的。
package main
import "fmt"
func main() {
sum:= 0
for i:=
39.笔记go语言——接口在Go中,保留字interface被赋予了多种不同的含义。每个类型都有接口,意味着对那个类型定义了方法集合。接口定义为一个方法的集合。方法包含实际的代码。换句话说,一个接口就是定义,而方法就是实现。因此,接收者不能定义为接口类型,这样做的话会引起invalid receiver type ... 的编译器错误。根据规则,单方法接口命名为方法名加上-er后缀:R
7.笔记go语言——if,switch,defer
if
if 语句除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中的一样,而 `{ }` 是必须的。
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
43.笔记go语言圣经——go语言特性在声明和包的设计方面,Go语言受到 Pascal、Modula 和 Oberon 系语言的影响;在并发原理的设计上,Go 语言从同样受到 Tony Hoare 的 CSP(通信序列进程 *Communicating Squential Processes*)理论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类
14.笔记go语言——细节汇总一
slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用...自动
计算长度,而声明slice时,方括号内没有任何字符。
对于slice有几个有用的内置函数:
l len 获取slice的长度
l cap 获取slice的最大容量
l append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slic
45.笔记go语言圣经——go语言变量Go 开发环境依赖于一些操作系统环境变量,在安装 Go 之间就已经设置好他们。如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go 下。这里列举几个最为重要的环境变量:l $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方。l $GOA
41.笔记go语言——通讯Go的I/O核心是接口io.Reader和io.Writer。在Go中,从文件读取(或写入)是非常容易的。io.Readerio.Reader接口对于Go语言来说非常重要。许多(如果不是全部的话)函数需要通过io.Reader读取一些数据作为输入。为了满足这个接口,只需要实现一个方法:Read(p []byte) (n int, err error)。写入
46.笔记go语言圣经——go运行时Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。runt
9.笔记go语言——方法和接口
方法
Go 没有类。然而,仍然可以在结构体类型上定义方法。
方法接收者 出现在 func 关键字和方法名之间的参数中。
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Yfloat64
}
func (v
42.笔记go语言圣经——go起源Go 语言起源 2007年,并于 2009 年正式对外发布。该项目的三位领导者均是著名的 IT工程师:RobertGriesemer,参与开发 JavaHotSpot虚拟机;Rob Pike,Go语言项目总负责人,贝尔实验室 Unix团队成员,参与的项目包括 Plan 9,Inferno操作系统和 Limbo编程语言;Ken
13.笔记go语言——并发调度器
go支持创建成千上万并发任务.
l 线程多路复用。
l 极小自定义初始栈。
l 任务在多个线程间切换。
三种抽象模型协作
如下图1:
系统限制,允许调整:
如下图2:
创建新并发任务。
如下图3:
创建系统线程执行任务。
如下图4
执行
如图5:
连续栈替代分段栈
如下图6:
10.笔记go语言——并发
goroutine
goroutine 是由 Go 运行时环境管理的轻量级线程。
go f(x, y, z)
开启一个新的 goroutine 执行
f(x, y, z)
f , x , y 和 z 是当前 goroutine中定义的,但是在新的 goroutine 中运行 `f`。
goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步
52.蛤蟆笔记go语言——defer使用场景1. 简化资源的回收 比如:mu.Lock()defer mu.Unlock()当然, defer 也有一定的开销, 也有为了节省性能而回避使用的 defer 的.从简化资源的释放角度看, defer 类似一个语法糖, 好像不是必须的.2. panic异常的捕获defer 除了用于简化资源的释放外,还是Go语言异常框架的一
32.笔记go语言——range关键字保留字range可用于循环。它可以在slice、array、string、map和channel.range是个迭代器,当被调用的时候,从它循环的内容中返回一个键值对。基于不同的内容,range返回不同的东西。当对slice或者array做循环时,range返回序号作为键,这个序号对应的内容作为值。示例:package main i
50.笔记go语言——go语言函数细节l Go 里面函数重载是不被允许的Go 语言不支持这项特性的主要原因是函数重载需要进行多余的类型匹配影响性能;没有重载意味着只是一个简单的函数调度。所以你需要给不同的函数使用不同的名字,我们通常会根据函数的特征对函数进行命名l Go 没有泛型(generic)的概念不支持那种支持多种类型的函数。不过在大部分情况下可以通过接口(interfa
48.笔记go语言圣经——go图形化 GO没有原生的界面库,所以不能直接用来写GUI界面。互联网上已经涌现出不少成熟、好用的第三方界面库。使用它们,就同样可以写出同C#、C++的界面。而且效率还更胜一筹。关于WalkWalk是WindowsApplication Library Kit。在Go 1.1.x 或后续版本后支持。安装:goget github.com/lxn/wal
44.笔记go语言圣经——go平台与架构Go 语言开发团队开发了适用于以下操作系统的编译器:l Linuxl FreeBSDl Mac OS X(也称为 Darwin)目前有2个版本的编译器:Go原生编译器 gc 和非原生编译器 gccgo,这两款编译器都是在类 Unix系统下工作。其中,gc版本的编译器已经被移植到 Windows平台上,并集成在主要
51.蛤蟆笔记go语言——go语言数据结构主要学习go语言中的基本类型,结构,arrays和slices结构和指针 [5]byte表示有5个字节,类似C的阵列。定义:type Point struct { X, Y int }表示定义一个简单的结构类型叫做Point,包含2个内存中连接的值。如下图1其中Point{10,20}表示一个初始化Point,&Po
53.蛤蟆笔记go语言——defer,panic,recover使用场景deferdefer 调用的函数将被暂时保存到调用列表中. 保存的调用列表在当前环境返回的时候被执行. Defer 一般可以用于简化代码, 执行各种清理操作.Defer语句的行为简单且可预测. 有三个基本原则:1. 当defer调用函数的时候, 函数用到的每个参数和变量的值也会被计算2.Defer调用的函数
54.蛤蟆笔记go语言——interface使用1 Go语言中使用interface是比较困难的。使用基本比较简单,但是设计自己的interface就比较困难了。所以如何高效使用interface很有必要。什么是interface 一个interface包含两个东西:一组方法(也是类型),或类型。 例如一个animal 类
很多人喜欢GO语言的原因是简单。Go语言的类型也是设计的如此简单。预定义类型 Go语言默认定义了一些类型如boolean,numeric和string.这些预定义的类型用于构建其他复杂的类型,例如array,struct,pointer,slice,map,channel等。命名和未命名 类型可以有一个名字也可以没
56.笔记go语言——go的函数类型 对于动态脚本语言Ruby,JavaScript,Python都有higher-order函数。但是很难直接转换成G知识,虽然GO看上去是同样方式获取。另一方面,之前从事静态语言特别是面向对象语言例如C++,JAVA的,那么问题是使用higher-order函数很少。 很难直接从之前编程
57.笔记go语言——闭包闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。示例代码如下:packagemain import"fmt" funcExFunc(nint)func(){ sum:=n a:=func(){//把匿名函数作为值赋给变量a(Go不允许函数嵌套。 //然而你可以利用匿名函数实现函数嵌
58.笔记go语言——函数式编程使用函数式编程使代码更抽象和更容易理解先看个例子如下:packagemain import( "fmt") typeStudentstruct{ Name string Age int Heightint} funcmain(){ Students:=[]*S
60.笔记go语言——Go语言的传参和传引用go 参数传递:函数参数全部是传值:即使传递的是指针,传递的也是指针的拷贝;闭包引用外部变量是引用Go语言的函数调用参数全部是传值的, 包括 slice/map/chan 在内所有类型, 没有传引用的说法.slice不是传引用代码如下:packagemain import( "fmt") funcmain
59.笔记go语言——go语言中的反射每个语言都有反射,Go语言也是。Go语言是静态类型,所有数据的类型在编译器都是明确的反射例子一代码如下:packagemain import( "fmt" "reflect") funcmain(){ varxfloat64=3.4 fmt.Println("type:",refl
61.笔记go语言——Go语言的nil值和nilNil在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。接口是什么?golang语言的接口有其独到之处:只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做StructuralTy