Go 语言入门基础学习笔记之 Go 语言的基础语法与数据类型
基础语法#
Go 标记#
Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。
行分隔符#
在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ;
结尾,因为这些工作都将由 Go 编译器自动完成。
如果你打算将多个语句写在同一行,它们则必须使用;人为区分,但在实际开发中并不鼓励这种做法。
注释#
// 单行注释
/*
多行注释 / 块注释
*/
与 C 语言一致。
标识符#
标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母 (A~Z 和 a~z) 数字 (0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
这与大多数编程语言的规范一样
比如,mahesh
、kumar
、abc
、move_name
、a_123
、myname50
、_temp
、j
、a23b9
、retVal
都是有效标识符。1ab
以数字开头、case
关键字、a+b
其他字符等都是无效字符。
字符串拼接#
Go 语言的字符串连接可以通过 +
实现。
fmt.Println("Google" + "Runoob")
关键字#
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 语言还有 36 个预定义标识符
append | bool | byte | cap | close | complex |
copy | false | float 32 | float 64 | imag | int |
int 32 | int 64 | iota | len | make | new |
println | real | recover | string | true | |
complex 64 | complex 128 | uint 16 | int 16 | uint 32 | uintptr |
panic | uint 8 | uint 64 | int 8 | uint | nil |
Go 语言中的空格#
在 Go 语言中,空格通常用于分隔标识符、关键字、运算符和表达式,以提高代码的可读性。
变量的声明必须使用空格隔开
var x int
const Pi float64 = 3.14159265358979323846
变量与运算符之间推荐加入空格,程序看起来更加美观
var z int = x + y
关键字和表达式之间必须使用空格隔开
if x > 0 {
// do something
}
在函数调用时,函数名和左边等号之间要使用空格,参数之间也要使用空格
result := add(2, 3)
格式化字符串#
Go 语言中使用 fmt.Sprintf
或 fmt.Printf
格式化字符串并赋值给新串:
Sprintf
根据格式化参数生成格式化的字符串并返回该字符串。Printf
根据格式化参数生成格式化的字符串并写入标准输出。
package main
import (
"fmt"
)
func main() {
// %d 表示整型数字,%s 表示字符串
var stockcode=123
var enddate="2024-10-25"
var url="Code=%d&endDate=%s"
var target_url=fmt.Sprintf(url,stockcode,enddate)
fmt.Println(target_url)
fmt.Printf(url,stockcode,enddate)
}
// 输出结果
Code=123&endDate=2024-10-25
Code=123&endDate=2024-10-25
补充:fmt 包中各种输出方法的区别
fmt.Print
原样输出fmt.Printf
格式化输出fmt.Println
各个值之间加空格,末尾加换行
Go 语言中还有一些内建函数,如
println()
和print()
,不属于任何包,直接可以使用。只能简单地输出参数,不支持格式化,通常只用于简单的调试目的。
println()
和print()
与 fmt 中的fmt.Println
和fmt.Print
区别一样。
fmt.Print("go","python","php","javascript") // gopythonphpjavascript
fmt.Println("go","python","php","javascript") // go python php javascript
fmt.Printf("go %d", 1) // go 1
println("Hello Go!") // Hello Go!
数据类型#
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
Go 语言按类别分为以下几种数据类型:
- 布尔类型:值只可以是常量 true 或者 false
- 数字类型:Go 语言支持整型和浮点型数字,并支持复数,其中位运算采用补码
- 字符串型:Go 语言字符串是由单个字节连接起来的,字符串的字节使用 UTF-8 或 Unicode 编码
- 派生类型:
- 指针 Pointer
- 数组
- 结构化
- 通道 Channel
- 函数 Function
- 切片 Slice
- 接口
- 集合 Map
引用类型: 切片 Slice、指针、集合 Map、通道 Channel、函数
数字类型:
整型:Go 也有基于架构的类型,例如:int、uint 和 uintptr
类型 | 描述 |
---|---|
uint 8 | 无符号 8 位整型 (0 到 255) |
uint 16 | 无符号 16 位整型 (0 到 $2^{16}-1$) |
uint 32 | 无符号 32 位整型 (0 到 $2^{32}-1$) |
uint 64 | 无符号 64 位整型 (0 到 $2^{64}-1$) |
int 8 | 有符号 8 位整型 (-128 到 127) |
int 16 | 有符号 16 位整型 ($-2^{15}$ 到 $-2^{15}-1$) |
int 32 | 有符号 32 位整型 ($-2^{31}$ 到 $2^{31}-1$) |
int 64 | 有符号 64 位整型 ($-2^{63}$ 到 $2^{63}-1$) |
在 Go 中
int
是一个不定长的类型,取决于当前计算机的机器字长。如果当前计算机为 64 位,则int
类型也是 64 位,虽然你这与int64
的长度是一样的,但是他们依旧是不同的两种数据类型。
浮点型:
类型 | 描述 |
---|---|
float 32 | IEEE-754 32 位浮点数 |
float 64 | IEEE-754 64 位浮点数 |
complex 64 | 32 位实数和虚数 |
complex 128 | 64 位实数和虚数 |
其他数字类型:
类型 | 描述 |
---|---|
byte | 类似 uint 8 |
rune | 类似 int 32 |
uint | 32 或 64 位 |
int | 与 uint 一样大小 |
uintptr | 无符号整型,用于存放一个指针 |
Go 语言可以通过格式化字符串
%T
打印出数据类型
fmt.Printf("type: %T\n", a)
浮点精度问题
浮点数计算输出有一定的偏差,你也可以转整型来设置精度。
package main
import (
"fmt"
)
func main() {
a := 1.69
b := 1.7
c := a * b // 结果应该是2.873
fmt.Println(c) // 输出的是2.8729999999999998
}
设置精度
package main
import (
"fmt"
)
func main() {
a := 1690 // 表示1.69
b := 1700 // 表示1.70
c := a * b // 结果应该是2873000表示 2.873
fmt.Println(c) // 内部编码
fmt.Println(float64(c) / 1000000) // 显示
}