《基础》
Go语言中的3个关键字用于标准的错误处理流程: defer,panic,recover。
定义一个名为f 的匿名函数:
Go 不支持继承和重载。
Go的goroutine概念:使得并发编程变得非常简单。
Go语言的 main() 函数不能带参数,也不能定义返回值。所有Go函数以关键字func 开头。
Go支持多个返回值,以上函数返回了两个值(result、err)。并不是所有的返回值都必须赋值。
go version 查看版本信息。运行go程序(编译、链接、运行,3个步骤合并为一步): go run hello.go
如果只生成编译结果而不自动运行,使用: go build hello.go
6g 和 6l 是64位版本的Go编译器和链接器,对应32位的是 8g 和 8l.
打印输出:fmt.Println(123)
终止程序:os.Exit(123)
打印数据结构:
spew.Dump(string(buf)) //类似于PHP的var_dump
spew.Dump(adxRequest)
data := fmt.Sprintf("%f", 33.3) //小数转换为字符串 %f
data := fmt.Sprintf("%d", 28) //整数转换为字符串 %d
data := fmt.Sprintf("%v", 33.3) //小数或者整数都通用 %v
sW := uint32(apiReq.ScreenWidth) //int32转换为uint32
字符串转换为float:
lat, _ := strconv.ParseFloat(apiReq.Lat, 32)
fmt.Println(lat) //float64
fmt.Println(float32(lat)) //float32
《变量》
1.使用var声明变量,不需要使用分号作为结束符。
var v1 int
var v2 string
var v3 [10]int //数组
var v4 []int //数组切片
var v6 *int //指针
var v7 map[string]int //map,key 为string类型,value为int类型
var v8 func(a int) int
var v5 struct{
f int
}
可以将多个需要声明的变量放置在一起:
2.变量初始化,var关键字可以保留,但不再是必要的元素。以下三种用法的效果完全一样。
var v1 int = 10
var v2 = 10
v3 := 10 // := 明确表达同时进行变量声明和初始化的工作
注意:出现在:= 左侧的变量不应该是已经被声明过得,否则会导致编译错误。
3.变量赋值——和变量初始化时两个不同的概念。
var v1 int
v1 = 123
可以多重赋值,如下案例表示交换i和j变量:
i,j = j,i
4.匿名变量:
func GetName()(firstName,lastName,nickName string){
return “aaa” , ”bbb” , ”ccc”
}
若只获取nickName,如下调用:_,_,nickName := GetName()
《常量》
1.字面常量(literal)—— 程序中硬编码的常量。
2.使用 const 关键字定义常量:
3.预定义常量—— true、false、iota。
《类型》
1.布尔 —— 布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
var v1 bool
v1 = true
v2 := (1 == 2)
2. 整型 —— Go中, int 和 int32是两种不同的类型。
3. 浮点型 —— float32 和 float64
4. 复数 —— 实部(real) 与 虚部(imag)
5. 字符串(01.go):
var str string //声明一个字符串变量
str = “Hello world” //字符串赋值
ch := str[0] //获取字符串的第一个字符
fmt.Printf(len(str))
字符串操作:
x + y:连接字符串,”Hello”+”123” ====> Hello123
len(s):获取字符串长度, len(“Hello”) ===> 5
s[i]:获取某个字符,”Hello”[1] ===> ‘e’
字符类型:byte(代表UTF-8字符串的单个字节的值)和rune(代表单个Unicode字符)
《数组》
1.数组的声明方法:
[32]byte //长度为32长度数组,每个元素为一个字节
[2*N] struct {x,y int32 } //复杂类型数组
[1000]*float64 //指针数组
[3][5]int //二维数组
[2][2][2]float64//等同于: [2]([2]([2]float64))
2. Go语言中,数组长度在定义后就不可更改。使用len() 获取数组长度:arrLength := len(arr)
3. 遍历整型数组(下标从0开始,len(array)-1 是最后一个元素的下标 )(04.go):
也可以使用 range 关键字便捷地遍历容器中的元素,运行结果同上!(05.go):
4. Go语言中,数组是一个值类型(value type),所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。(06.go)
----> 可以得出结论:函数modify()内操作的数组 和 main() 中传入的数组是两个不同的实例。
总结数组的特点:长度在定义后无法再次修改;数组是值类型,每次传递都将产生一份副本。
《数组切片》
数组切片(slice)拥有自己的数据结构,不仅仅是个指针。
1. 创建数组切片,方法1:基于已存在的数组。(07_slice.go)
用法: myArray[first:last],例如:
mySlice = myArray[:] //基于数组的所有元素创建数组切片
mySlice = myArray[:5] //基于数组的前5个元素创建数组切片
mySlice = myArray[5:] //直接从第5个元素开始的所有元素创建数组切片
2. 创建数组切片,方法2:直接创建—— 使用内置函数make()。
mySlice1 := make([]int,5) //创建一个初始元素个数为5的数组切片,元素初始值为0
mySlice2 := make([]int,5,10) //创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间
mySlice3 := []int{1,2,3,4,5} //直接创建并初始化包含5个元素的数组切片
3. 数组切片元素遍历,参考操作数组的方法。len()获取元素个数,支持使用range关键字快速遍历所有元素。
4. 动态增减元素——数组切片比数组更为强大的功能!
内置的cap() 函数:返回数组切片分配的空间大小;len():返回数组切片中当前存储的元素个数。
给已包含元素的数组切片后面继续新增元素,使用append()函数.(08_slice2.go)
5. 基于数组切片创建数组切片
oldSlice := []int{1,2,3,4,5}
newSlice := oldSlice[:3] //基于oldSlice的前3个元素构建新数组切片
说明:newSlice的元素范围可以超过oldSlice,但不能超出old的存储能力(cap()值)
比如new := old[:6],基于old的前6个元素创建,后面补0.
6. 内容复制 —— copy()函数,将内容从一个数组切片复制到另一个数组切片。
《map》
map是一堆键值对的未排序集合,
1. 变量声明
var myMap map[string] PersonInfo //string是键的类型,PersonInfo是值的类型。
2. 创建——使用make()创建:
myMap = make(map[string] PersonInfo) //创建一个键类型为string,值类型为PersonInfo的map。
myMap = make(map[string] PersonInfo,100) //创建一个初始存储能力为100的map。
创建并初始化map:
myMap = map[string] PersonInfo{
“1234”: PersonInfo{“1”,”Jack”,”Room 101,...”}
}
3. 元素赋值——将键和值用下面的方式对应起来:
myMap[“1234”] = PersonInfo{“1”,”Jack”,”Room 101,...”}
4. 元素删除—— delete()函数,用于删除容器内的元素:
delete(myMap,”1234”)
如果传入的map变量的值是nil,则会抛出异常(panic)。
5. 元素查找——判断能否从map中获取一个值的做法:
《流程控制和函数》
条件判断 if 语句(01_if.go)
选择语句 switch...case (02_switch.go)
循环语句 for (03_for.go)
Go语言中只支持for循环,不支持 while 和 do...while循环。
goto语句 —— 跳转到本函数内的某个标签.(04_goto.go)
《函数》
函数的基本组成:关键字func、函数名、参数列表、返回值、函数体、返回语句。(05_fun.go)
函数调用:小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用。
不定参数 —— 函数传入的参数个数为不定数量(06_func_type.go)。
任意类型的不定参数 ...interface()
多返回值,比如:File.Read()函数可以同时返回读取的字节数和错误信息。
匿名函数 ——不需要定义函数名,由不带函数名的函数声明和函数体组成:
闭包 —— Go的匿名函数是一个闭包。
《错误处理》
1. error接口
2. defer—— 统一释放资源,类似于PHP的 __destruct()
3. panic() 和 recover()
《面向对象》
1.类型系统:
2.值语义 和 引用语义
(1)要想表达引用,需要使用“指针”:(个人理解,类似于PHP的引用传递: & )
(2)Go语言中四个类型看起来像引用类型的类型:
(3)结构体 (struct)
(4)初始化:
(5)可见性 (类似于PHP的 private/protected/public的意思,但是Go语言中没有这样的关键字)
要是某个符号对其他包可见(可以访问),需要将该符号定义为以大写字母开头。
《接口》
在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口。(非侵入式接口)
《协程》
goroutine 就是协程,Golang 的一大特色就是从语言层面原生支持协程,在函数或者方法前面加 go关键字就可创建一个协程。
当被调用的函数返回时,这个goroutine也自动结束。
package main
func say(s string) {
for i := 0; i < 5; i++ {
println(s)
}
}
func main() {
go say("Hello")
go say("World")
}
如果运行上面代码,会发现什么结果都没有。
当使用go启动协程之后,这2个函数就被切换到协程里面执行了,但是这时候主线程结束了,这2个协程还没来得及执行就挂了!
聪明的小伙伴会想到,那我主线程先睡眠1s等一等?Yes, 在main代码块最后一行加入:
time.Sleep(time.Second*1) # 表示睡眠1s
你会发现可以打印出5个Hello 和 5个World,多次运行你会发现Hello 和 World 的顺序不是固定的,这进一步说明了一个问题,那就是多个协程是同时执行的。
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE
go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- golang基础知识之encoding/json package
golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...
- php代码审计基础笔记
出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...
- MYSQL基础笔记(六)- 数据类型一
数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...
- MYSQL基础笔记(五)- 练习作业:站点统计练习
作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...
- MYSQL基础笔记(四)-数据基本操作
数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...
- MYSQL基础笔记(三)-表操作基础
数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...
随机推荐
- Ubuntu armhf 版本国内源
Ubuntu armhf 版本国内源: deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted u ...
- 运维开发笔记整理-template的使用
运维开发笔记整理-Django的template的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在上一篇博客中我们学习了HttpResponse 和JsonResponse方 ...
- 1.Git & GitHup
1.常见的版本控制(管理代码的版本迭代)工具: @ svn:集中式版本控制系统: SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里 ...
- python xml文件解析 及生成xml文件
#解析一个database的xml文件 """ <databaselist type="database config"> <dat ...
- Mac---使用tree生成目录结构
作为测试或者程序员,平时都有需求来生成目录树,进行项目层级的讲解等.如下是样式图: 实现方式,即操作步骤: Mac下使用 brew install tree 进行安装,安装后,在terminal中输入 ...
- Number of Islands II
Given a n,m which means the row and column of the 2D matrix and an array of pair A( size k). Origina ...
- linux文件共享服务
linux文件共享配置 Windows访问linux 以下操作都在关闭防火墙和关闭selinux的环境下. 关闭防火墙的命令:service iptables stop关闭SELINUX命令:sete ...
- SIGAI机器学习第十五集 支持向量机2
讲授线性分类器,分类间隔,线性可分的支持向量机原问题与对偶问题,线性不可分的支持向量机原问题与对偶问题,核映射与核函数,多分类问题,libsvm的使用,实际应用 大纲: SVM求解面临的问题 SMO算 ...
- Debian 9.x "stretch" 解决 /etc/rc.local 开机启动问题
由于某些软件并没有增加开启启动的服务,很多时候需要手工添加,一般我们都是推荐添加命令到 /etc/rc.local 文件,但是 Debian 9 默认不带 /etc/rc.local 文件,而 rc. ...
- MongoDB 副本集的常用操作及原理
本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...