一:走进Golang
1.Go语言简介
Go(又称Golang)是Google的Robert Griesemer,Pop Pike及Ken Thompson开发的一种静态强类型、编译型语言。Go语言语法与C相近,但是其功能更完备,具有内存安全、GC(垃圾回收)、结构形态及CSP-style并发计算等功能。
2.Go语言特点
- 背靠大厂,由Google推出,可靠性强
- 天生支持并发(最显著特点)
- 语法简单,容易上手
- 内置runtime,支持垃圾回收
- 可直接编译成机器码,不依赖其他库
- 丰富的标准库
- 跨平台编译
我们都知道Java得益于它的虚拟机可以实现一次编译到处运行,而Go也是支持跨平台运行的,经过了解原来是Go语言得益于它的模块化设计和模块化,针对不同平台都可以生成对应的二进制可执行机器码,他不需要依赖性,它的代码可以在任何服务器和应用程序上面运行。此外,Go语言拥有自己的链接器,不依赖任何系统提供的编译器和链接器。因此编译出的二进制可执行文件几乎可以运行在任何系统环境中。
3.Go语言应用领域
- 服务器编程
- 开发云平台
- 区块链
- 分布式系统
- 网络编程
二:入门实操
1.Go代码组织
Go语言使用包和模块来组织代码,包对应到文件系统里面就是文件夹,模块就是.go文件,一个包中会有多个模块,或者多个子包。
2.Go项目管理工具
早期的Go项目使用gopath来管理项目,不方便使用而且易出错,从Golang 1.11开始使用gomod管理项目,当然还有第三方模块例如govendor,一般都是采用gomod较多。
3.入门案例
①创建项目
在文件夹中新建一个文件夹作为项目根目录
编辑
②初始化项目
在项目根文件夹下打开终端执行go mod init xxx,xxx一般用你项目名称表示,比如我这里是go mod init gopro1,然后就会自动创建一个.mod文件。
编辑
③创建包及相应模块
在项目根目录下创建user包及user.go模块,模块内容见下图:
编辑
④相互调用
在项目根目录下创建main.go模块并编写下面代码进行调用:
编辑
⑤运行测试
在终端执行go run main.go
编辑
三:Golang变量
Go语言的变量声明和c或者java都不太一样,在java中我们声明变量是 数据类型 变量名,但是在Go语言中是这样声明的 var 变量名 数据类型。声明方式主要有以下几种:
1.变量声明
逐个声明:
func test() { var name string var age int var m bool }
批量声明:
func test() { var ( name string age int m bool ) }
2.变量赋值
//1. var name = "zhangsan" var age = 20 var m = true //2. var name string var age int var m bool name = "zhangsan" age = 20 m = true //3. name := "zhangsan" age := 20 m := true //4. name, age, m := "zhangsan", 20, true
3.匿名变量
package main import "fmt" func getNameAndAge() (string, int) { return "zhaosi", 20 } func main() { name, age := getNameAndAge() fmt.Printf("name: %v\n", name) fmt.Printf("age: %v\n", age) }
四:Golang常量
1.常量定义
package main func main() { //常量定义 const PI float64 = 3.14 const PI2 = 3.15 const ( width = 100 height = 200 ) const i, j = 1, 2 const a, b, c = 1, "zhaosi", true }
2.iota
iota是一个可被编译器修改的常量,它的默认值是0,没调用一次加1,遇到const关键字时候被重置为0
func main() { const ( a1 = iota a2 = iota a3 = iota ) fmt.Printf("a1: %v\n", a1) fmt.Printf("a2: %v\n", a2) fmt.Printf("a3: %v\n", a3) }
编辑
func main() { const ( a1 = iota _ //表示跳过 a3 = iota ) fmt.Printf("a1: %v\n", a1) fmt.Printf("a3: %v\n", a3) }
编辑
func main() { const ( a1 = iota a2 = 100 a3 = iota ) fmt.Printf("a1: %v\n", a1) fmt.Printf("a2: %v\n", a2) fmt.Printf("a3: %v\n", a3) }
编辑
五:Golang数据类型
1.布尔类型
package main import "fmt" func main() { //定义 var flag bool flag = true flag1 := false //使用 age := 18 isAdult := age >= 18 fmt.Printf("isAdult: %v\n", isAdult) if isAdult { fmt.Printf("你已经成年了") } else { fmt.Printf("你还未成年") } }
需要注意的是,在c语言中我们可以使用0和1来代替false和true,但是在Go语言中是不行的。
2.数字类型
Go语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。
Go也有基于架构的类型,例如:int、uint(无符号整数)、uintptr(整数类型)
这些类型的长度都是根据运行程序所在操作系统类型决定的:
- int和uint在32位操作系统上,它们均使用32位(4字节),在64位操作系统上,它们均采用64位(8个字节)
- uintptr的长度被设定为足够存放一个指针即可
Go语言中没有float类型(只有float32和float64)没有double类型
(1)不同进制格式定义数字
func main() { //十进制 a := 10 fmt.Printf("十进制:%d\n", a) //%d fmt.Printf("二进制:%b\n", a) //%b }
编辑
// 八进制 以0开头 b := 077 fmt.Printf("%o \n", b) //十六进制 以0x开头 c := 0xff fmt.Printf("%x \n", c) //ff fmt.Printf("%X \n", c) //FF
编辑
(2)浮点型
fmt.Printf("%f \n", math.Pi) fmt.Printf("%.2f \n", math.Pi) //保留两位小数
编辑
3.字符串类型
内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目),索引操作s[i]返回第i个字节的字节值,i必须满足0 ≤ i< len(s)条件约束。
func main() { s := "hello, world" fmt.Println(len(s)) // "12" fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w') }
子字符串操作s[i:j]基于原始的s字符串的第i个字节开始到第j个字节(并不包含j本身)生成一个新字符串。生成的新字符串将包含j-i个字节。
fmt.Printf(s[0:5]) //hello
不管i还是j都可能被忽略,当它们被忽略时将采用0作为开始位置,采用len(s)作为结束的位置。
fmt.Println(s[:5]) // "hello" fmt.Println(s[7:]) // "world" fmt.Println(s[:]) // "hello, world"
其中+操作符将两个字符串连接构造一个新字符串:
fmt.Println("goodbye" + s[5:]) // "goodbye, world"
当然还可以使用`......`来表示多行字符串
s := ` hello , world ! ` fmt.Printf("s: %v\n", s)
编辑