Go语言学习笔记

最近零星地看了些go语言的语法,起初看的是《Go语言编程》,不推荐,结构不清晰,讲述的很粗糙且口语化。后来看了《Go语言实战》,比七牛云那本读起来舒服很多,尤其对我这种入门级选手而言。还有一本《Go程序设计语言》在路上,期待能带来更详实的解读。

以下是学习总结的简单笔记,仅供自己入门回顾。

Go是静态编译型语言,静态是指编译时就可确定变量类型,编译型是相对于脚本语言的解释器而言。

开发工具

go CLI

变量

变量的声明:var a int,多个同类型的变量声明var a, b int。GO语言中声明时类型在变量名之后。声明后的变量为零值。 变量的赋值:value := 10var value int = 10var value = 10,编译器会进行类型推导 常量:const a = 9,常量的赋值是编译期行为。

类型

以下为基础类型,尤其要注意字符串和错误类型都是内置的基础类型。

复合类型

和Java很明显的不同之一是,在GO中,string为基础类型,且map属于内置类型,无需标准库的引入。另外,Go是支持指针的,这点很重要,因为很多设计上都是传拷贝。

引用类型(vs值类型):

流程控制

函数

struct结构类型

新类型的定义:

type Person struct {
	name string
	sex bool
}

新类型的初始化:p := new(Person)p := Person{'wanghan', false}

方法

方法的定义,需要在函数的func关键字和函数名之间,加入接收者

func (p Person) changeName(name) {
	p.name = name
}

接收者有值接收者指针接收者两种类型。上面例子为值接收者,下面例子为指针接收者:

func (p *Person) changeName(name) {
	p.name = name
}

区别在于,是传结构体的拷贝/引用。我的理解是,当结构体中有类似slice的引用类型时,即使是传拷贝,此引用类型的字段也是传的引用。

一般来说,优先使用指针接收者,好处在于:1.避免结构体拷贝,省内存 2.可改变结构体内容(如果有需要)

接口

组合代替继承

并发

goroutine <-> 逻辑处理器 <-> 线程 <-> 物理处理器

goroutine和线程的区别:

  1. 协程由用户态实现
  2. 非抢占式调度,而是主动出让

一个线程上有多个协程?那么显然就不是真正意义上的并发了。