Go03-基础语法与数据类型
第2章:基础语法与数据类型
2.1 变量声明
Go 是静态类型语言,变量在声明时必须确定类型。
基本声明方式
// 方式1:完整声明varnamestringvarageintvarisActivebool// 方式2:声明并初始化varnamestring="张三"varageint=25varisActivebool=true// 方式3:类型推断(推荐)varname="张三"// 自动推断为 stringvarage=25// 自动推断为 int短变量声明(函数内部)
funcmain(){// := 只能在函数内部使用name:="张三"age:=25isActive:=truefmt.Println(name,age,isActive)}多变量声明
// 批量声明var(namestring="张三"ageint=25heightfloat64=175.5)// 同类型批量声明varx,y,zint=1,2,3常量
// 常量声明constPi=3.14159constMaxRetries=3// 批量常量const(StatusOK=200StatusError=500)// iota 枚举器const(Sunday=iota// 0Monday// 1Tuesday// 2Wednesday// 3Thursday// 4Friday// 5Saturday// 6)// iota 运算const(_=iota// 0,忽略KB=1<<(10*iota)// 1 << 10 = 1024MB// 1 << 20 = 1048576GB// 1 << 30)2.2 基本数据类型
整数类型
| 类型 | 位数 | 范围 |
|---|---|---|
int8 | 8位 | -128 到 127 |
int16 | 16位 | -32768 到 32767 |
int32 | 32位 | -2^31 到 2^31-1 |
int64 | 64位 | -2^63 到 2^63-1 |
int | 平台相关 | 32位或64位系统 |
uint8 | 8位 | 0 到 255 |
uint16 | 16位 | 0 到 65535 |
uint32 | 32位 | 0 到 2^32-1 |
uint64 | 64位 | 0 到 2^64-1 |
uint | 平台相关 | 32位或64位系统 |
var(aint8=127bint16=32767cint32=2147483647dint64=9223372036854775807eint=42fuint8=255)浮点数类型
var(pricefloat32=19.99// 32位浮点数pifloat64=3.14159// 64位浮点数(推荐))// 科学计数法varavogadrofloat64=6.022e23varsmallfloat64=1.23e-4布尔类型
var(isActivebool=trueisDeletedbool=false)// 布尔运算result:=isActive&&!isDeleted// trueresult=isActive||isDeleted// trueresult=isActive!=isDeleted// true字符串类型
// 基本字符串name:="Hello, 世界"// 多行字符串(反引号,原生字符串)poem:=` 春眠不觉晓, 处处闻啼鸟。 `// 字符串操作fmt.Println(len(name))// 字节数fmt.Println("Hello"+" World")// 拼接fmt.Println("Hello"[0])// 获取字节(不是字符)字符类型
var(chbyte='A'// byte = uint8,ASCII 字符zhrune='中'// rune = int32,Unicode 字符)// rune 类型用于处理 Unicodes:="Hello, 世界"for_,r:=ranges{fmt.Printf("%c ",r)// 输出每个字符}2.3 类型转换
Go 不支持隐式类型转换,必须显式转换:
// 数值类型转换variint=42varffloat64=float64(i)varuuint=uint(f)// 字符串与数值转换import"strconv"// 字符串转整数n,err:=strconv.Atoi("42")iferr!=nil{fmt.Println("转换失败:",err)}// 整数转字符串s:=strconv.Itoa(42)// 字符串转浮点数f,err:=strconv.ParseFloat("3.14",64)// 任意类型转字符串s:=fmt.Sprintf("%d",42)2.4 运算符
算术运算符
a,b:=10,3fmt.Println(a+b)// 13 加fmt.Println(a-b)// 7 减fmt.Println(a*b)// 30 乘fmt.Println(a/b)// 3 整除fmt.Println(a%b)// 1 取模比较运算符
a,b:=10,20fmt.Println(a==b)// false 等于fmt.Println(a!=b)// true 不等于fmt.Println(a>b)// false 大于fmt.Println(a<b)// true 小于fmt.Println(a>=b)// false 大于等于fmt.Println(a<=b)// true 小于等于逻辑运算符
a,b:=true,falsefmt.Println(a&&b)// false 与fmt.Println(a||b)// true 或fmt.Println(!a)// false 非位运算符
a,b:=12,10// 二进制:1100, 1010fmt.Println(a&b)// 8 按位与 (1000)fmt.Println(a|b)// 14 按位或 (1110)fmt.Println(a^b)// 6 按位异或 (0110)fmt.Println(a<<2)// 48 左移 (110000)fmt.Println(a>>2)// 3 右移 (11)2.5 格式化输出
fmt 包常用函数
name:="张三"age:=25height:=175.5// Println - 自动添加空格和换行fmt.Println(name,age,height)// Printf - 格式化输出fmt.Printf("姓名: %s, 年龄: %d, 身高: %.1f\n",name,age,height)// Sprintf - 格式化为字符串s:=fmt.Sprintf("姓名: %s, 年龄: %d",name,age)// Fprintf - 写入文件fmt.Fprintf(os.Stdout,"输出到标准输出\n")格式化动词
| 动词 | 说明 | 示例 |
|---|---|---|
%d | 整数 | 42 |
%f | 浮点数 | 3.14 |
%s | 字符串 | "hello" |
%t | 布尔值 | true |
%v | 默认格式 | 自动选择 |
%+v | 结构体字段名 | {Name:张三} |
%#v | Go 语法表示 | main.Person{Name:"张三"} |
%T | 类型 | string |
%p | 指针地址 | 0xc0000b4000 |
%% | 百分号 | % |
// 精度控制fmt.Printf("%.2f\n",3.14159)// 3.14fmt.Printf("%10d\n",42)// 42(宽度10,右对齐)fmt.Printf("%-10d\n",42)// 42 (左对齐)fmt.Printf("%010d\n",42)// 0000000042(零填充)2.6 练习
- 声明不同类型的变量并打印其值和类型
- 使用
iota定义文件权限常量(读、写、执行) - 编写程序将摄氏温度转换为华氏温度
- 使用格式化输出打印一个简单的表格
2.7 下一章
下一章我们将学习 Go 语言的控制结构。
