英文:
Giving access to the object tree to external files
问题
假设我在模块中有以下结构的.go文件:
- tree_definition.go
- tree_creation.go
tree_creation.go解析某个文件,并使用在tree_definition中定义的数据结构、方法和函数创建一个对象树(简称otree)。
在解析过程中,我看到了一个名为external.go的文件,其中包含一些代码,旨在访问otree并对其进行修改。
解析完成后,external.go中的代码应该能够通过我在tree_definition中定义的API使用otree并对其进行修改。这一切都发生在运行时。
为了澄清一些事情:
- 是的,我正在尝试复制DOM的行为。
- external.go来自另一个目录,而不是模块内部。
- 只有在tree_creation将external.go添加到otree的数据结构中时,external.go才可见。
- 我已经完成了几乎所有复制的步骤。这是最后一部分。不幸的是,我暂时无法提供Git链接,让你自己查看,但我会感激任何可以帮助我澄清情况的评论。
最好的问候!
我想我有一个想法。我稍后会发布它。
英文:
Suppose I have a following structure of .go files inside the module:<br/>
<ul>
<li>tree_definition.go</li>
<li>tree_creation.go</li>
</ul><br/>
The tree_creation parses some file and creates and object tree from it (otree for short) using data structures and methods (as well as functions) defined in tree_definition.<br/>
During the parsing I see external.go file that contains some code, that aims to access otree and modify it.<br/>
After the parsiing is complete, the code in external.go should be able to use otree through the API I defined in tree_definition and modify it. It all happens during the runtime.<br/><br/>
For clarifications:<br/>
<ul>
<li>Yes, I'm trying to replicate the behavior of the DOM</li>
<li>The external.go comes from another directory, not from inside the module</li>
<li>The external.go is visible only during the runtime when tree_creation adds external.go mention to the data structure of otree</li>
</ul><br/>
I've completed almost all the steps to replicate it. This is the last part. Sadly, I cannot provide the link to the Git at the moment so you could see it yourself, but I would appreciate every comment that can help me clarify the situation.<br/><br/>
Best regards!<br/><br/>
I think I get an idea. I'll post it later.
答案1
得分: 0
好的,下面是翻译好的内容:
好的,我们开始吧!
最终,在我的朋友 Bing Chat 的帮助下,我找到了一个简单的解决方案,而不需要使用内存文件或通过本地主机的HTTP请求。这个解决方案非常优雅,对我来说完美地工作!
我仍然认为我会使用内存文件,但我们会看情况。这取决于可扩展性。
此外,特别感谢 @BurakSerdar 提供的答案。
package main
// 这部分将在运行时文件中
import (
"bufio"
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("go", "run", "user_defined.go")
stdout, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
err = cmd.Start()
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
fmt.Println(scanner.Text())
if scanner.Text() == "some_command" {
fmt.Println("found some_command")
}
if scanner.Text() == "another_command" {
fmt.Println("found another_command")
}
}
err = cmd.Wait()
if err != nil {
panic(err)
}
}
编辑 1
结果发现有三种进程间通信的方式,但对于我的问题来说,最适合的是共享内存。
英文:
Okay, here we go!<br/>
Finally, with the help of my pal, Bing Chat, I was able to find simple solution without using memory files or HTTP requests via localhost. Presented solution is elegant and works perfectly for me!<br/>
I still think I'll use the memory file, but we'll see. It depends on scalability.<br/><Br/>
Also, special thanks to
> @BurakSerdar
for his answer.
package main
// This will be in the runtime file
import (
"bufio"
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("go", "run", "user_defined.go")
stdout, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
err = cmd.Start()
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
fmt.Println(scanner.Text())
if scanner.Text() == "some_command" {
fmt.Println("found some_command")
}
if scanner.Text() == "another_command" {
fmt.Println("found another_command")
}
}
err = cmd.Wait()
if err != nil {
panic(err)
}
}
<br/>
EDIT 1<Br/>
Turns out there is 3 ways of communicating between processes, but the best suited for my problem - Shared Memory.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论