[ 初学go | 青训营笔记 ]
一、Go 语言介绍
Go 语言(或 Golang)是 Google 2009 年首次开源,并在 2012 年正式发布 Go 稳定版的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去10多年间软件开发的难度令人沮丧。Google 对 Go 寄予厚望,其设计是让软件充分发挥 多核心处理器同步多工 的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助开发者处理琐碎但重要的内存管理问题。Go 的速度也非常快,几乎和 C 或 C++ 程序一样快,且能够快速开发应用程序。
Go(又称 Golang)一种 静态强类型、编译型 语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
二、Go 语言基础
- Go 文件名
所有的go源码都是以 “.go” 结尾。
- Go标记
Go 程序由多个标记组成,包括关键字,标识符,常量,字符串,符号。
例如,以下 GO 语句由 6 个标记组成:
fmt.Println("Hello, World!")
//一行是一个标记,共6个标记
fmt
.
Println
(
"Hello, World!"
)
- 关键字
Go只有25个关键字:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Go还有37个保留字:
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete
complex real imag
panic recover
程序一般由关键字、变量、常量、运算符、类型和函数组成。
程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}。
程序中可能会使用到这些标点符号:. , ; : …
- 标识符
标识符用来 命名 变量、类型等程序实体。一个标识符实际上是由一个或是多个字母(大写或小写)、数字(0~9)、下划线_所组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
- Go 语言声明:
有四种主要声明方式:
var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)
Go程序保存在多个.go文件中,文件的第一行就是 package XXX 声明,用来说明 该文件属于哪个包(package),package声明下来就是import声明(导入哪些包),再下来是类型,变量,常量,函数的声明。
声明的位置决定其作用域:
1)声明在函数内部,是函数的本地值,类似 private
2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似 protect
3)声明在函数外部且首字母大写是所有包可见的全局值,类似 public
- 不存在行分隔符
在 Go 程序中,一行代表一个语句结束。
不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。
- { 不能单独放在一行
表示函数体开始的前花括号“ { ” 不能单独放在一行。
例如,以下代码运行会报错:
package main
import "fmt"
func main()
{ // 错误,{ 不能在单独的行上
fmt.Println("Hello, World!")
}
正确代码:
package main
import "fmt"
func main() { //“{”没有单独在一行
fmt.Println("Hello, World!")
}
三、数据类型介绍
Go 语言中数据类型分为:基本数据类型和复合数据类型
基本数据类型有:整型、浮点型、布尔型、字符串
复合数据类型有:数组、切片、结构体、函数、map、通道(channel)、接口等。
3.1、整数
整型分为以下两个大类: 有符号整形按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64
%b 二进制
%c 对应的 Unicode 码位所代表的字符
%d 十进制
%o 八进制
%O 八进制,带 0o 前缀
%q 使用 Go 语法安全转义的单引号字符文字。
%x 十六进制,af用小写字母
%X 十六进制,AF为大写字母
%U Unicode 格式:U+1234;与 "U+%04X" 相同
类型 范围 占用空间(字节) 有无符号
int8 (-128到127) -2^7 到2^7-1 1 有
int16 (-32768 到32767) -2^15 到2^15-1 2 有
int32 (-2147483648 到2147483647) 4 有
int64 (-9223372036854775808 到9223372036854775807)
-2^63 到2^63-1 8 有
uint8 (0 到255) 0 到2^8-1 1 无
uint16 (0 到65535) 0 到2^16-1 2 无
uint32 (0 到4294967295) 0 到2^32-1 4 无
uint64 (0 到18446744073709551615) 0 到2^64-1 8 无
关于字节: 字节也叫Byte,是计算机数据的基本存储单位。8bit(位)=1Byte(字节);1024Byte(字节)=1KB;1024KB=1MB 1024MB=1GB 1024GB=1TB 。
特殊整型
类型 描述
uint 32 位操作系统上就是uint32,64 位操作系统上就是uint64
int 32 位操作系统上就是int32,64 位操作系统上就是int64
uintptr 无符号整型,用于存放一个指针
注意:
在使用int 和uint 类型时,不能假定它是32 位或64 位的整型,而是考虑int 和uint可能在不同平台上的差异。
注意事项:
实际项目中整数类型、切片、map 的元素数量等都可以用int 来表示。在涉及到二进制传输、为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int 和uint。
int不同长度直接的转换:
package main
import (
"fmt"
)
func main() {
var num1 int8
num1 = 127
num2 := int32(num1)
fmt.Printf("值:%v 类型%T", num2, num2) //值:127 类型int32
}
Go1.13 版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮点数的格式定义数字,例如:v := 0b00101101, 代表二进制的101101,相当于十进制的45。v := 0o377,代表八进制的377,相当于十进制的255。v := 0x1p-2,代表十六进制的1 除以2²,也就是0.25。而且还允许我们用_ 来分隔数字,比如说:v := 123_456 等于123456。我们可以借助fmt 函数来将一个整数以不同进制形式展示。
3.2、浮点型
Go 语言支持两种浮点型数:float32 和float64。
这两种浮点型数据格式遵循IEEE 754 标准:float32 的浮点数的最大范围约为3.4e38,可以使用常量定义:math.MaxFloat32。float64 的浮点数的最大范围约为1.8e308,可以使用一个常量定义:math.MaxFloat64。打印浮点数时,可以使用fmt 包配合动词%f,代码如下:
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%v\n", math.Pi) //原样输出
fmt.Printf("%f\n", math.Pi) //默认保留6 位小数
fmt.Printf("%.2f\n", math.Pi) //保留2 位小数
}
Go 语言中浮点数64位系统中默认是float64
num := 1.1
fmt.Printf("值:%v--类型:%T", num, num) //值:1.1--类型:float64
3.3、布尔值
Go 语言中以bool 类型声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。
注意:
布尔类型变量的默认值为false。
Go 语言中不允许将整型强制转换为布尔型.
布尔型无法参与数值运算,也无法与其他类型进行转换。
package main
import (
"fmt"
"unsafe"
)
func main() {
var b = true
fmt.Println(b, "占用字节:", unsafe.Sizeof(b))
}