type
status
date
slug
summary
tags
category
icon
password

GO编程基础

环境搭建

解决sublime3搜索不到gosub插件
  1. 下载gosublime的zip包解压到路径C:\Users.....AppData\Roaming\Sublime Text 3\Packages,重命名为GoSublime
  1. 打开Browse Package的路径,在GoSublime/src目录下新建margo文件夹,把GoSublime/src/margo.sh/extension-example/extension/extension-example.go复制到该文件夹,并重命名为margo.go

基础知识

内置关键字

break、default、func、interface、selectcase、defer、go、map、structchan、else、goto、package、switchconst、fallthrough、if、range、typecontinue、for、import、return、var

注释方法

单行注释://
多行注释:/**/

导入package的格式

package别名

省略调用(不建议使用)

省略调用和别名不可同时使用,容易混淆且编译器无法识别

可见性规则

定义的常量、变量、类型、接口、结构、函数等的名称是大写字母开头表示能被其它包访问或调用(相当于public),非大写开头就只能在包内使用(相当于private,变量或常量也可以下划线开头)

类型与变量

基本数据类型

布尔型:bool
整型:int/uint
字节型:byte(uint8)
16位整型:int16/uint16
32位整型:int32(rune)/uint32
64位整型:int64/uint64
浮点型:float32/float64
复数:complex64/complex128
其它值类型:array、struct、string
引用类型:slice、map、string
接口类型:interface
函数类型:func

类型零值

类型别名(一般类型声明)

多个变量的声明与赋值

全局变量的声明可使用 var() 的方式进行简写
全局变量的声明不可以省略 var,但可使用并行方式
所有变量都可以使用类型推断
局部变量不可以使用 var() 的方式简写,只能使用并行方式(即只能使用=号)

错误的声明

正确的声明

忽略符号

变量类型转换

<ValueA> [:]= <TypeOfValueA>(<ValueB>)

常量与运算符

枚举、常量的定义

运算符

&(与)

两位同时为1,结果为1

|(或)

其中一位为1,结果为1

^(异或)

两位为“异”,结果为1

&^

第二位为0,第一位为结果
第二位为1,第一位强制改0为结果

控制语句

if

for

  • Go只有for一个循环语句关键字,但支持3种形式
  • 初始化和步进表达式可以是多个值
  • 条件语句每次循环都会被重新检查,因此不建议在条件语句中使用函数,尽量提前计算好条件并以变量或常量代替
    • 左大括号必须和条件语句在同一行

    无限循环

    表达式判断

    经典用法

    for range(类似while和do-while循环)

    slice

    map

    用法

    取出的value是拷贝值

    排序

    switch

    • 可以使用任何类型或表达式作为条件语句
    • 不需要写break,一旦条件符合自动终止
    • 如希望继续执行下一个case,需使用fallthrough语句
    • 支持一个初始化表达式(可以是并行方式),右侧需跟分号
    • 左大括号必须和条件语句在同一行
    经典用法

    跳转语句

    • 三个语法都可以配合标签使用
    • 标签名区分大小写,若不使用会造成编译错误
    • break与continue配合标签可用于多层循环的跳出
    • goto是调整执行位置,与其它2个语句配合标签的结果并不相同
    定义标签

    break

    goto

    continue

    数组array

    • 定义数组的格式:var <varName> [n]<type>,n>=0
    • 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
    • 注意区分指向数组的指针和指针数组
    • 数组在Go中为值类型
    • 数组之间可以使用==或!=进行比较,但不可以使用<或>
    • 可以使用new来创建数组,此方法返回一个指向数组的指针
    • Go支持多维数组

    完全不同的两个类型数组

    赋值

    指向数组的指针

    错误示例

    正确示例

    指针数组

    new

    多维数组

    冒泡排序

    切片slice

    • 其本身并不是数组,它指向底层的数组
    • 作为变长数组的替代方案,可以关联底层数组的局部或全部
    • 引用类型
    • 可以直接创建或从底层数组获取生成
    • 使用len()获取元素个数cap()获取容量
    • 一般使用make()创建
    • 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
    • make([]T, len, cap)
    • 其中cap可以省略,则和len的值相同
    • len表示存数的元素个数,cap表示容量

    区分数组和slice

    用法

    Reslice

    • Reslice时索引以被slice的切片为准
    • 索引不可以超过被slice的切片的容量cap()值
    • 索引越界不会导致底层数组的重新分配而是引发错误

    Append

    • 可以在slice尾部追加元素
    • 可以将一个slice追加在另一个slice尾部
    • 如果最终长度未超过追加到slice的容量则返回原始slice
    • 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
    slice长度超过最大容量时会翻倍

    Copy

    短的slice复制给长的slice
    长的slice复制给短的slice

    集合map

    • 类似其它语言中的哈希表或者字典,以key-value形式存储数据
    • Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
    • Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍
    • Map使用make()创建,支持 := 这种简写方式
    • make([keyType]valueType, cap),cap表示容量,可省略
    • 超出容量时会自动扩容,但尽量提供一个合理的初始值
    • 使用len()获取元素个数
    • 键值对不存在时自动添加,使用delete()删除某键值对
    • 使用 for range 对map和slice进行迭代操作
    创建并初始化一个map
    键值对map初始化用法
    每一层map都需要初始化

    函数function

    • Go函数不支持嵌套、重载和默认参数
    • 支持无需声明原型、不定长度变参、多返回值、命名返回值参数
    • 匿名函数、闭包
    • 定义函数使用关键字 func,且左大括号不能另起一行
    • 函数也可以作为一种类型使用
    传递值类型拷贝不影响值,传递指针才影响值
    传递slice,地址拷贝影响值

    匿名函数

    闭包

    defer

    后定义先调用

    painc、recover

    结构struct

    值拷贝用法

    值修改用法

    匿名结构

    匿名字段

    相同类型赋值

    组合(嵌入结构)

    匿名字段默认使用结构名称作为字段名称

    方法method

    指针传递类型修改值
    方法绑定

    接口interface

    反射reflection

    并发concurrency

    饥荒跨境电商网站建设
    Loading...