跳转至

变量和类型

学习Go的变量声明、基本类型和类型转换。

📝 变量声明

1. 标准声明(var)

var name string = "张三"
var age int = 25
var height float64 = 1.75

2. 类型推断

var name = "张三"        // 自动推断为string
var age = 25            // 自动推断为int
var height = 1.75       // 自动推断为float64

3. 短声明(最常用)

name := "张三"           // 只能在函数内使用
age := 25
height := 1.75

4. 批量声明

var (
    name   string = "张三"
    age    int    = 25
    height float64 = 1.75
)

🎯 与Java对比

Java

// Java必须先声明类型
String name = "张三";
int age = 25;
double height = 1.75;

// Java 10+ 支持var(局部变量类型推断)
var name = "张三";

Go

// Go有三种方式
var name string = "张三"  // 完整声明
var name = "张三"         // 类型推断
name := "张三"            // 短声明(最常用)

关键差异: - 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码点

浮点类型

float32  // 相当于Java的float
float64  // 相当于Java的double(默认)

其他基本类型

bool     // true或false
string   // 字符串(UTF-8编码)

类型对比表

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需要显式转换

var i int = 42
var f float64 = float64(i)  // 必须显式转换
var u uint = uint(f)

Java的对比

int i = 42;
double f = i;           // 自动转换(向上转型)
int j = (int) f;        // 需要强制转换(向下转型)

关键差异:Go不支持隐式类型转换,所有转换必须显式进行。

📌 常量

声明常量

const Pi = 3.14159
const (
    StatusOK = 200
    StatusNotFound = 404
    StatusError = 500
)

特殊常量: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+ 支持文本块 """

✅ 最佳实践

  1. 优先使用短声明:=)在函数内部
  2. 使用有意义的变量名(Go倾向于短变量名,但要清晰)
  3. 选择合适的类型大小(通常int和float64就够用)
  4. 常量命名:Go不要求全大写,使用驼峰命名即可
  5. 避免不必要的类型转换

🎓 练习建议

查看代码示例:examples/02-variables-types/

运行并修改示例代码,理解: 1. 三种变量声明方式的区别 2. 不同整数类型的范围 3. 类型转换的必要性 4. 常量和iota的使用 5. 指针的基本操作

➡️ 下一步