一、背景
新挑战:
①、多核硬件架构;
②、超大规模分布式计算集群;
③、web模式导致前所未有的开发规模和更新速度;
二、go(编译的强类型语言)简介
作为一门语言,Go 不仅定义了能做什么,还定义了不能做什么。Go 语言的语法简洁到只有几个关键字,便于记忆。 Go 语言的编译器速度非常快,有时甚至会让人感觉不到在编译。所以,Go 开发者能显著减少等 待项目构建的时间。因为 Go 语言内置并发机制,所以不用被迫使用特定的线程库,就能让软件 扩展,使用更多的资源。Go 语言的类型系统简单且高效,不需要为面向对象开发付出额外的心 智,让开发者能专注于代码复用。Go 语言还自带垃圾回收器,不需要用户自己管理内存。
1、简单:只有25个关键字;
2、高效:垃圾回收、通过指针可直接访问内存(不支持指针运算;string是值类型,其默认的初始化值为空字符串,而不是nil);
if str ==""{} //正确判断为空
if str == nil {} //错误判断为空
3、生产力:仅支持复合;
三、编写第一个go程序
查看版本:go version
1、下载喜欢的编辑器;
2、创建test.go文件;
3、应用程序入口注意事项
①、必须是main包:package main;
②、必须是main方法:func main();
③、文件名随意;
4、退出返回值:
①、Go中main函数不支持任何返回值;
②、通过os.Exit来返回状态;
5、获取命令行参数
①、main函数不支持传入参数;
②、在程序中直接通过os.Args获取命令行参数;
四、编写测试程序
1、源码文件以_test结尾:xiaoyan_test.go;
2、测试方法名以Test开头:func TestXIAO(t *testing.T){}
五、变量赋值
1、赋值可以进行自动类型推断;
2、在一个赋值语句中可以对多个变量进行同时赋值;
六、常量定义
1、快速设置连续值(定义连续常量)
2、比特位计数
7、基本的数据类型
Go语言不允隐式类型转换;别名和原有类型也不能进行隐式类型转换。
八、算数运算符
九、比较运算符
十、位运算符
十一、条件和循环
十二、数组和切片
数组(arr :=[...] int {1,5,8,7}):容量不可伸缩;对于相同维数且相同长度的数组可以比较(若元素一致就是相同的);
切片(arr :=[] int {1,5,8,7}):容量可以伸缩;不可比较;
十三、Map声明、元素访问以及遍历、Map与工厂模式
十四、字符串
rune 可以取出字符串里面的unicode
func TestConv(t *testing.T) {
// bool转字符串
t.Log(strconv.FormatBool(true)) //"true"
//字符串转bool
flag, _ := strconv.ParseBool("true")
t.Log(flag) //true
//'f'指打印格式以小数方式,3:指小数位数, 64:指float64处理
t.Log(strconv.FormatFloat(2.12, 'f', 3, 64)) //2.120
//字符串转浮点
float, _ := strconv.ParseFloat("3.14", 64)
t.Log(float) // 3.14
//整数转字符串
t.Log(strconv.Itoa(19)) //"19"
//字符串转整型
i, _ := strconv.Atoi("123")
t.Log(i) //123
//字符串转整型
if j, err := strconv.Atoi("123"); err == nil {
t.Log(j) //123
}
slice := make([]byte, 0, 1024)
t.Log(slice) //[]
slice = strconv.AppendBool(slice, true)
// 10:指十进制
slice = strconv.AppendInt(slice, 123, 10)
slice = strconv.AppendFloat(slice, 3.14, 'f', 2, 64)
slice = strconv.AppendQuote(slice, "hello go")
t.Log(string(slice)) //true1233.14"hello go"
}
十五、go语言的函数
1、函数一等公民
/**
* 计算一个函数执行的时间
* 调用:变量名 := timeSpent(方法名) t.Log(方法名)
* 返回:执行的时间
*/
func timeSpent(inner func(op int) int) func(op int) int {
return func(n int) int {
start := time.Now()
ret := inner(n)
fmt.Println("time spent: ", time.Since(start).Seconds())
return ret
}
}
2、可变参数和defer(延迟执行函数)
(1)可变参数
(2)延迟执行函数
十六、行为的定义和实现(面向对象)
go语言也是也不是,go语言不支持继承。
(1)封装数据
结构体:
实例创建及初始化:
(2)行为
十七、go语言的相关接口
把WriteHelloWorld()方法绑定到某个结构上,使用指针的形式。
type mySelf func(item int) int
//func timeSpent(inner func(op int) int) func(op int) int {
func timeSpent(inner mySelf) mySelf {
return func(n int) int {
start := time.Now()
ret := inner(n)
fmt.Println("time spent: ", time.Since(start).Seconds())
return ret
}
}
func count(op int) int {
time.Sleep(time.Second * 1)
return op
}
func TestFunc(t *testing.T) {
count := timeSpent(count)
t.Log(count(11))
}