Go基础语法学习笔记
Tips: 新手向文章,其中涉及的代码你可以在 Https://github.com/fishcanf1y/Programming=Learning/Golang/ 中找到
Hello World:
package main
import "fmt"
func main() {
fmt.Printf("Hello World\n")
// go run hello.go
}
在第一行代码中 package main
定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main
。 package main
表示一个可独立执行的程序,每个 Go
应用程序都包含一个名为 main
的包。
下一行 import "fmt"
告诉 Go 编译器这个程序需要使用 fmt
包(的函数,或其他元素),fmt
包实现了格式化 IO(输入/输出)
的函数。
下一行 func main()
是程序开始执行的函数。main
函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init()
函数则会先执行该函数)。
下一行 fmt.Println(...)
可以将字符串输出到控制台,并在最后自动增加换行字符 \n
。
使用 fmt.Print("hello, world\n")
可以得到相同的结果。Print
和 Println
这两个函数也支持使用变量,如:fmt.Println(arr)
。如果没有特别指定,它们会以默认的打印格式将变量 arr
输出到控制台。
当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
Attention:{
不能单独放在一行,所以以下代码在运行时会产生错误:
package main
import "fmt"
func main()
{ // 错误,{ 不能在单独的行上
fmt.Println("Hello, World!")
}
关于包:
关于包,在本地测试得到以下几点
- 文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
- 同一个文件夹下的文件只能有一个包名,否则编译报错。
测试:
文件结构:
Test
--helloworld.go
myMath
--myMath1.go
--myMath2.go
测试代码:
// helloworld.go
package main
import (
"./myMath"
"fmt"
)
func main() {
fmt.Println("Hello World!")
fmt.Println(mathClass.Add(1, 1))
fmt.Println(mathClass.Sub(1, 1))
}
// myMath1.go
package mathClass
func Add(x int, y int) int {
return x + y
}
// myMath2.go
package mathClass
func Sub(x int, y int) int {
return x - y
}
Go标记
Go程序可以由多个标记组成,可以是关键字、标识符、常量、字符串和符号等。如以下程序由6个标记组成:
fmt.Printf("Hello World!")
6个标记分别是这些
1. .fmt
2. .
3. Printf
4. (
5. "Hello World!"
6. )
行分隔符
在Go程序中,一行代表一个语句结束,每一个语句不需要像C家族的语言中添加分号,如果打算将多个语句写在同一行,它们则必须使用 ;
以人为区分,实际开发中并不鼓励这种做法。
This is am example:
fmt.Println("Hello, World!")
fmt.Println("Hello, Golang!")
注释
注释的内容不会被编译,单行注释是最常见的注释形式,你可以在任何地方使用以 //
开头的单行注释。多行注释也叫块注释,均已以 /*
开头,并以 */
结尾。如:
// 单行注释
/*
Author by fishcanf1y
我是多行注释
*/
标识符
标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(AZ和az)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
以下是有效的标识符:
mahesh kumar abc move_name a_123
myname50 _temp j a23b9 retVal
以下是无效的标识符:
- 1ab(以数字开头)
- case(Go 语言的关键字)
- a+b(运算符是不允许的)
字符串链接
Go语言的字符串连接可以通过+
来实现:
package main
import "fmt"
func main() {
fmt.Println("Hello" + "Google")
}
关键字
以下列举Go代码中会使用到的25个关键字或保留字:
Keywords | Description |
---|---|
break | 终止最内层的for或switch语句 |
default | switch语句中的默认分支 |
func | 定义函数 |
interface | 定义接口 |
select | 多路复用操作 |
case | switch语句的分支 |
defer | 延迟执行 |
go | 启动新的goroutine |
map | 映射类型 |
struct | 结构体定义 |
chan | 通道类型 |
else | if-else语句中的备选分支 |
goto | 无条件跳转到标签 |
package | 包声明 |
switch | 分支控制结构 |
const | 常量定义 |
fallthrough | 继续执行下一case或default |
if | 条件判断 |
range | 迭代操作 |
type | 类型定义 |
continue | 跳过当前循环,继续下一次循环 |
for | 循环控制结构 |
import | 包引入 |
return | 函数返回 |
var | 变量声明 |
除以上所介绍的关键字,Go语言还有36个预定义标识符:
Keywords | Description |
---|---|
append | 添加元素到切片 |
bool | 布尔类型 |
byte | 字节类型 |
cap | 获取切片的容量 |
close | 关闭通道 |
complex | 复数类型 |
complex64 | 32位复数类型 |
complex128 | 64位复数类型 |
uint16 | 无符号16位整数类型 |
copy | 拷贝切片或数组 |
false | 布尔值,假 |
float32 | 单精度浮点数类型 |
float64 | 双精度浮点数类型 |
imag | 获取复数的虚部 |
int | 整型 |
int8 | 8位有符号整数类型 |
int16 | 16位有符号整数类型 |
uint32 | 无符号32位整数类型 |
int32 | 32位有符号整数类型 |
int64 | 64位有符号整数类型 |
iota | 常量生成器 |
len | 获取切片或字符串的长度 |
make | 创建并初始化类型 |
new | 分配零值内存 |
nil | 空值 |
panic | 引发运行时错误 |
uint64 | 无符号64位整数类型 |
打印输出 | |
println | 打印并换行 |
real | 获取复数的实部 |
recover | 恢复panic引起的错误 |
string | 字符串类型 |
true | 布尔值,真 |
uint | 无符号整数类型 |
uint8 | 无符号8位整数类型 |
uintptr | 无符号指针类型 |
Go语言中的空格
在 Go 语言中,空格通常用于分隔标识符、关键字、运算符和表达式,以提高代码的可读性。
Go 语言中变量的声明必须使用空格隔开,如:
var x int
const Pi float64 = 3.14159265358979323846
在运算符和操作数之间要使用空格能让程序更易阅读
无空格:
fruit=apples+oranges;
在关键字和表达式之间要使用空格。
例如:
if x > 0 {
// do something
}
在函数调用时,函数名和左边等号之间要使用空格,参数之间也要使用空格。
例如:
result := add(2, 3)
格式化字符串
Go 语言中使用 fmt.Sprintf
或 fmt.Printf
格式化字符串并赋值给新串:
Sprintf
根据格式化参数生成格式化的字符串并返回该字符串。Printf
根据格式化参数生成格式化的字符串并写入标准输出。
Sprintf示例:
package main
import (
"fmt"
)
func main() {
// %d 表示整型数字,%s 表示字符串
var stockcode=123
var enddate="2025-07-11"
var url="Code=%d&endDate=%s"
var target_url=fmt.Sprintf(url,stockcode,enddate)
fmt.Println(target_url)
}
输出结果为:
Code=123&endDate=2025-07-11
Printf示例:
package main
import (
"fmt"
)
func main() {
var stockcode = 123
var enddate = "2025-07-11"
var url = "Code=%d&endDate=%s"
fmt.Printf(url, stockcode, enddate)
}
输出结果为:
Code=123&endDate=2025-07-11