Go 中 struct 类型不能直接赋值:正确声明和初始化结构体变量的方法
技术百科
碧海醫心
发布时间:2025-12-31
浏览: 次 在 go 中,`var s = salutation` 会报错“type salutation is not an expression”,因为 `salutation` 是类型名而非可求值的表达式;必须使用 `salutation{}` 或带字段的字面量进行初始化。
Go 是一门强类型、静
态编译的语言,其变量声明与初始化语义严格区分「类型」和「值」。当你写下:
var s = Salutation
编译器会尝试将右侧 Salutation 视为一个可求值的表达式(例如字面量、函数调用或已有变量),但 Salutation 仅是一个类型标识符,不产生任何运行时值——因此触发错误:type Salutation is not an expression。
✅ 正确做法是显式构造该类型的零值实例或初始化实例。以下是三种等效且合法的声明方式:
1. 声明类型,隐式零值初始化(推荐用于包级变量)
var s Salutation s.name = "Alex" s.greeting = "Hi"
此时 s 被声明为 Salutation 类型,自动初始化为零值(即 name 和 greeting 均为空字符串)。
2. 使用结构体字面量创建零值({} 表示所有字段取零值)
var s = Salutation{} // ✅ 合法:Salutation{} 是表达式,结果为 Salutation 类型的零值
s.name = "Alex"
s.greeting = "Hi"3. 短变量声明(最常用,限于函数内)
s := Salutation{} // ✅ 推荐写法;Go 自动推导类型为 Salutation
s.name = "Alex"
s.greeting = "Hi"? 更进一步,你完全可以将声明与字段初始化合并,提升可读性与安全性(避免遗漏字段):
s := Salutation{
name: "Alex",
greeting: "Hi",
}
Greet(s)或使用位置式初始化(需严格按字段顺序):
s := Salutation{"Alex", "Hi"} // 有效,但可读性较低,不推荐用于含多个字段的 struct⚠️ 注意事项:
- var s = Salutation{"Alex", "Hi"} 虽然能通过编译,但依赖字段顺序,易出错;命名字段初始化({name: ..., greeting: ...})更清晰、更健壮。
- 包级变量(全局变量)不能使用 :=,只能用 var 声明。
- 结构体字段若未导出(小写首字母,如 name),在其他包中不可访问——本例中 Greet 函数在同一包内,无影响,但设计 API 时需注意导出规则。
总结:Go 不允许将类型名直接当作值使用。要获得结构体实例,必须通过 Type{}、Type{field: value} 或 &Type{} 等字面量语法构造具体值。理解「类型 ≠ 值」是掌握 Go 变量模型的关键一步。
# 仅是
# 多个
# 当你
# 较低
# 三种
# 均为
# 而非
# go
# 字符串
# 报错
# var
# 结构体
# Struct
# 标识符
# 全局变量
# 只能用
# 求值
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何用列表一次性对 DataFrame 的指定列应
- Go 中 defer 语句在 goroutine
- Win11怎么设置声音输出设备_Windows11
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- php怎么下载安装后设置错误日志_phpini l
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win10如何卸载预装Edge扩展_Win10卸载
- Win11怎么调整屏幕亮度_Windows 11调
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- Win11怎么设置快速访问_Windows11文件
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- php增删改查报错1054怎么办_字段名错误排查修
- Linux如何使用grep搜索文件内容_Linux
- php8.4新语法match怎么用_php8.4m
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- Win11如何连接Xbox手柄 Win11蓝牙连接
- C#如何使用Channel C#通道实现异步通信
- Win11怎么关闭系统透明度_Windows11个
- 如何使用Golang log记录不同级别日志_Go
- Windows怎样关闭开始菜单推荐广告_Windo
- Win11声音太小怎么办_Windows 11开启
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Win11资源管理器卡顿怎么办 Win11文件资源
- Python网络异常模拟_测试说明【指导】
- php485能和物联网模块通信吗_php485对接
- Win11如何暂停系统更新 Win11暂停更新最长
- Windows10如何删除Windows.old_
- Win10怎样卸载自带Edge_Win10卸载Ed
- 如何使用Golang table-driven基准
- Win11怎么更改系统语言为中文_Windows1
- 如何使用Golang指针与接口结合_实现方法调用和
- php怎么连接数据库_MySQL数据库连接的基础代
- Win11怎么格式化U盘_Win11系统U盘格式化
- Mac的“预览”如何合并多个PDF_Mac文件处理
- Python正则表达式实战_模式匹配说明【教程】
- Win11此电脑不在桌面上_Windows 11桌
- 如何使用Golang实现微服务状态监控_Golan
- MySQL 中使用 IF 和 CASE 实现查询字
- Win11怎么开启上帝模式_创建Windows 1
- Win10怎么查看内存时序参数_Win10CPU-
- Python字符串处理进阶_切片方法解析【指导】
- Win11怎么看电池循环次数_Win11笔记本电池
- 如何使用Golang实现RPC序列化与反序列化_G
- Win11怎么关闭开机声音_Win11系统启动提示
- 如何使用Golang log设置日志输出格式_Go
- Python 中将 ISO 8601 时间戳转换为
- 电脑的“网络和共享中心”去哪了_Windows 1
- php打包exe怎么传递参数_命令行参数接收方法【
- 如何在Golang中实现基础配置管理功能_Gola
- Go 语言标准库为何不提供泛型切片的 Contai

QQ客服