记录一个go语言与IDE之间的问题

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
云原生网关 MSE Higress,422元/月
简介: 【7月更文挑战第1天】本文介绍在IDE中调试Go应用可能遇到的问题。当问题与IDE的自动完成有关,可以试着使用其他编辑器如Linux的vim是否无此问题。这可以验证表明IDE可能不完全兼容最新语言版本,建议使用无自动检测工具临时解决。

1 问题简介

我们有一个如下需求:
计算 从0 到 1290 的数字,按如下规则计数:

 如果 这个数是 2的倍数,则计数器 +1
 如果 这个数是 3的倍数,则计数器 +2
 如果 这个数是 4的倍数,则计数器 +3
 如果 这个数是 5的倍数,则计数器 +4

每次计算循环累加计数器,并输出计数器的值。

该实现代码计算0到1290间数字的计数,根据数的倍数增加计数器D:偶数+1,3的倍数+2,4的倍数+3,5的倍数+4。

DupLine函数实现此逻辑,但在VS Code(1.76.0 insider)中,//line注释引发自动补全导致错误。gopls报告解析错误,链接器指出非声明语句。

2 代码实现

我们有如下代码:

package main

import (
    "fmt"
)

    var D int

    func DupLine(c int) {
            for i := 0; i < c; i++ {
    //line ld.go:80
                    if i%2 == 0 {
                            D++
                    }
                    if i%3 == 0 {
                            D++
                            D++
                    }
    //line ld.go:80
                    if i%4 == 0 {
                            D++
                            D++
                            D++
                    }
                    if i%5 == 0 {
                            D++
                            D++
                            D++
                            D++
                    }
                    fmt.Println("d:",D)
            }
    }

    func main() {
            DupLine(1290)
    }

建立mod包模式

go mod init ldcase
go mod tidy

3 软件环境说明如下:

vs code(win10 amd64 1.76.0 insider) + golang 1.20 

注意以下注释

      //line ld.go:80 

这一行在行首的时候,保存 有自动补全的代码错误, 当保存以上代码时,将被vs code 自动补全以下代码在最后。

            D++

或者补全如下:

         D++
      }
    //line ld.go:80
            if i%4 == 0 {
                D++
                D++
                D++
            }
            if i%5 == 0 {
                D++
                D++
                D++ 

当//line ld.go:80 注释在如上位置时,vs code 将在
在解析包时,pkgname 将被首先调用以保证语法正确。

    func pkgname(ctxt *Link, lib string) string {
        return path.Clean(lib)
    }

语言服务器gopls调试信息

    unable to compute positions for parse errors: no parsed file for file

gopls输出错误,导入错误信息,包初始化失败,预期声明信息,但是发现一个孤立未声明的D:

    expected declaration, found D

链接器报错信息:

ld.go:117: syntax error: non-declaration statement outside function body (exit status 1)

ld.go 为go链接器接口,

   src/cmd/link/internal/ld/ld.go

错误提示为,函数findlib 加载包时报错。

而使用其他编辑器,比如txt文本,或者sublime不会有此问题。
在 linux 环境vim 也可以正确编辑和执行。

...
d: 3488
d: 3489
d: 3489
d: 3495
d: 3499
d: 3500
d: 3502
d: 3506
d: 3506

4 小结

由此可以看出,IDE并不是完全与语言兼容的,它与最新的编程语言同步需要有一段时间,而这段时间可能导致各种兼容问题。

从go的最新版本1.20 之于 vscode 和 pycharm 之于 python 1.10 的新语法莫不是如此。

解决办法仍然是出现这类似的错误时,使用没有自动代码检测补全的工具,比如txt,vim等。

目录
相关文章
|
5天前
|
JSON 测试技术 Go
零值在go语言和初始化数据
【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。
53 22
零值在go语言和初始化数据
|
7天前
|
安全 算法 程序员
在go语言中使用泛型和反射
【7月更文挑战第8天】本文介绍go支持泛型后,提升了代码复用,如操作切片、映射、通道的函数,以及自定义数据结构。 泛型适用于通用数据结构和函数,减少接口使用和类型断言。
69 1
在go语言中使用泛型和反射
|
9天前
|
缓存 编译器 Shell
回顾go语言基础中一些特别的概念
【7月更文挑战第6天】本文介绍Go语言基础涵盖包声明、导入、函数、变量、语句和表达式以及注释。零值可用类型如切片、互斥锁和缓冲,支持预分配容量以优化性能。
40 2
回顾go语言基础中一些特别的概念
|
13天前
|
存储 Go API
一个go语言编码的例子
【7月更文挑战第2天】本文介绍Go语言使用Unicode字符集和UTF-8编码。Go中,`unicode/utf8`包处理编码转换,如`EncodeRune`和`DecodeRune`。`golang.org/x/text`库支持更多编码转换,如GBK到UTF-8。编码规则覆盖7位至21位的不同长度码点。
116 1
一个go语言编码的例子
|
6天前
|
JSON Java Go
Go 语言性能优化技巧
在Go语言中优化性能涉及数字字符串转换(如用`strconv.Itoa()`代替`fmt.Sprintf()`)、避免不必要的字符串到字节切片转换、预分配切片容量、使用`strings.Builder`拼接、有效利用并发(`goroutine`和`sync.WaitGroup`)、减少内存分配、对象重用(`sync.Pool`)、无锁编程、I/O缓冲、正则预编译和选择高效的序列化方法。这些策略能显著提升代码执行效率和系统资源利用率。
42 13
|
1天前
|
Cloud Native Java Go
为什么要学习Go语言?
GO logo的核心理念,即简单胜于复杂。使用现代斜体无衬线字体与三条简单的运动线相结合,形成一个类似于快速运动的两个轮子的标记,传达速度和效率。字母的圆形暗示了GO地鼠的眼睛,创造了一个熟悉的形状,让标记和吉祥物很好地搭配在一起。
13 4
|
6天前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
41 8
|
7天前
|
前端开发 JavaScript Go
|
5天前
|
存储 Go
go语言中fmt格式化包和内置函数汇总
【7月更文挑战第10天】本文介绍fmt包和`Errorf`用于创建格式化的错误消息。`fmt`包还涉及一些接口,如`Formatter`、`GoStringer`、`ScanState`、`Scanner`和`Stringer`,支持自定义格式化和输入/输出处理。
17 1
|
5天前
|
Go
go语言中格式化输出的占位符
【7月更文挑战第10天】`fmt` 包在 Go 语言中用于格式化输出,包括不同类型的占位符:%v(默认格式)、%+v(带字段名的结构体)、%#v(Go语法表示)、%T(类型表示)、%%(百分号)。布尔值用%t,整数有%b、%c、%d、%o、%q、%x、%X和%U。浮点数和复数用%b、%e、%E、%f、%g、%G。字符串和字节切片用%s、%q、%x、%X。指针用%p。占位符可配合+、-、#、空格和0进行调整。宽度和精度控制输出格式,例如 %.4g 控制小数精度。Go 没有 `%u`,但无符号整数默认打印为正数。运算符包括逻辑、比较、加减、乘除、移位、按位和按位异或等。
17 1

热门文章

最新文章