病毒性面瘫怎么治疗后遗症的病因是什么

VSCODE中godef无法跳转到定义的问题_go语言_ThinkSAAS
VSCODE中godef无法跳转到定义的问题
VSCODE中godef无法跳转到定义的问题
内容来源: 网络
原文链接:
之前研究GOLANG时一直用LiteIDE,不得不说,LiteIDE的确不错,但是总感觉缺乏美感,是一款很中规中矩的编辑器。网上看到大家对VSCODE评价不错,尝试后发现的确不错,布局简洁、插件化、支持中文,通过VSCODE GO扩展能够很舒服的写GO的代码。
不过在实际使用过程中发现 net 包无法正常跳转到定义,如下段代码 ResolveTCPAddr就无法正常跳转
package main
func main() {
_, err := net.ResolveTCPAddr("tcp", ":4040")
由于VSCODE GO中跳转到定义使用的是godef,遂通过godef的debug模式查看问题原因:
godef -debug -f main.go net.ResolveTCPAddr
运行结果如下:
01:17:30 exprType tuple:false pkg: *ast.SelectorExpr net.ListenTCP [
01:17:30 exprType tuple:false pkg: *ast.Ident net [
01:17:30 exprType tuple:false pkg: *ast.ImportSpec "net" [
01:17:30 ] -& 0x0, Type{package "" *ast.ImportSpec "net"}
01:17:30 ] -& 0xc, Type{package "" *ast.ImportSpec "net"}
01:17:30 member Type{package "" *ast.ImportSpec "net"} &ListenTCP& {
/usr/local/go/src/net/cgo_android.go:10:8: cannot find identifier for package "C": cannot find package "C" in any of:
/usr/local/go/src/vendor/C (vendor tree)
/usr/local/go/src/C (from $GOROOT)
/Users/targetliu/dev/govendor/src/C (from $GOPATH)
/Users/targetliu/dev/golang/src/C
01:17:30 } -& &nil&
01:17:30 ] -& 0x0, Type{bad "" &nil& }
01:17:30 exprType tuple:false pkg: *ast.SelectorExpr net.ListenTCP [
01:17:30 exprType tuple:false pkg: *ast.Ident net [
01:17:30 exprType tuple:false pkg: *ast.ImportSpec "net" [
01:17:30 ] -& 0x0, Type{package "" *ast.ImportSpec "net"}
01:17:30 ] -& 0xc, Type{package "" *ast.ImportSpec "net"}
01:17:30 member Type{package "" *ast.ImportSpec "net"} &ListenTCP& {
/usr/local/go/src/net/cgo_android.go:10:8: cannot find identifier for package "C": cannot find package "C" in any of:
/usr/local/go/src/vendor/C (vendor tree)
/usr/local/go/src/C (from $GOROOT)
/Users/targetliu/dev/govendor/src/C (from $GOPATH)
/Users/targetliu/dev/golang/src/C
01:17:30 } -& &nil&
01:17:30 ] -& 0x0, Type{bad "" &nil& }
godef: no declaration found for net.ListenTCP
注意到这一句:
cannot find identifier for package "C": cannot find package "C" in any of:
原来是 net 包里 import C ,然而C并不是一个具体真实存在的包,所以godef无法进行分析,导致找不到定义。
godef的GitHub上作者也发现了同样的问题:
在godef的GitHub上看到有人提交了针对这个问题的解决方案:
根据这个提交,可以尝试使用如下方法解决:
找到并打开godef的 go/parser/parser.go 这个文件
在 1970行 左右添加(代码中+号部分,可以通过搜索定位):
if declIdent == nil {
filename := p.fset.Position(path.Pos()).Filename
name, err := p.pathToName(litToString(path), filepath.Dir(filename))
if litToString(path) == "C" {
name = "C"
if name == "" {
p.error(path.Pos(), fmt.Sprintf("cannot find identifier for package %q: %v", litToString(path), err))
重新编译godef
如果遇到同样问题的同学不妨试一试以上方式,至少对于我来说,问题得到了解决。也希望作者能尽快修复这个问题。内容来源:
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信C++中的goto语句
今天因为一个goto语句被老师鄙视了。
我倒是觉得这个goto用的挺顺手,但是既然不被认可,也从自己身上找找原因吧。
1:为何不提倡使用goto语句?
渊源(来自wikipedia):
GOTO是一条可以在许多计算机中找到的。它是英文单词和的组合。当执行这条语句的时候,它将无条件地转到另一条语句(也叫"")。跳转语句需要指明,在不同语言中,标记可以是或。在级别,goto是一种的形式。
在一些语言中,可以不用显示地使用goto而实现同样的功能,例如break或continue关键字可以跟随一个标识符。语言支持一种语句的后缀形式,可以在本条语句执行完毕后实现无条件跳转。
GOTO语句被大部分支持,只有很少的高级语言不支持GOTO语句。例如,goto是一个语言的,但是不允许使用。例如中没有Goto,但可用procedure执行一。
GOTO语句一直是批评和争论的目标,主要的负面影响是使用GOTO语句使程序的可读性变差,甚至成为不可维护的“”。随着在二十世纪六十年代到七十年代变得越来越流行,许多得出结论,即程序应当总是使用被称为“结构化”的命令,如以及if-then-else语句来替代GOTO。甚至在今天,许多编码标准禁止使用GOTO语句。为GOTO语句辩护的人认为,加以限制地使用GOTO语句不会导致低质量的代码,并且声称在许多编程语言中,一些任务如果不使用一条或多条GOTO语句是无法被直接实现的。如的实现、跳出嵌套以及。
大概最著名的对于GOTO的批评是(Edsger
Wybe Dijkstra)在1968年的一篇名称为《(:)》的论文。迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。另外一种观点的Structured
Programming with go to Statements&中,文章分析了许多常见编程任务,然后发现其中的一些使用GOTO将得到最理想的结构。
这些批评在一些编程语言的设计上起到了效果。虽然语言的设计者在二十世纪七十年代晚期意识到了对于GOTO的批评,这条语句仍旧被包含进去,主要是用来支持自动生成那些goto语句必不可少的代码。但是,作为goto语句目的地的标签必须使用双尖括号括起来(如:&&Start_Again&&),而这个语法在其他语言中都不被使用。这使得检查程序中goto目的地的存在变得容易。goto语句本身使用简单的形式goto&Start_A.
GOTO语句使程序的静态结构和动态结构不一致,从而使程序难以理解,难以查错。
有人认为GOTO语句使用起来比较灵活,而且有些情形能提高程序的效率。
1974年,D·E·克努斯对于GOTO语句争论作了全面公正的评述,其基本观点是:不加限制地使用GOTO语句,特别是使用往回跳的GOTO语句,会使程序结构难于理解,在这种情形,应尽量避免使用GOTO语句。但在另外一些情况下,为了提高程序的效率,同时又不至于破坏程序的良好结构,有控制地使用一些GOTO语句也是必要的。用他的话来说就是:“在有些情形,我主张删掉GOTO语句;在另外一些情形,则主张引进GOTO语句。”
后来,G·加科皮尼和C·波姆从理论上证明了:任何程序都可以用顺序、分支和重复结构表示出来。这个结论表明,从高级程序语言中去掉GOTO语句并不影响高级程序语言的编程能力,而且编写的程序的结构更加清晰。
goto语句的结果:在C/C++等高级编程语言中保留了goto语句,但被建议不用或少用。在一些更新的高级编程语言,如Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使 用,使程序简洁易读;尽管如此后来的c#还是支持goto语句的,goto语句一个好处就是可以保证程序存在唯一的出口,避免了过于庞大的if嵌套。
可以考虑使用goto的情形:1.从多重循环中直接跳出 ;2. 出错时清除资源; 3.可增加程序的清晰度的情况。
不加限制地使用goto:破坏了清晰的程序结构,使程序的可读性变差,甚至成为不可维护的"面条代码"。经常带来错误或隐患,比如它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。
goto语句问题的提出直接推动了结构化程序设计(structured programming)的思想和程序设计方法学的诞生和发展。结构化程序设计方法引入了工程思想和结构化思想,使大型软件的开发和编程都得到了极大的改善。结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。
下列关于使用goto语句的原则可以供读者参考。   1) 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。   2) 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。   3) 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。   4)应该避免像两个方向跳转。这样最容易导致"面条代码"。
2:网友热心回答
goto并不是不能用,关键是goto指向的标签必须在goto这行的后面。
盲目禁用goto是不对的。
见杰拉尔德·温伯格《理解专业程序员》
如果要做软件开发的话,特别是团队的话,为了将来项目的维护和让代码通俗易懂,最好不要用goto;
goto会影响编译器优化,还有九成的goto都可以转换成不用goto的方式
如果GOTO的语句在后面就不会出现死循环!
如果GOTO的语句在前面就很容易死循环!!!
还有,GOTO&&的语句都能用REPEAT或WHILE来代替!
所以,一般不用GOTO!!
因为那会扰乱编程结构次序
goto语句在C/C++语言中可谓是“臭名昭著”,乃至有的书(或公司的编程规范)提出禁用goto语句的说法。其结果就是,造成有的程序员一看到goto语句在某程序中被使用,就本能地认为这个程序写得很“垃圾”。此外,也使得有些程序员因为使用了goto语句而觉得自己很不专业。其实,凡事都不能太偏激,goto语句运用得好能大大地简化程序,以及提高程序的可读性和可维护性。在开始示例其好处之前,先用一些统计数据来说明goto语句并没有因为“臭名昭著”而被抛弃,这些统计数据可能并不是百分之百的精确,但很具有说服力。对于操作系统,Linux-2.6.21内核使用了20,333个goto语句,VxWorks-6.2则使用了9142个,最后941个goto语句被运用到了rtems-4.9.2中;另外,glibc-2.9库使用了1750个goto语句。所有这些统计数据都表明,goto语言并没有想象的那样可怕而招到禁用,其关键在于
—— 恰当地运用它。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Golang的循环中break和continue语句的用法讲解
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Golang的循环中break和continue语句的用法讲解,是Go语言入门学习中的基础知识,需要的朋友可以参考下
Go语言break语句
在Go编程语言中的break语句有以下两种用法:
break语句用于在循环立即终止,程序控制继续下一个循环语句后面语句。
它可用于终止在switch语句的情况(case)。
如果你正在使用嵌套循环(即,一个循环在另一个循环中),break语句将停止最内层循环的执行,并开始执行的下一行代码的程序段之后。
在Go break语句的语法如下:
package main
import "fmt"
func main() {
&& /* local variable definition */
&& var a int = 10
&& /* for loop execution */
&& for a & 20 {
&&&&& fmt.Printf("value of a: %d\n", a);
&&&&& a++;
&&&&& if a & 15 {
&&&&&&&& /* terminate the loop using break statement */
让我们编译和运行上面的程序,这将产生以下结果:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
Go语言continue语句
在Go编程语言中的continue语句有点像break语句。不是强制终止,只是继续循环下一个迭代发生,在两者之间跳过任何代码。
对于for循环,continue语句使循环的条件测试和执行增量部分。
在Gocontinue语句的语法如下:
Flow Diagram:
package main
import "fmt"
func main() {
&& /* local variable definition */
&& var a int = 10
&& /* do loop execution */
&& for a & 20 {
&&&&& if a == 15 {
&&&&&&&& /* skip the iteration */
&&&&&&&& a = a + 1;
&&&&& fmt.Printf("value of a: %d\n", a);
&&&&& a++;&&&&
让我们编译和运行上面的程序,这将产生以下结果:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 病毒性面瘫 的文章

 

随机推荐