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

当我使用gormigrate编写数据库迁移时,我需要在函数范围内的两个结构之间定义多对多关系。但在 golang 1.19 或 1.18 以下将无法编译


package main


import "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 main


import "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,再定义?


撒科打诨
浏览 85回答 1
1回答

侃侃尔雅

循环类型引用可以在包block中使用,但不能在函数内部使用。规范中关于声明和范围的部分说:表示在顶层(在任何函数之外)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。⋮在函数内部声明的类型标识符的范围从 TypeSpec 中的标识符开始,到最内层包含块的末尾结束。循环引用在包级别工作,因为在包级别声明的类型的范围是整个包块。在函数中声明的类型的范围从声明开始,而不是从包含块的开始。类型不能引用稍后在函数中声明的类型,因为这些类型不在范围内。因此,函数中声明的类型不允许循环类型引用。没有一种方法可以先声明一个类型的名称,然后再定义该类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go