第二天:PHP 开发者快速掌握 Go 变量与数据类型
作为PHP开发者,你早已习惯了“无需声明类型、变量随用随定义”的弱类型特性,而Go作为强类型语言,变量必须显式声明类型(或通过推导确定)。今天我们就以PHP的变量/数据类型为参照,快速掌握Go的变量声明和数据类型体系。
一、Go变量声明(对标PHP变量定义)
PHP中定义变量只需加$符号,无需指定类型:$name = "PHP开发者";,而Go的变量声明有3种核心方式,我们逐一拆解:
1. 标准声明(显式指定类型)
语法:var 变量名 类型 = 值,是Go最基础的变量声明方式,对标PHP的$变量名 = 值,但多了类型约束。
// Go标准变量声明 var name string = "PHP转Go开发者" var age int = 30 var isStudy bool = true
对比PHP写法:
// PHP变量声明(无类型约束) $name = "PHP转Go开发者"; $age = 30; $isStudy = true;
2. 类型推导(简化声明)
Go支持根据赋值自动推导变量类型,省去手动写类型的步骤,更贴近PHP的使用习惯:
// Go类型推导(无需写类型) var name = "PHP转Go开发者" // 自动推导为string类型 var age = 30 // 自动推导为int类型
⚠️ 注意:类型推导仅在声明时赋值有效,若只声明不赋值,必须指定类型(如var age int),而PHP无需此约束。
3. 短变量声明(最常用)
在函数内可使用:=简化声明,是Go开发中最常用的变量定义方式,对标PHP的$变量名 = 值:
// Go短变量声明(仅函数内可用)
func main() {
name := "PHP转Go开发者" // 等价于 var name string = "PHP转Go开发者"
age := 30
fmt.Println(name, age)
}对比PHP:
// PHP函数内变量声明
function main() {
$name = "PHP转Go开发者";
$age = 30;
echo $name . ' ' . $age;
}二、Go数据类型体系(对标PHP数据类型)
PHP的数据类型分为标量(字符串、数值、布尔)、复合(数组、对象)、特殊(null、资源),Go的类型体系更严谨,我们按“对标PHP”的逻辑分类讲解:
1. 基本数据类型(对标PHP标量类型)
| Go基本类型 | PHP对应类型 | 示例(Go) | 示例(PHP) |
|---|---|---|---|
| string(字符串) | string | var str string = "Go语言" | $str = "Go语言"; |
| int/int8/int16/int32/int64(整型) | int/integer | var num int64 = 100 | $num = 100; |
| float32/float64(浮点型) | float/double | var pi float64 = 3.1415 | $pi = 3.1415; |
| bool(布尔型) | bool | var flag bool = false | $flag = false; |
💡 关键差异:
- PHP的整型无长度限制,Go的整型分不同长度(如int8占1字节、int64占8字节),适配不同内存场景;
- Go的字符串是不可变的,而PHP字符串可直接修改(如$str[0] = 'G')。
2. 复合数据类型(对标PHP数组/对象)
PHP的数组是“万能数组”(可存任意类型、索引/关联),Go将复合类型拆分为更精准的类型:
| Go复合类型 | PHP对应类型 | 核心区别 |
|---|---|---|
| 数组(array) | 索引数组 | Go数组长度固定、元素类型统一;PHP数组长度可变、类型不限 |
| 切片(slice) | 动态索引数组 | Go切片是可变长度数组,替代PHP的动态索引数组 |
| 映射(map) | 关联数组 | Go map是键值对集合,键/值类型需统一;PHP关联数组无此约束 |
| 结构体(struct) | 对象/数组组合 | Go struct用于封装多个不同类型字段,对标PHP的自定义对象 |
简单示例(Go map对标PHP关联数组):
// Go map(关联数组)
func main() {
// 声明并初始化map,键为string,值为int
user := map[string]int{
"age": 30,
"score": 95,
}
fmt.Println(user["age"]) // 输出30
}PHP对应写法:
// PHP关联数组 $user = [ "age" => 30, "score" => 95, ]; echo $user["age"]; // 输出30
3. 特殊数据类型
Go的特殊类型与PHP差异较大,暂做基础认知:
nil:Go的空值,仅适用于指针、切片、map等类型,对标PHP的null,但Go中nil不能赋值给int/string等基本类型;指针(pointer):存储变量内存地址,PHP无直接对应概念(PHP的引用是浅拷贝)。
三、PHP与Go变量/类型核心差异实战
通过一个小案例,对比两者的写法差异,加深理解:
需求:定义用户信息变量,输出姓名和年龄
PHP写法(弱类型):
Go写法(强类型):
package main
import "fmt"
func main() {
// 强类型约束,类型不可随意修改
username := "张三"
var age string = "30"
// Go需显式转换类型(不能自动转换)
ageInt, _ := strconv.Atoi(age)
fmt.Printf("姓名:%s,年龄:%d\n", username, ageInt)
}⚠️ 核心区别:Go不支持自动类型转换(如字符串"30"不能直接当int用),必须显式转换;PHP则会自动隐式转换。
五、今日小结
今天我们以PHP变量/数据类型为参照,掌握了Go的3种变量声明方式、数据类型体系,核心要点:
Go是强类型语言,变量声明需指定/推导类型,不可随意修改类型;
Go的数组/切片/map对应PHP的索引/关联数组,但类型约束更严格;
短变量声明
:=是Go函数内最常用的变量定义方式,贴近PHP使用习惯。
明天我们将学习Go的运算符与流程控制,继续用PHP的if/for/foreach等语法类比,快速掌握Go的流程控制逻辑。
