Golang 学习笔记

Go

  • go run xx.go 执行go文件
  • go build xx.go生成二进制文件

一. GO 基础

1. 语言结构

  • 包声明
    • 每个Go文件都包含main的包
  • 引入包
  • 函数
  • 变量
  • 语句&表达式
    • {不能单独放一行
  • 注释

2. 基础语法

2.1 行分隔符

  • 不需要以;结尾
  • 若需要多个语句写在同一行,必须使用;-->不鼓励

2.2 注释

  • 与JavaScript相同
  • //单行注释
  • /* */多行注释

2.3 标识符

  • 不能以数字开头
  • 不允许运算符
  • 不使用关键字

2.4 关键字

关键字/保留字

预定义标识符

3. 数据类型

类型 描述
布尔 true/false
数字类型 int/float32、float64
字符串 使用UTF-8编码标记Unicode文本
派生类型 1. 指针<br />2. 数组<br />3. 结构化<br />4. Channel<br />5. 函数<br />6. 切片<br />7. 接口<br />8. Map

3.1 数字类型

uint8 uint16 uint32 uint64 int8 int16 int32 int64

float32 float64 complex64 complex128

3.2 其他类型

byte rune uint int uintptr

4. 变量

  1. 使用var声明

    • var a int = 10
    • var a =10
  2. 使用:=

    • a := 10
  • 不带声明格式的只能在函数体中出现

  • 交换两个值的顺序

  • a, b = b, a

  • 空白标识符_被用于抛弃值

  • _是一个只写变量,不能得到它的值

5. 常量

const identifier [type] = value

定义常量组时,若不提供初始值,则表示使用上行的表达式

5.1 iota

表示从0开始自动加1

<< n表示左移动,即转换为二进制数字往前移动n位数字,然后转换为十进制输出,也即 *2n

iota也只是在同一个const常量组内递增,有新的const关键字时,iota计数会重新开始

6. 运算符

  • 算数运算符

    • /
    • %
    • ++

  • 关系运算符

    • ==
    • !=
    • >
    • <
    • >=
    • <=
  • 逻辑运算符

    • && AND
    • || OR
    • ! NOT
  • 位运算符

    • & 按位与
    • | 按位或
    • ^ 按位异或
  • 赋值运算符

    • =
    • +=
    • -=
    • *=
    • /=
    • %=
    • <<=
    • >>=
    • &=
    • ^=
    • |=
  • 其他运算符

    • & 取址
    • * 指针变量
  • 运算符的优先级

    优先级 运算符
    5 * / % << >> & &^
    4 + - | ^
    3 == != < <= > >=
    2 &&
    1 ||

7. 条件语句

7.1 判断语句

// if语句
if 布尔表达式 {
    /*code and code*/
}else{
    /*code and code*/
}

// if嵌套
...

7.2 swith 语句

// switch语句
switch var1{
   case val1:
    ...
   case val2:
    ...
   default:
    ...
}
  • Type Switch
    • 被用于type-switch 来判断某个interface变量中实际存储的变量类型。
  • fallthrough
    • 强制执行后边的case语句,无论下一个case表达式是否为true

7.3 select语句

select {
    case communication clause  :
       statement(s);      
    case communication clause  :
       statement(s);
    /* 可以定义任意数量的 case */
    default : /* 可选 */
       statement(s);
}

注意:Go 没有三目运算符,所以不支持 ?: 形式的条件判断。

8. 循环语句

8.1 for循环

  1. 和C语言的for一样 :for init; condition; post {}

  2. 和C的while一样: for condition{}

  3. 和C的for(;;)一样:for{}

8.2 goto语句

goto label;
..
.
label: statement;

9. 函数

func function_name( [parameter list] ) [return_types] {
   函数体
}

**默认情况下****,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

9.1 闭包

// go闭包示例 
package main

import "fmt"

// 闭包使用方法,函数声明中的返回值(闭包函数)不用写具体的形参名称
func add(x1, x2 int) func(int, int) (int, int, int) {
  i := 0
  return func(x3, x4 int) (int, int, int) {
    i += 1
    return i, x1 + x2, x3 + x4
  }
}

func main() {
  add_func := add(1, 2)
  fmt.Println(add_func(4, 5))
  fmt.Println(add_func(1, 3))
  fmt.Println(add_func(2, 2)) 
}

9.2 函数方法

func (variable_name variable_data_type) function_name() [return_type]{
   /* 函数体*/
}

10. 变量作用域

  • 函数内定义的变量称为局部变量
  • 函数外定义的变量称为全局变量
  • 函数定义中的变量称为形式参数

11. 数组

  1. 声明数组

    var variable_name [SIZE] variable_type

  2. 初始化数组

    var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
    balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
    // 如果数组的长度不确定
    var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
    //或
    balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
    
    //  将索引为 1 和 3 的元素初始化
    balance := [5]float32{1:2.0,3:7.0}
    

12. 指针

取址符&

内存地址是一个16进制的数据

12.1空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。

nil 指针也称为空指针

一个指针变量通常缩写为 ptr

12.2 指向指针的指针

var ptr **int;

13. 结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

结构体的格式如下:

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}

定义了结构体类型,就能用于变量的声明,格式如下:

variable_name := structure_variable_type {value1, value2...valuen}
或
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

访问结构体成员
结构体.成员名

14. slice

定义切片:var identifier []type

切片不需要说明长度

使用make函数创建切片

var slice1 []type = make([]type, len)

//也可以简写为

slice1 := make([]type, len)

// 也可以指定容量,capacity为可选参数
mark([]T, length, capacity)

// 切片初始化
s := arr[startIndex:endIndex] 

len() 方法获取长度。

cap() 方法测量切片最长可以达到多少

切片在未初始化之前默认为 nil,长度为 0

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来

拷贝切片的:copy 方法

向切片追加新元素的:append 方法

15. range

range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

16. map

定义map

/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对

17. 递归函数

递归,就是在运行的过程中调用自己

18. 类型转换

type_name(expression)

go 不支持隐式转换类型

19. 接口

/* 定义接口 */
type interface_name interface {
   method_name1 [return_type]
   method_name2 [return_type]
   method_name3 [return_type]
   ...
   method_namen [return_type]
}

/* 定义结构体 */
type struct_name struct {
   /* variables */
}

/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
   /* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
   /* 方法实现*/
}

20. 错误处理

// ErrorL类型是一个接口类型
type error interface {
    Error() string
}

21. 并发

goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

go 函数名( 参数列表 )

同一个程序中的所有 goroutine 共享同一个地址空间。

通道

通道(channel)是用来传递数据的一个数据结构。

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道

通道缓冲区

通道可以设置缓冲区,通过 make 的第二个参数指定缓冲区大小:

ch := make(chan int, 100)

带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。

不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。

注意:如果通道不带缓冲,发送方会阻塞直到接收方从通道中接收了值。如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容