Go语言入门2：基础语法

Go 语言入门基础学习笔记之 Go 语言的基础语法与数据类型

基础语法

Go 标记

Go 程序可以由多个标记组成，可以是关键字，标识符，常量，字符串，符号。

行分隔符

在 Go 程序中，一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾，因为这些工作都将由 Go 编译器自动完成。

如果你打算将多个语句写在同一行，它们则必须使用；人为区分，但在实际开发中并不鼓励这种做法。

注释

Copy
// 单行注释
/*
多行注释 / 块注释
*/

与 C 语言一致。

标识符

标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母 (A~Z 和 a~z) 数字 (0~9)、下划线_组成的序列，但是第一个字符必须是字母或下划线而不能是数字。

这与大多数编程语言的规范一样

比如，mahesh 、kumar、abc、move_name、a_123、myname50、_temp、j、a23b9、retVal 都是有效标识符。1ab 以数字开头、case 关键字、a+b 其他字符等都是无效字符。

字符串拼接

Go 语言的字符串连接可以通过 + 实现。

Copy
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
print | 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 语言中，空格通常用于分隔标识符、关键字、运算符和表达式，以提高代码的可读性。

变量的声明必须使用空格隔开

Copy
var x int
const Pi float64 = 3.14159265358979323846

变量与运算符之间推荐加入空格，程序看起来更加美观

Copy
var z int = x + y

关键字和表达式之间必须使用空格隔开

Copy
if x > 0 {
// do something
}

在函数调用时，函数名和左边等号之间要使用空格，参数之间也要使用空格

Copy
result := add(2, 3)

格式化字符串

Go 语言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并赋值给新串：

Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。

Printf 根据格式化参数生成格式化的字符串并写入标准输出。

Copy
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 区别一样。

Copy
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 打印出数据类型

Copy
fmt.Printf("type: %T\n", a)

浮点精度问题

浮点数计算输出有一定的偏差，你也可以转整型来设置精度。

Copy
package main
import (
"fmt"
)
func main() {
a := 1.69
b := 1.7
c := a * b // 结果应该是2.873
fmt.Println(c) // 输出的是2.8729999999999998
}

设置精度

Copy
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) // 显示
}