go学习笔记

一、类型

1.变量

Go 是静态类型语⾔言,不能在运⾏行期改变变量类型。

2.常量

a.常量值必须是编译期可确定的数字、字符串、布尔值。

b.在常量组中,如不提供类型和初始化值,那么视作与上一常量相同。

c.关键字 iota 定义常量组中从 0 开始按⾏行计数的⾃自增枚举值。如果 iota 自增被打断,须显式恢复。

3.基本类型

类型

长度

默认值

说明

bool

1

false

byte

1

0

uint8

rune

4

0

Unicode Code Point, int32

int, uint

4 8

0

32 64

int8, uint8

1

0

-128 ~ 127, 0 ~ 255

int16, uint16

2

0

-32768 ~ 32767, 0 ~ 65535

int32, uint32

4

0

-21亿 ~ 21 亿, 0 ~ 42 亿

int64, uint64

8

0

float32

4

0.0

float64

8

0.0

complex64

8

complex128

16

uintptr

4 8

⾜足以存储指针的 uint32 uint64 整数

array

值类型

struct

值类型

string

“”

UTF-8 字符串

slice

nil

引⽤用类型

map

nil

引⽤用类型

channel

nil

引⽤用类型

interface

nil

接⼝口

function

nil

函数

注:

  • byte 等同于int8,常用来处理ascii字符
  • rune 等同于int32,常用来处理unicode或utf-8字符

4.引⽤类型

引⽤类型包括: slice、map 和 channel。它们有复杂的内部结构,除了申请内存外,还需要初始化相关属性。

内置函数 new 计算类型⼤小,为其分配零值内存,返回指针。而 make 会被编译器翻译成具体的创建函数,由其分配内存和初始化成员结构,返回对象⽽非指针。

5.类型转换

go不⽀持隐式类型转换。

6.字符串

a.字符串是不可变值类型,内部用指针指向 UTF-8 字节数组。 不能⽤序号获取字节元素指针,即:&s[i] 非法。

b.使⽤ “`” 定义不做转义处理的原始字符串,支持跨行。

7.指针

将 Pointer 转换成 uintptr,可变相实现指针运算。

8.⾃自定义类型

a.可将类型分为命名和未命名两⼤类。命名类型包括 bool、int、string 等,而array、slice、map 等和具体元素类型、⻓度等有关,属于未命名类型。

b.可用 type 在全局或函数内定义新类型。新类型不是原类型的别名,除拥有相同数据存储结构外,它们之间没有任何关系。

二、表达式

1.保留字

break

default

func

interface

select

case

defer

go

map

struct

chan

else

goto

package

switch

const

fallthrough

if

range

type

continue

for

import

return

var

2.运算符

a.全部运算符、分隔符,以及其他符号:

+

&

+=

&=

&&

==

!=

(

)

|

-=

|=

||

<

<=

[

]

*

^

*=

^=

<-

>

>=

{

}

/

<<

/=

<<=

++

=

:=

,

;

%

>>

%=

>>=

!

.

:

&^

&^=

0110 ^ 1011 = 1101   XOR 只能⼀一个为 1。(异或)

0110 &^ 1011 = 0100  AND NOT 清除标志位。(根据右边的操作数,如果是1则清除左边的数据为0,否则维持不变。1011代表:清除、不变、清除、清除,所以是0100)

b.运算符优先级(从上到下优先级降低):

high

*

/

&

<<

>>

&

&^

+

|”

^

==

!=

<

<=

<

>=

<-

&&

low

||

注:

“++”、”–” 是语句⽽非表达式。

没有 “~”,取反运算也⽤用 “^”。

3.初始化

4.控制流

a.不⽀支持三元操作符 “a > b ? a : b”。

b.不支持while

4.1.1 range

a.range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。

类型 第一个值 第二个值 备注
string index s[index] unicode, rune
array/slice index s[index]
map key m[key]
channel element

b.示例

 

c.range关于数组和slice的区别:

输出结果:

注:range 会复制对象。另外两种引⽤用类型 map、channel 是指针包装,而不像 slice 是 struct。

4.1.2 switch

分⽀表达式可以是任意类型,不限于常量。可省略 break,默认自动终⽌。如需要继续下一分支,可使用 fallthrough,但不再判断条件。

输出:

4.1.3 Goto、Break、Continue

break 可⽤用于 for、switch、select,而 continue 仅能⽤于 for 循环。

三、函数

1.函数定义

2.变参

四、数据

1.Array

2.Slice