Go的程序结构+基础语法+数据类型
-
- 一、Go程序整体结构
-
- [1.1 组成概述](#1.1 组成概述)
- [1.2 各模块详解+示例](#1.2 各模块详解+示例)
-
- [(1)package 包声明](#(1)package 包声明)
- [(2)import 导入依赖包](#(2)import 导入依赖包)
- [(3)func 函数定义](#(3)func 函数定义)
- (4)注释
- (5)标识符大小写访问规则
- [1.3 程序运行两种方式](#1.3 程序运行两种方式)
- 二、Go基础语法
-
- [2.1 标记与行分隔规则](#2.1 标记与行分隔规则)
- [2.2 标识符命名规范](#2.2 标识符命名规范)
- [2.3 Go关键字(25个保留字,不能用作标识符)](#2.3 Go关键字(25个保留字,不能用作标识符))
- [2.4 字符串拼接与格式化输出](#2.4 字符串拼接与格式化输出)
- [2.5 代码空格规范](#2.5 代码空格规范)
- 三、Go基础数据类型
-
- [3.1 布尔类型 bool](#3.1 布尔类型 bool)
- [3.2 数值类型](#3.2 数值类型)
-
- [3.2.1 整型(分有符号/无符号)](#3.2.1 整型(分有符号/无符号))
- [3.2.2 浮点型](#3.2.2 浮点型)
- 踩坑
- [3.3 string字符串](#3.3 string字符串)
- [3.4 派生类型](#3.4 派生类型)
一、Go程序整体结构
1.1 组成概述
一个完整可运行Go程序由包声明、导包、函数、变量、语句表达式、注释 6部分构成,可执行程序必须包含package main与main()入口函数。
1.2 各模块详解+示例
(1)package 包声明
- 说明 :源文件首行必须写包声明,
package main代表可执行程序;非main包为依赖库包,无法单独运行。同一文件夹下所有go文件包名必须统一,文件名、文件夹名和包名无强制一致要求。 - 示例
go
// 当前文件属于main包,可编译成程序
package main
go
// 自定义工具包,只能被其他文件导入调用
package util
- 踩坑 :同一个目录多个文件写不同包名,编译直接报错;可执行项目漏掉
package main无法生成二进制文件。
(2)import 导入依赖包
- 说明 :引入程序需要使用的系统/第三方包,
fmt是标准输入输出内置包。支持单行导入、括号批量导入两种写法。 - 示例
go
// 单行导入
import "fmt"
// 批量导入(工程常用规范写法)
import (
"fmt"
"strings"
)
- 踩坑:导入未使用的包代码直接编译报错;相对路径导入自定义包路径书写错误。
(3)func 函数定义
- 说明 :
func main()是程序执行入口,程序运行自动优先执行main;存在init()函数时,init在main之前自动执行。 - 示例
go
package main
import "fmt"
// 初始化函数,优先于main执行
func init() {
fmt.Println("init优先执行")
}
// 程序主入口
func main() {
fmt.Println("main函数执行")
}
- 踩坑 :可执行程序缺少main函数,
go run编译失败;main不允许设置入参和返回值。
(4)注释
- 说明 :分为单行
//、多行块注释/* */,注释不参与编译执行,用于代码说明。 - 示例
go
// 单行注释:定义程序入口
/*
多行注释
用于批量注释代码、包文档说明
*/
func main(){}
- 踩坑:块注释不能嵌套;注释符号中英文混用报错。
(5)标识符大小写访问规则
- 说明 :标识符首字母大写=导出(public,包外可访问) ;首字母小写=私有(private,仅当前包可用),Go控制访问权限唯一规则。
- 示例
go
package util
// 大写,外部包导入后可调用
func Add(a,b int)int{return a+b}
// 小写,仅util包内可用
func sub(a,b int)int{return a-b}
- 踩坑:外部包调用小写函数,编译提示标识符未定义。
1.3 程序运行两种方式
| 命令 | 作用 | 使用场景 | 示例 |
|---|---|---|---|
| go run xxx.go | 直接内存运行,不生成二进制 | 调试代码 | go run main.go |
| go build | 编译生成对应系统可执行文件 | 打包发布 | go build && ./main(Mac/Linux)、go build && main.exe(Windows) |
- 踩坑 :
{大括号不能单独换行,换行直接语法报错
go
// 错误写法:{单独起行
func main()
{
}
// 正确写法:{紧跟函数末尾
func main(){
}
二、Go基础语法
2.1 标记与行分隔规则
说明
- Go代码由关键字、标识符、字符串、运算符、符号组成;
- 单行默认自动结束,无需分号;,仅一行多语句时手动加分号分隔,开发不推荐一行多代码。
示例
go
// 常规写法,不用分号
fmt.Println("aaa")
fmt.Println("bbb")
// 一行多语句手动加分号(不推荐)
fmt.Println("a");fmt.Println("b")
踩坑:习惯性每行末尾加分号,代码无语法错误但不符合Go编码规范。
2.2 标识符命名规范
说明
标识符(变量名、函数名):只能由**字母、数字、下划线_**组成,首字符不能为数字,不能使用系统关键字。
- 合法:
userName、_num、age123 - 非法:
1name、a+b、case(case是关键字)
踩坑:标识符带特殊符号、数字开头直接语法报错。
2.3 Go关键字(25个保留字,不能用作标识符)
break default func interface select
case defer go map switch
chan else goto package type
const fallthrough if range var
continue for import return
预定义内置标识符(36个):bool、byte、int、string、nil、make、len等,可自定义但不建议覆盖。
2.4 字符串拼接与格式化输出
1)字符串拼接:+
go
package main
import "fmt"
func main(){
str := "Go"+"入门学习"
fmt.Println(str)
}
2)格式化函数
fmt.Printf(格式,变量):直接控制台打印fmt.Sprintf(格式,变量):拼接字符串并返回,不打印- 常用占位:
%d整型、%s字符串、%f浮点
go
package main
import "fmt"
func main() {
code := 1001
name := "张三"
// 拼接赋值
s := fmt.Sprintf("编号:%d,姓名:%s", code, name)
fmt.Println(s)
// 直接打印
fmt.Printf("编号:%d,姓名:%s", code, name)
}
踩坑:占位符和变量类型不匹配(%d传字符串),运行输出异常数据。
2.5 代码空格规范
- 变量声明、运算符前后加空格:
var age int = 18,禁止age=18; - 关键字后加空格:
if age>0→if age > 0; - VSCode保存自动gofmt格式化,不用手动调整空格。
三、Go基础数据类型
Go数据类型分为:布尔型、数字型、字符串、派生类型(指针、数组、切片、map、struct、chan等)
3.1 布尔类型 bool
- 说明 :只有两个值
true/false,占用1字节,用于条件判断。 - 示例
go
package main
import "fmt"
func main(){
var flag bool = true
fmt.Println(flag)
}
- 踩坑 :Go布尔不能和数字0/1互相强制转换,
flag = 1直接报错。
3.2 数值类型
3.2.1 整型(分有符号/无符号)
| 类型 | 取值范围 | 备注 |
|---|---|---|
| int8 | -128~127 | 有符号8位 |
| uint8(byte) | 0~255 | 无符号8位,byte别名uint8 |
| int/uint | 系统位数 | Mac64位=64位整型,跨平台慎用 |
| rune | 等价int32 | 存储单个中文/Unicode字符 |
日常开发优先使用
int,不用刻意指定int8/int16。
3.2.2 浮点型
- float32、float64,默认浮点常量识别为float64
go
var f float64 = 3.1415
踩坑
- uint无符号变量赋值负数,编译报错;
- 浮点运算存在精度丢失,不适合金额计算。
3.3 string字符串
- 说明:Go字符串固定长度,UTF-8编码存储中文,不可直接修改单个字符。
- 示例
go
var s string = "Go学习"
// 拼接
s2 := s + "数据类型"
- 踩坑 :不能通过下标修改字符串单个字符,
s[0]='A'编译报错。
3.4 派生类型
- 指针:存放变量内存地址;
- 数组:固定长度连续空间;切片slice:动态变长数组;
- struct结构体:自定义复合数据(类似Java实体类);
- map:键值对字典;chan:Go协程通信管道。