Java里面的类对象可以对应go里面的结构体吗
表格对比
Java 类 (Class) | Go 结构体 (Struct) |
---|---|
封装数据和行为(字段+方法) | 主要封装数据(字段),方法通过接收者关联 |
支持继承(extends ) | 无继承,通过组合(Embedding)实现复用 |
默认引用类型(堆内存分配) | 默认值类型(栈内存分配,除非用指针) |
访问控制(public /private ) | 通过字段首字母大小写控制(大写导出,小写私有) |
示例:
Java类
public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public void printInfo() {System.out.println(name + ", " + age);}
}
go结构体
type User struct {name stringage int
}func (u *User) PrintInfo() {fmt.Printf("%s, %d", u.name, u.age)
}// 使用
user := User{name: "Alice", age: 30}
user.PrintInfo()
Go 语言中,json.Marshal()
函数的签名
func Marshal(v interface{}) ([]byte, error)
它返回两个值:
[]byte
- 序列化后的 JSON 字节数据error
- 可能的错误信息
示例:
// 方式1:处理错误
jsonByte, err := json.Marshal(info)
if err != nil {// 适当处理错误:记录日志、返回错误等log.Printf("JSON序列化失败: %v", err)return err
}// 方式2:如果确定不会出错,可以添加注释说明
jsonByte, _ := json.Marshal(info) // 安全:info是简单结构体
什么时候使用参数指针
场景 | 建议 |
---|---|
结构体大于指针大小 | ✓ 用指针 |
需要修改原始数据 | ✓ 必须用指针 |
基本类型(int等) | × 通常用值 |
小结构体(字段<3个) | × 可考虑用值 |
*星号的作用
表示这是指针接收者(pointer receiver)
与值接收者(sc syncCrmAppUserService)
的关键区别:
// 值接收者:操作结构体副本,不会影响原实例
func (sc syncCrmAppUserService) Update() {sc.name = "new" // 修改无效
}// 指针接收者:操作实际实例
func (sc *syncCrmAppUserService) Update() {sc.name = "new" // 真实修改
}
为什么用指针接收者?
- 避免结构体拷贝(尤其当结构体较大时)
- 允许方法修改接收者内部状态(如更新缓存计数器)
- 实现接口时更灵活(指针接收者方法既能被指针调用,也能被值调用)
关键区别总结
- 接收者
(crm *crmAppCorpRepo)
→ 定义方法属于谁(类似this
) - 参数
(appId string)
→ 调用时传入的值 - 返回值
(crmId string, err error)
→ 方法执行后的输出
// 函数形式(非方法)
func GetCrmIdByAppId(repo *crmAppCorpRepo, appId string) (string, error) {// 实现...
}// 调用方式
crmId, err := GetCrmIdByAppId(repo, "app123")//指针接收者
func (crm *crmAppCorpRepo) GetCrmIdByAppId(appId string) (crmId string, err error) {// 实现...
}// 调用示例:
repo := &crmAppCorpRepo{} // 必须是指针类型
crmId, err := repo.GetCrmIdByAppId("app123") // 通过接收者调用方法
:= 和 = 的区别
特性 | := | = |
---|---|---|
变量声明 | ✅ 声明新变量 | ❌ 仅能赋值(变量需已存在) |
类型推断 | ✅ 自动推断类型 | ❌ 需显式匹配类型 |
作用域 | 仅函数/方法体内 | 任意作用域(包括全局) |
多变量赋值 | ✅ 支持(如 a, b := 1, 2 ) | ✅ 支持(如 a, b = 1, 2 ) |
重复声明 | ❌ 左侧不能有已声明的变量 | ✅ 可重复赋值 |