繁体   English   中英

为什么 Golang 允许在全局 scope 但不允许在 function scope 中循环引用

[英]Why Golang allows circular reference in global scope but not in function scope

当我使用gormigrate编写数据库迁移时,我需要在 function scope 中定义两个结构之间的多对多关系。 但在 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")
}

但是,将定义移到 function 之外就可以了

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自己尝试一下

为什么会这样? 我怎样才能让它在 function scope 中工作?

C++中是否有类似typedef的语法,所以我们可以先声明一个struct,然后再定义它?

谢谢!

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

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

  1. 在 function 中声明的类型标识符的 scope 开始于 TypeSpec 中的标识符,并结束于最里面的包含块的末尾。

function 中类型的 scope 从类型声明开始。 package块中的scope是整个package。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM