00准备:
配置环境变量,选择开发工具(我选择的是vscode)
1命名规范
Go是一门区分大小写的语言。
1.1包命名
持package的名字和目录保持一致,和标准库不要冲 突。包名应该为小写单词。
package main
1.2文件命名
小写单词,使用下划线分隔各个单词。
approve_service.go
1.3结构体命名
驼峰命名法,首字母根据访问控制大写或者小写。申明和初始化格式采用多行。
type Point struct {
X int
Y int
}
type Color struct {
R,G,B byte
}
1.4接口命名
函数的结构名以 “er” 作为后缀
type Reader interface {
Read(p []byte) (n int, err error)
}
1.5变量命名
一般遵循驼峰法,首字母根据访问控制原则大写或者小写。 注意有以下规则:
- 变量为私有,且特有名词为首个单词,则使用小写,如 appService
- 变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头
var str string
var isExist bool
1.6常量命名
常量均需使用全部大写字母组成,并使用下划线分词
const APP_URL = "https://www.baidu.com"
是枚举类型的常量,需要先创建相应类型:
const (
Unknown = 0
Female = 1
Male = 2
)
type Scheme string
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)
01基础数据类型
- 布尔类型: 布尔型的值只可以是常量 true 或者 false。不可以像C那样用0和非0代替
- 数字类型: 整型和浮点型,支持复数
- 字符串类型: 字符串是由单个字 节连接起来的。和C类似,但是Go的字符串并没有以'\0' 结尾
1布尔类型
两个类型相同的值可以使用相等 == 或者不等 != 运算符来进行比较并获得一个布尔型的值。
注意:
- 只有在两个的值的类型相同的情况下才可以使用。
- 默认值为false。
- 不允许将整型强制转换为布尔型,就意味着不可用0,非0代替真假
2数字类型
2.1整数
int、uint 和 uintptr。
uint8 无符号 8 位整型 (0 到 255) int8 有符号 8 位整型 (-128 到 127)。有uint16,uint32,uint64等
2.2浮点
float32 IEEE-754 32位浮点型数,
float64 IEEE-754 64位浮点型数
浮点数字面量会被自动推断为 float64。
2.3复数
包括两种,complex64 32 位实数和虚数,complex128 64 位实数和虚数。
complex:构造一个复数。real:获取复数的实部。imag:获取复数的虚部。
c = complex(re, im)
函数 real(c) 和 imag(c) 可以分别获得相应的实数和虚数部分。
2.4其他
byte 类似 uint8;rune 类似 int32;uint 32 或 64 位;int 与 uint 一样大小;uintptr 无符号整型,用于存放一个指针。
3字符串类型
字符串是 UTF-8 字符的一个序列。字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲, 字符串是字节的定长数组。
是一个任意字节的常量序列。[] byte类型字节数组。
字符串字面量使用双引号 "" 或者反引号 ' 来创建。双引号用来创建可解析的字符串, 支持转义,但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。
3.1字符串切片截取:
以通过标准索引法来获取,在中括号 [] 内写入索引,索引从 0 开始计数。
注意:
- 获取字符串中某个字节的地址的行为是非法的,例如: &str[i]。
- 可以用==和<进行比较;比较通过逐个字节比较完成的。
- 字符串的值是不可变的,可以给一个字符串变量分配一个新字符串值。尝试修改字符串内部数据的操作也是被禁止。
3.2字符串拼接+
两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。
拼接的简写形式 += 也可以用于字符串。
02变量与常量声明赋值
在命名方面参考00章节里的命名规则
1变量
1.1一般形式:
var identifier type = expression
一次声明多个的时候:
var identifier1, identifier2 type = expression1, expression2
和C系不同,类型是跟在变量名后面的。
类型和表达式可以省略一个,但不能都省略。可以自行推断,默认初始化值为对应类型的零值,数字是 0,布尔值是 false,字符串是 "",接口和引用(slice,指针,map,通道,函数)是 nil,对于数组或结构体这样的复合类型,零值是其所有元素或成员的零值。
1.2短变量声明
在函数内部,可以使用更简略的:=方式声明并初始化变量。注意只能函数内部,外部不可以使用。
name := xlin
多个变量:
num, str := 5, "alwaysbeta"
多个变量声明时,最少有一个新变量,否则会报错。
var i int
// i := 100 // 报错
i, j := 100, 101 // 有新值 j,不报错
1.3匿名变量
如果想要忽略某个值,可以使用匿名变量(anonymous variable)。 匿名变量用一个下划线_表示,就是不使用这个变量,忽略这个变量,下划线表示变量名称。
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。
func getInfo() (string, int) {
return "xlin", 2023 }
func main() {
name, _ := getInfo()
_, age := getInfo()
}
1.4变量赋值 =
var m, n int
m = 9
n = 10
m, n = n, m
最后一行, m,n 的值进行互换
1.5注意
函数外的每个语句都必须以关键字开始(var、const、func等)
:=不能使用在函数外。
_多用于占位,表示忽略值。
2常量
在程序运行时,不会被修改的量。
2.1一般形式
const identifier [type]= value
你可以省略类型说明符 [type]
显式类型定义: const b string = "abc"
隐式类型定义: const b = "abc"
多个相同类型的声明可以简写为:
const c_name1, c_name2 = value1, value2
常量的值必须是能够在编译时就能够确定的,在编译期间自定义函数均属于未知,因此无法用于常量的赋值,但内置函数可以使用,如:len()。
数字型的常量是没有大小和符号的,并且可以使用任何精度而不会导致溢出。
const Ln2= 0.693147180559945309417232121458\
176568075500134360255254120680009
反斜杠 \ 可以在常量表达式中作为多行的连接符使用。
常量也允许使用并行赋值的形式:
const beef, two, c = "eat", 2, "veg"
const Monday, Tuesday, Wednesday = 1, 2, 3
const (
Monday, Tuesday = 1, 2
Saturday = 6
)
定义多个常量时,如果省略了值,则和第一个值相同
const (
A = 10
B
)
//A=10,B=10
常量还可以用作枚举:
const (
Unknown = 0
Female = 1
Male = 2
)
数字 0、1 和 2 分别代表未知性别、女性和男性。这些枚举值可以用于测试某个变量或常量的实际值。
2.2iota
iota是go语言的常量计数器,只能在常量的表达式中使用。iota在const关键字出现时将被重置为0。const 中每新增一行常量声明将使iota计数一次。
第一个iota等于0,每当iota在新的一行被使用时,它的值都会自动加1。
const (
a = iota //0
b //1
c //2
)
iota 在每个 const 开头被重置为 0。
const x = iota // 0
const y = iota // 0
多个 iota 定义在一行
const (
a, b = iota + 1, iota + 2 //1,2
c, d //2,3
e, f //3,4
)
使用下划线_跳过某些值
const (
a = iota //0
_ = iota //1 丢弃该值,常用在错误处理中
c = iota //2
)