一、背景

新挑战:

①、多核硬件架构;

②、超大规模分布式计算集群;

③、web模式导致前所未有的开发规模和更新速度;

二、go(编译的强类型语言)简介

作为一门语言,Go 不仅定义了能做什么,还定义了不能做什么。Go 语言的语法简洁到只有几个关键字,便于记忆。 Go 语言的编译器速度非常快,有时甚至会让人感觉不到在编译。所以,Go 开发者能显著减少等 待项目构建的时间。因为 Go 语言内置并发机制,所以不用被迫使用特定的线程库,就能让软件 扩展,使用更多的资源。Go 语言的类型系统简单且高效,不需要为面向对象开发付出额外的心 智,让开发者能专注于代码复用。Go 语言还自带垃圾回收器,不需要用户自己管理内存。

1、简单:只有25个关键字;

2、高效:垃圾回收、通过指针可直接访问内存(不支持指针运算;string是值类型,其默认的初始化值为空字符串,而不是nil);

if str ==""{} //正确判断为空
if str == nil {} //错误判断为空

go go语言从入门到放弃 go语言从入门到实战_Go

3、生产力:仅支持复合;

三、编写第一个go程序

查看版本:go version

1、下载喜欢的编辑器;

2、创建test.go文件;

go go语言从入门到放弃 go语言从入门到实战_go_02

3、应用程序入口注意事项

①、必须是main包:package main;

②、必须是main方法:func main();

③、文件名随意;

4、退出返回值:

①、Go中main函数不支持任何返回值;

②、通过os.Exit来返回状态;

5、获取命令行参数

①、main函数不支持传入参数;

②、在程序中直接通过os.Args获取命令行参数;

go go语言从入门到放弃 go语言从入门到实战_Go_03

四、编写测试程序

1、源码文件以_test结尾:xiaoyan_test.go;

2、测试方法名以Test开头:func TestXIAO(t *testing.T){}

五、变量赋值

1、赋值可以进行自动类型推断;

2、在一个赋值语句中可以对多个变量进行同时赋值;

go go语言从入门到放弃 go语言从入门到实战_字符串_04

六、常量定义

1、快速设置连续值(定义连续常量)

go go语言从入门到放弃 go语言从入门到实战_go语言_05

2、比特位计数


7、基本的数据类型

go go语言从入门到放弃 go语言从入门到实战_字符串_06

Go语言不允隐式类型转换;别名和原有类型也不能进行隐式类型转换。

go go语言从入门到放弃 go语言从入门到实战_go语言_07

八、算数运算符

go go语言从入门到放弃 go语言从入门到实战_字符串_08

九、比较运算符

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_09

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_10

go go语言从入门到放弃 go语言从入门到实战_go_11

十、位运算符

go go语言从入门到放弃 go语言从入门到实战_Go_12

十一、条件和循环

go go语言从入门到放弃 go语言从入门到实战_Go_13

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_14

go go语言从入门到放弃 go语言从入门到实战_字符串_15

go go语言从入门到放弃 go语言从入门到实战_go语言_16

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_17

go go语言从入门到放弃 go语言从入门到实战_Go_18

go go语言从入门到放弃 go语言从入门到实战_go_19

十二、数组和切片

数组(arr :=[...] int {1,5,8,7}):容量不可伸缩;对于相同维数且相同长度的数组可以比较(若元素一致就是相同的);

切片(arr :=[] int {1,5,8,7}):容量可以伸缩;不可比较;

go go语言从入门到放弃 go语言从入门到实战_go_20

go go语言从入门到放弃 go语言从入门到实战_go语言_21

go go语言从入门到放弃 go语言从入门到实战_go_22

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_23

go go语言从入门到放弃 go语言从入门到实战_字符串_24

go go语言从入门到放弃 go语言从入门到实战_Go_25

go go语言从入门到放弃 go语言从入门到实战_Go_26

go go语言从入门到放弃 go语言从入门到实战_go语言_27

go go语言从入门到放弃 go语言从入门到实战_go_28

go go语言从入门到放弃 go语言从入门到实战_go语言_29

go go语言从入门到放弃 go语言从入门到实战_Go_30

go go语言从入门到放弃 go语言从入门到实战_go_31

go go语言从入门到放弃 go语言从入门到实战_go语言_32

十三、Map声明、元素访问以及遍历、Map与工厂模式

go go语言从入门到放弃 go语言从入门到实战_字符串_33

go go语言从入门到放弃 go语言从入门到实战_Go_34

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_35

go go语言从入门到放弃 go语言从入门到实战_go语言_36

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_37

go go语言从入门到放弃 go语言从入门到实战_Go_38

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_39

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_40

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_41

十四、字符串

go go语言从入门到放弃 go语言从入门到实战_go_42

go go语言从入门到放弃 go语言从入门到实战_go语言_43

go go语言从入门到放弃 go语言从入门到实战_go语言_44

rune 可以取出字符串里面的unicode

go go语言从入门到放弃 go语言从入门到实战_Go_45

go go语言从入门到放弃 go语言从入门到实战_go语言_46

go go语言从入门到放弃 go语言从入门到实战_字符串_47

go go语言从入门到放弃 go语言从入门到实战_go_48

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、函数一等公民

go go语言从入门到放弃 go语言从入门到实战_go语言_49

go go语言从入门到放弃 go语言从入门到实战_字符串_50

/**
 * 计算一个函数执行的时间
 * 调用:变量名 := 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
	}
}

go go语言从入门到放弃 go语言从入门到实战_go_51

2、可变参数和defer(延迟执行函数)

(1)可变参数

go go语言从入门到放弃 go语言从入门到实战_go_52

(2)延迟执行函数

go go语言从入门到放弃 go语言从入门到实战_字符串_53

十六、行为的定义和实现(面向对象)

go go语言从入门到放弃 go语言从入门到实战_go_54

go语言也是也不是,go语言不支持继承。

(1)封装数据

结构体:

go go语言从入门到放弃 go语言从入门到实战_字符串_55

实例创建及初始化:

go go语言从入门到放弃 go语言从入门到实战_go_56

(2)行为

go go语言从入门到放弃 go语言从入门到实战_字符串_57

十七、go语言的相关接口

把WriteHelloWorld()方法绑定到某个结构上,使用指针的形式。

go go语言从入门到放弃 go语言从入门到实战_go_58

go go语言从入门到放弃 go语言从入门到实战_字符串_59

go go语言从入门到放弃 go语言从入门到实战_go go语言从入门到放弃_60

go go语言从入门到放弃 go语言从入门到实战_字符串_61

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))
}