当我使用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")
}
Run Code Online (Sandbox Code Playgroud)
然而,将定义移到函数之外就可以了
package main
import "fmt"
type Student struct {
Courses []*Course
}
type Course struct {
Students []*Student
}
func main() {
fmt.Printf("This works")
}
Run Code Online (Sandbox Code Playgroud)
可以自己尝试一下https://go.dev/play/p/GI53hhlUTbk
为什么会这样呢?我怎样才能让它在函数范围内工作?
C++中是否有类似typedef的语法,所以我们可以先声明一个结构体,然后再定义它?
谢谢!
有没有办法在没有间接的头文件中声明这些类?
// Forwards declaration of B
class B;
class A
{
public:
// Default parameter referring to B. May return its parameter
const B& func(const B& b = B());
};
class B
{
public:
// B ctors
B() {}
B(const B&) {}
// B has A as a member
A a;
};
Run Code Online (Sandbox Code Playgroud)
Visual C++ 2008告诉我这个:
error C2514: 'B' : class has no constructors
Run Code Online (Sandbox Code Playgroud)
并指出B的前向声明("B类;"),显然不能在下面看到B的构造函数.A不能跟随B,因为B包含A作为成员.
如果必须使用间接,那么最好的方法是什么?也许在C++ 0x B中A可能是unique_ptr成员?或者也许有一个提升类纯粹是为了回避这个问题?
我遇到了如下所示的一些情况,其中每个类都需要另一个类,并且它创建了循环依赖。我在使用 ctypes 包装一些 c 代码时遇到了这种类型的情况。已经有很多关于这个主题的帖子,但我觉得它们没有帮助,我需要一些例子。有关解决此问题的任何想法/示例都会有所帮助。
# Module A
from B import C2
class C1(object):
def __init__(self):
self.name = "C1"
self.c2 = C2()
# Module B
from A import C1
class C2(object):
def __init__(self):
self.name = "C2"
self.c1 = C1()
# Main
from A import C1
if __name__ == "__main__":
o = C1()
print o.name
Run Code Online (Sandbox Code Playgroud) python circular-dependency circular-reference cyclic-reference
我的代码很简单.
Project/
main.go
pokemons/
pokemon.go
pokeTrainers/
pokeTrainer.go
Run Code Online (Sandbox Code Playgroud)
我有一些口袋妖怪训练师,定义如下:
package pokeTrainers
import "../pokemons"
type PokeTrainer struct {
name string
pokemon []Pokemon
}
Run Code Online (Sandbox Code Playgroud)
还有一些口袋妖怪:
package pokemons
import "../pokeTrainers"
type Pokemon struct {
name string
pokeTrainers PokeTrainer
}
Run Code Online (Sandbox Code Playgroud)
主要包装是:
package main
import (
"fmt"
"./pokemons"
"./pokeTrainers"
)
func main() {
fmt.Printf("ERROR CIRCULAR IMPORT")
Run Code Online (Sandbox Code Playgroud)
一如既往我有错误,我将其复制粘贴到谷歌上.我知道什么是循环导入以及人们如何通过接口来修复它以使用来自另一个包的方法而无需导入它.但在我的情况下,问题不是使用方法,而是在另一个包中定义的真实类型.
所以你可能会说:"你是个笨蛋!你只需把所有东西放在同一个包装上就可以了!" 对不起,我来自Java,我希望我的代码保持干净.;)
我看到这个链接建议使用第三方软件包?但是你必须想象我没有pokemon和pokeTrainer,我有更多的包里面有一个类型和很多方法..
你怎么看 ?如何正确修复此错误?我是Go的初学者
在完成CLRS Intro to Algorithms一书并试图在常见的lisp中实现红黑二叉搜索树时,我遇到了以下问题:圆形指针:
(defstruct node (ptr nil))
(defparameter *x* (make-node))
(defparameter *y* (make-node :ptr *x*))
(setf (node-ptr *x*) *y*)
Run Code Online (Sandbox Code Playgroud)
此代码导致堆耗尽错误,可能是由于指针指向指向该指针的指针等引起的无限递归.
有没有办法防止这种无限递归发生,同时保持这里给出的指针结构?
我知道还有其他方法可以实现红黑树(例如,不使用setf),但我有兴趣在CLRS中复制命令式样式,因为常见的lisp是一种多范式语言.
PS.除了通常的左子指针和右子指针之外,CLRS中的BST还有父指针.
我有三个班级,他们之间有一个循环引用.
class A
{
public A()
{
B obj = new B();
}
}
class B
{
public B()
{
C obj = new C();
}
}
class C
{
public C()
{
A obj = new A();
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个对象时A,它会抛出一个异常.
我如何创建循环引用彼此的类实例?