变量和类型¶
学习Go的变量声明、基本类型和类型转换。
📝 变量声明¶
1. 标准声明(var)¶
2. 类型推断¶
3. 短声明(最常用)¶
4. 批量声明¶
🎯 与Java对比¶
Java¶
// Java必须先声明类型
String name = "张三";
int age = 25;
double height = 1.75;
// Java 10+ 支持var(局部变量类型推断)
var name = "张三";
Go¶
关键差异:
- Go的 := 只能在函数内使用
- Go的变量声明更灵活
- Go未使用的变量会编译报错(Java只是警告)
📊 基本类型¶
整数类型¶
// 有符号整数
int8 // -128 到 127
int16 // -32768 到 32767
int32 // -2^31 到 2^31-1(相当于Java的int)
int64 // -2^63 到 2^63-1(相当于Java的long)
int // 32位系统上是int32,64位系统上是int64
// 无符号整数(Java没有)
uint8 // 0 到 255(byte)
uint16 // 0 到 65535
uint32 // 0 到 2^32-1
uint64 // 0 到 2^64-1
uint // 32位或64位
// 特殊整数类型
byte // uint8的别名
rune // int32的别名,表示Unicode码点
浮点类型¶
其他基本类型¶
类型对比表¶
| Go类型 | Java类型 | 说明 |
|---|---|---|
bool |
boolean |
布尔值 |
byte |
byte |
8位无符号整数 |
int32 |
int |
32位有符号整数 |
int64 |
long |
64位有符号整数 |
float32 |
float |
32位浮点数 |
float64 |
double |
64位浮点数 |
string |
String |
字符串(Go是基本类型) |
rune |
char |
Unicode字符 |
🔄 类型转换¶
Go需要显式转换¶
Java的对比¶
关键差异:Go不支持隐式类型转换,所有转换必须显式进行。
📌 常量¶
声明常量¶
特殊常量:iota(枚举)¶
const (
Monday = iota // 0
Tuesday // 1
Wednesday // 2
Thursday // 3
Friday // 4
Saturday // 5
Sunday // 6
)
Java对比¶
// Java使用 final
public static final double PI = 3.14159;
// Java使用 enum
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
🔍 零值(Zero Value)¶
Go中未初始化的变量会有零值(不是null):
var i int // 0
var f float64 // 0.0
var b bool // false
var s string // ""(空字符串)
var p *int // nil(指针)
Java对比: - Java的基本类型也有默认值 - Java的引用类型默认是null - Go的字符串零值是空字符串(不是nil)
💡 指针基础¶
Go支持指针,但比C/C++简单(没有指针运算):
var x int = 10
var p *int = &x // p是指向x的指针
fmt.Println(x) // 10
fmt.Println(p) // 内存地址,如 0xc000014080
fmt.Println(*p) // 10(解引用)
*p = 20 // 通过指针修改值
fmt.Println(x) // 20
Java对比: - Java除了基本类型,所有对象都是引用 - Java没有显式的指针语法 - Go的指针更接近C/C++,但更安全
📚 字符串¶
字符串特性¶
s := "Hello, 世界"
// 字符串是不可变的(immutable)
// s[0] = 'h' // 编译错误!
// 字符串长度(字节数,不是字符数)
len(s) // 13(不是9)
// 字符串拼接
s1 := "Hello"
s2 := "World"
s3 := s1 + ", " + s2 // "Hello, World"
// 原始字符串(支持多行)
raw := `这是一个
多行
字符串`
Java对比:
- 两者字符串都是不可变的
- Go使用 + 拼接,Java也支持
- Go的原始字符串用反引号,Java 15+ 支持文本块 """
✅ 最佳实践¶
- 优先使用短声明(
:=)在函数内部 - 使用有意义的变量名(Go倾向于短变量名,但要清晰)
- 选择合适的类型大小(通常int和float64就够用)
- 常量命名:Go不要求全大写,使用驼峰命名即可
- 避免不必要的类型转换
🎓 练习建议¶
查看代码示例:examples/02-variables-types/
运行并修改示例代码,理解: 1. 三种变量声明方式的区别 2. 不同整数类型的范围 3. 类型转换的必要性 4. 常量和iota的使用 5. 指针的基本操作