[golang]Go常见问题:# command-line-arguments: ***: undefined: ***
<p>今天遇见一个很蛋疼的问题,不知道是不是我配置的问题,IDE直接run就报错。</p><h1>问题描述</h1>
<p>在开发代码过程中,经常会因为逻辑处理而对代码进行分类,放进不同的文件里面;像这样,同一个包下的两个文件,点击idea的运行按钮或者运行 go run main.go命令时,就会报错,如图所示。</p>
<p><img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015083114230-1458035895.png" alt=""></p>
<p> </p>
<h2> 那就好吧,我直接命令运行咯,go run main.go,一样的结果。</h2>
<p><img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015083229334-1350907154.png" alt=""></p>
<p> </p>
<h2>IDE的配置,Run _kind:以file模式启动就报错,以package包模式就不会报错。</h2>
<p> <img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015084138168-1556136989.png" alt=""></p>
<h2>酱紫就不会报错了</h2>
<p><img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015084524133-1421347897.png" alt=""></p>
<p> </p>
<p> </p>
<h1>原因分析</h1>
<p> 当然通过命令模式也会发现这样蛋疼的问题,go build不报错,直接go run main.go就报错。</p>
<p>这事你得揪其因呀,出现蛋疼问题就得抚平咯,哈哈哈。</p>
<p>在源代码的main函数中,我们发现从base.Commands的切片中获取要执行的命令,然后和传入的args一起执行cmd.Run(cmd, args)这个方法;</p>
<div class="image-package"><img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015085118164-1629723758.png" alt="">
<p> </p>
<p> <img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015085125112-989119178.png" alt=""></p>
<p> </p>
<p> 然后再回过头看cmd.Run(cmd, args)这个函数,结果发现它只是定义了一种类型,具体实现这里没有指出;</p>
<img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015085135884-1449178778.png" alt="">
<p> </p>
<p>紧接着回头去看run包下的函数,会发现run.go在初始化的时候,会把改文件下的runRun()函数赋值给base.Command{}定义的对象CmdRun,结果会发现runRun函数的的参数类型和个数完全符合cmd.Run(cmd, args)这个函数类型,在go语言中,函数的参数类型和参数个数符合定义的函数类型,则说明改函数实现了定义函数(注:go语言中,函数与方法不同)。 </p>
<p><img src="https://img2018.cnblogs.com/blog/372674/201910/372674-20191015085214264-40753050.png" alt=""></p>
<p> </p>
<p>在runRun()函数中,会发现files和cmdArgs接收的是传过来的文件列表,然后会通过GoFilesPackage(files),然后会入栈、加载、出栈等操作,由于启动的时候传递的只是一个.go文件,并没有传递demo.go,所以系统在加载main.go文件中并没有找到compose.go 文件中定义的变量,则在</p>
<blockquote>
<pre>widget.NewToolbarAction(theme.MailComposeIcon(), func() {<br> newCompose(m.app, m.server).loadUI().Show()<br>}),</pre>
</blockquote>
<p>这一行,开始出错。 </p>
<p> </p>
</div>
<h1>正确操作:</h1>
<p>该出错原因属于go的多文件加载问题,采用go run命令执行的时候,需要把待加载的.go文件都包含到参数里面。通过go run *.go(目录里面没有test.go才行)</p>
<p>或者配置IDE以package包模式就不会报错。</p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:landv,转载请注明原文链接:https://www.cnblogs.com/landv/p/11675356.html</p><br><br>
来源:https://www.cnblogs.com/landv/p/11675356.html
頁:
[1]