diff --git a/day01/README.md b/day01/README.md index 41595aa..525ddd4 100644 --- a/day01/README.md +++ b/day01/README.md @@ -19,7 +19,6 @@ + [第一个程序](./hello_world/README.md) + [开发环境搭建](./env/README.md) + [基础语法](./syntax/README.md) -+ 基础类型 -+ 变量常量与值 -+ 变量作用域 ++ [基础类型](./base_type/README.md) ++ [变量作用域](./scope/README.md) + 运算符 diff --git a/day01/base_type/README.md b/day01/base_type/README.md new file mode 100644 index 0000000..16dd0ef --- /dev/null +++ b/day01/base_type/README.md @@ -0,0 +1,158 @@ +# 基础类型 + +在Go中所有变量都是有类型的, 比如前面的int, string, float32 这些, 因此在接下来我们将先讲解下Go的基础类型 + +静态: 变量值是有类型, 这个变量里面 只能放这个类型的值 + +go在语言成面定义了如下几种基础类型: + ++ 整形 12345 ++ 浮点型 123.45 ++ 复数 123.45i ++ 字符 'a' ++ 字符串 "abc" ++ 布尔类型 true, false ++ 枚举类型 iota ++ 自定义类型 + +## 字面量(值) + +字面量是值的表示方法,常用与对变量/常量进行初始化,主要分为: + ++ 标识基础数据类型值的字面量,例如:0, 1.1, true, 3 + 4i, 'a', "我爱中国" ++ 构造自定义的复合数据类型的类型字面量,例如:type Interval int ++ 用于表示符合数据类型值的复合字面量,用来构造 array、slice、map、struct 的值, +例如:{1, 2, 3} + +## 整形(整数) + +```go +var age = 99 +``` + +| 类型名 | 字节宽度 | 取值范围 | +| ---- | ---- | --- | +|int |与平台有关| 32 位系统 4 字节,64 位系统 8 字节 有符号整型| +|uint | 与平台有关|32 位 系统 4 字节,64 位 系统 8 字节 无符号整形| +|int8 |1 字节| 用 8 位表示的有符号整型 取值范围为:[-128, 127]| +|int16 |2 字节| 用 16 位表示的有符号整型 取值范围为:[-32768,32767]| +|int32 | 4 字节 | 用 32 位表示的有符号整型,取值范围为:[-2147483648,2147483647] | +|int64 |8 字节 |用 64 位表示的有符号整型,取值范围为:[-9223372036854775808,9223372036854775807]| +|uint8 |1 字节 | 用 8 位表示的无符号整型,取值范围为:[0,255]| +|uint16 |2 字节 | 用 16 位表示的无符号整型,取值范围为:[0,65535]| +|uint32 |4 字节 | 用 32 位表示的无符号整型,取值范围为:[0,4294967295]| +|uint64 | 8 字节 | 用 64 位表示的无符号整型,取值范围为:[0,18446744073709551615] | +|uintptr |与平台有关|32 位系统 4 字节,64 位系统 8 字节指针值的无符号整型| + + +## 浮点(小数) + +```go +var score = 99.5 +``` + +| 类型名 | 字节宽度 | 取值范围 | +| ---- | ---- | --- | +| float32| 4字节 | IEEE-754 32位浮点型数| +| float64| 8字节 | IEEE-754 64位浮点型数| +| complex64| 8字节| 由两个 float32 组成的复数(实部+虚部)| +| complex128| 16字节| 由两个 float64 组成的复数(实部+虚部)| + + +## 别名 + +```go +a := []byte{} + +// %+v 打印结构体字段名 +// [] +fmt.Printf("%+v \n", a) + +// 字符采用unicode编码, 这里的 值得这个字符串编码是 97 +b := 'a' +fmt.Printf("%+v", b) +``` + +```go +// 用于描述字节, []byte{}, 就是字节流 +// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is +// used, by convention, to distinguish byte values from 8-bit unsigned +// integer values. +type byte = uint8 + +// rune is an alias for int32 and is equivalent to int32 in all ways. It is +// used, by convention, to distinguish character values from integer values. +type rune = int32 +``` + +| 类型名 | 字节宽度 | 取值范围 | +| ---- | ---- | --- | +|byte |1 字节| 字节类型,取值范围同 uint8| +|rune |4 字节| Unicode 码点 取值范围同 uint32| + +## 字符串类型 + +```go +name := "bob" +``` + +Go 语言内置了字符串类型,使用 string 表示 + +字面量: + ++ 可解析字符串:通过双引号(")来创建,不能包含多行,支持特殊字符转义序列 ++ 原生字符串:通过反引号(`)来创建,可包含多行,不支持特殊字符转义序列 + +特殊字符: + ++ \\:反斜线 ++ \':单引号 ++ \":双引号 ++ \a:响铃 ++ \b:退格 ++ \f:换页 ++ \n:换行 ++ \r:回车 ++ \t:制表符 ++ \v:垂直制表符 ++ \ooo:3 个 8 位数字给定的八进制码点的 Unicode 字符(不能超过\377) ++ \uhhhh:4 个 16 位数字给定的十六进制码点的 Unicode 字符 ++ \Uhhhhhhhh:8 个 32 位数字给定的十六进制码点的 Unicode 字符 ++ \xhh:2 个 8 位数字给定的十六进制码点的 Unicode 字符 + +## 布尔类型 + +布尔类型用于表示真假,类型名为 bool,只有两个值 true 和 false,占用一个字节宽度,零值为 false +```go +var ( + IsBoy = true + IsGirl = true +) + +// if IsBoy {} +``` + +## 自定义类型与枚举类型 + +在 go 语言中使用 type 声明一种新的类型,语法格式为: type TypeName Formatter + +比如我们可以定义自己 +```go +type Gender string +``` + +常使用 iota 生成器用于初始化一系列相同规则的常量,批量声明常量的第一个常量使用 +iota 进行赋值,此时 iota 被重置为 0,其他常量省略类型和赋值,在每初始化一个常量则 +加 1 + +```go +// 自定义类型 +type Status string + +const ( + // 自定义类型的值,常量不允许修改, 充当枚举(可选项) + STATUS_ONLINE Status = "online" + STATUS_OFFLINE Status = "offline" + STATUS_UNKNOW Status = "unknow" +) +``` \ No newline at end of file diff --git a/day01/base_type/main.go b/day01/base_type/main.go new file mode 100644 index 0000000..622e186 --- /dev/null +++ b/day01/base_type/main.go @@ -0,0 +1,41 @@ +package main + +import "fmt" + +// 自定义类型 +type Status string + +const ( + // 自定义类型的值,常量不允许修改, 充当枚举(可选项) + STATUS_ONLINE Status = "online" + STATUS_OFFLINE Status = "offline" + STATUS_UNKNOW Status = "unknow" +) + +func main() { + a := []byte{} + + // %+v 打印结构体字段名 + // [] + fmt.Printf("%+v \n", a) + + // 字符采用unicode编码, 这里的 值得这个字符串编码是 97 + b := 'a' + fmt.Printf("%+v\n\\n", b) + + name := "bob \"引号\"" + // 用于格式化 string类型的值 + fmt.Printf("hello, %+v\n", name) + + multiLine := `这是一个多行字符串 +可以包含换行符号 + 也可以包含 "双引号" + 还可以包含 '单引号'` + fmt.Printf("\n%+v", multiLine) + + // 判断变量是否online + status := STATUS_UNKNOW + if status == STATUS_ONLINE { + + } +} diff --git a/day01/scope/README.md b/day01/scope/README.md new file mode 100644 index 0000000..2683b46 --- /dev/null +++ b/day01/scope/README.md @@ -0,0 +1,2 @@ +# 变量作用域 + diff --git a/day01/syntax/README.md b/day01/syntax/README.md index fa080d3..129689d 100644 --- a/day01/syntax/README.md +++ b/day01/syntax/README.md @@ -91,16 +91,8 @@ func main() { } ``` -## Go的基础类型(基础数据结构) - - - - - - - - +## 关键字 (拓展) 在这个结构里面必须要符合Go程序的语法, 编写出来的程序才是合法的,才能被编译器识别, 编译器识别代码的基础单位是Lexical Token(词法标记),比如 如下一段代码: ```go @@ -110,7 +102,7 @@ func main() { ``` 他包含的Lexical Token(词法标记),有如下12个: -``` +```go func // 关键字 func main // 标识符 函数名称 ( // LPAREN 左小括号 @@ -123,4 +115,112 @@ Println // 标识符 函数名称 ) // RPAREN 右小括号 } // RBRACE 右花括号 // (此处无多余 token,上一行已闭合) +``` + +go 语言支持的所有词法标记如下: +```go +var tokens = [...]string{ + // 特殊词法 + ILLEGAL: "ILLEGAL", + EOF: "EOF", + COMMENT: "COMMENT", + + // 标识符 + IDENT: "IDENT", + + // 基本类型 + INT: "INT", + FLOAT: "FLOAT", + IMAG: "IMAG", + CHAR: "CHAR", + STRING: "STRING", + + // 操作符(节选) + ADD: "+", + SUB: "-", + MUL: "*", + QUO: "/", + REM: "%", + + AND: "&", + OR: "|", + XOR: "^", + SHL: "<<", + SHR: ">>", + AND_NOT: "&^", + + ADD_ASSIGN: "+=", + SUB_ASSIGN: "-=", + MUL_ASSIGN: "*=", + QUO_ASSIGN: "/=", + REM_ASSIGN: "%=", + + AND_ASSIGN: "&=", + OR_ASSIGN: "|=", + XOR_ASSIGN: "^=", + SHL_ASSIGN: "<<=", + SHR_ASSIGN: ">>=", + AND_NOT_ASSIGN: "&^=", + + LAND: "&&", + LOR: "||", + ARROW: "<-", + INC: "++", + DEC: "--", + + EQL: "==", + LSS: "<", + GTR: ">", + ASSIGN: "=", + NOT: "!", + + NEQ: "!=", + LEQ: "<=", + GEQ: ">=", + DEFINE: ":=", + ELLIPSIS: "...", + + LPAREN: "(", + LBRACK: "[", + LBRACE: "{", + COMMA: ",", + PERIOD: ".", + + RPAREN: ")", + RBRACK: "]", + RBRACE: "}", + SEMICOLON: ";", + COLON: ":", + + // 25个关键字 + BREAK: "break", + CASE: "case", + CHAN: "chan", + CONST: "const", + CONTINUE: "continue", + + DEFAULT: "default", + DEFER: "defer", + ELSE: "else", + FALLTHROUGH: "fallthrough", + FOR: "for", + + FUNC: "func", + GO: "go", + GOTO: "goto", + IF: "if", + IMPORT: "import", + + INTERFACE: "interface", + MAP: "map", + PACKAGE: "package", + RANGE: "range", + RETURN: "return", + + SELECT: "select", + STRUCT: "struct", + SWITCH: "switch", + TYPE: "type", + VAR: "var", +} ``` \ No newline at end of file