第一章:走进Golang
Golang引入
- 简介: Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种计算机编程语言语言。
- 设计初衷: Go语言是谷歌推出的一种的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,"使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。"
- 计算机硬件技术更新频繁,性能提高很快。目前主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。
- 软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。
- 企业运行维护很多c/c++的项目,c/c++程序运行速度虽然很快,但是编译速度确很慢,同时还存在内存泄漏的一系列的困扰需要解决。
- 应用领域:
第一段程序:Hello Golang!
- go基本目录结构:
- 开始写代码:第一个HelloWorld :
package main //声明文件所在的包,每个go文件必须有归属的包
import "fmt" //引入程序中需要用的包,为了使用包下的函数 比如:Println
func main () { //main 主函数 程序的入口
fmt.Println("Hello Golang!!") //在控制台打印输出一句话,Hello Golang!!
}
复制代码
- 对源文件进行编译:go bulid
- 执行操作
- 也可以通过go run直接编译、执行文件(但不生成exe文件)
Golang执行流程
- 执行流程分析:
-
上述两种执行流程的方式区别
- 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件 变大了很多。
- 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行
- 如果我们是直接go run go源代码,那么如果要在另外一个机器上这么运行,也需要go 开发环境,否则无法执行。
- go run运行时间明显要比第一种方式 长一点点
-
编译注意事项: 编译后的文件可以另外指定名字:
语法注意事项
- 源文件以"go"为扩展名。
- 程序的执行入口是main()函数。
- 严格区分大小写。
- 方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。
- Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
- 定义的变量或者import的包如果没有使用到,代码不能编译通过。
- 大括号都是成对出现的,缺一不可
注释
-
注释的作用: 用于注解说明解释程序的文字就是注释,注释提高了代码的阅读性; 注释是一个程序员必须要具有的良好编程习惯。 将自己的思想通过注释先整理出来,再用代码去体现。
-
Golang中注释类型: Go支持c语言风格的/**/块注释,也支持c++风格的//行注释。行注释更通用,块注释主要用于针对包的详细说明或者屏蔽大块的代码
-
行注释 // VSCode快捷键:ctrl+/ 再按一次取消注释
-
块注释(多行注释) /**/ VSCode快捷键:shift+alt+a 再按一次取消注释
注意:块注释中不可以嵌套块注释
-
提示:官方推荐使用行注释 //
代码风格
-
注意缩进
向后缩进:tab 向前取消缩进:shift+tab 通过命令完成格式化操作:
- 成对编程 {} () “ ” ‘ ’
- 运算符两边加空白 ( ps : 一般来说,写代码的时候都得这样,这是规范编写代码的好习惯 )
- 以下代码是错误的:
go的设计者想要开发者有统一的代码风格
-
行长约定:
一行最长不超过80个字符,超过的请使用换行展示,尽量保持格式优雅
API
Go语言提供了大量的标准库,因此 google 公司也为这些标准库提供了相应的API文档,用于告诉开发者如何使用这些标准库,以及标准库包含的方法。
第二章 变量与数据类型
变量
- 简单代码展示
package main
import "fmt"
func main(){
//1.变量的声明
var age int
//2.变量的赋值
age = 18
//3.变量的使用
fmt.Println("age = ", age);
//声明和赋值可以合成一句:
var age2 int = 19
fmt.Println("age2 = ", age2);
// var age int = 20;
// fmt.Println("age = ", age);
/*变量的重复定义会报错:
# command-line-arguments
.\main.go:16:6: age redeclared in this block
previous declaration at .\main.go:6:6
*/
//不可以在赋值的时候给与不匹配的类型
var num int = 12.56 //报错
fmt.Println("num = ", num);
}
复制代码
- 变量的四种定义方法、一次性声明多个变量(代码展示)
package main
import "fmt"
//全局变量:定义在函数外的变量
var n7 = 100
var n8 = 9.7
//设计者认为上面的全局变量的写法太麻烦了,可以一次性声明:
var (
n9 = 500
n10 = "netty"
)
func main(){
//定义在{}中的变量叫:局部变量
//第一种:变量的使用方式:指定变量的类型,并且赋值,
var num int = 18
fmt.Println(num) //18
//第二种:指定变量的类型,但是不赋值,使用默认值
var num2 int
fmt.Println(num2) //0
//第三种:如果没有写变量的类型,那么根据=后面的值进行判定变量的类型 (自动类型推断)
var num3 = "tom"
fmt.Println(num3) //tom
//第四种:省略var,注意 := 不能写为 =
sex := "男"
fmt.Println(sex) //男
fmt.Println("------------------------------------------------------------------")
//声明多个变量:
var n1,n2,n3 int
fmt.Println(n1) //0
fmt.Println(n2) //0
fmt.Println(n3) //0
var n4,name,n5 = 10,"jack",7.8
fmt.Println(n4) //10
fmt.Println(name) //jack
fmt.Println(n5) //7.8
n6,height := 6.9,100.6
fmt.Println(n6) //6.9
fmt.Println(height) //100.6
//全局变量输出
fmt.Println(n7) //100
fmt.Println(n8) //9.7
fmt.Println(n9) //500
fmt.Println(n10) //netty
}
复制代码
基本数据类型
整数类型
- 有符号整数类型
- 无符号整数类型