为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Golang 允许在全局范围内循环引用但在函数范围内不允许

为什么 Golang 允许在全局范围内循环引用但在函数范围内不允许

Go
撒科打诨 2023-02-06 11:22:48
当我使用gormigrate编写数据库迁移时,我需要在函数范围内的两个结构之间定义多对多关系。但在 golang 1.19 或 1.18 以下将无法编译package mainimport "fmt"func main() {    type Student struct {        Courses []*Course        // [Error] ./prog.go:7:14: undefined: Course    }    type Course struct {        Students []*Student    }    fmt.Printf("This won't compile")}然而,将定义移到函数之外就可以了package mainimport "fmt"type Student struct {    Courses []*Course}type Course struct {    Students []*Student}func main() {    fmt.Printf("This works")}可以在https://go.dev/play/p/GI53hhlUTbk上自己尝试为什么会这样?我怎样才能让它在功能范围内工作?有没有类似C++中typedef的语法,可以先声明一个struct,再定义?
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

循环类型引用可以在包block中使用,但不能在函数内部使用。规范中关于声明和范围的部分说:

  1. 表示在顶层(在任何函数之外)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。

  1. 在函数内部声明的类型标识符的范围从 TypeSpec 中的标识符开始,到最内层包含块的末尾结束。

循环引用在包级别工作,因为在包级别声明的类型的范围是整个包块。

在函数中声明的类型的范围从声明开始,而不是从包含块的开始。类型不能引用稍后在函数中声明的类型,因为这些类型不在范围内。因此,函数中声明的类型不允许循环类型引用。

没有一种方法可以先声明一个类型的名称,然后再定义该类型。


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信