亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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條經驗 獲得超16個贊

循環類型引用可以在包block中使用,但不能在函數內部使用。規范中關于聲明和范圍的部分說:

  1. 表示在頂層(在任何函數之外)聲明的常量、類型、變量或函數(但不是方法)的標識符的范圍是包塊。

?

  1. 在函數內部聲明的類型標識符的范圍從 TypeSpec 中的標識符開始,到最內層包含塊的末尾結束。

循環引用在包級別工作,因為在包級別聲明的類型的范圍是整個包塊。

在函數中聲明的類型的范圍從聲明開始,而不是從包含塊的開始。類型不能引用稍后在函數中聲明的類型,因為這些類型不在范圍內。因此,函數中聲明的類型不允許循環類型引用。

沒有一種方法可以先聲明一個類型的名稱,然后再定義該類型。


查看完整回答
反對 回復 2023-02-06
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號