Golang中使用gopls在VSCode创建特定操作系统/架构文件时出现警告

Golang中使用gopls在VSCode创建特定操作系统/架构文件时出现警告 我在Windows上使用Visual Studio Code。

我有一个包含3个文件的包:osctrl_darwin.goosctrl_linux.goosctrl_windows.go。 前两个文件包含以下内容:

package osctrl

import (
	"syscall"
)

// GetSyscallNewProcessGroup 返回一个用于启动新进程组的 SysProcAttr 结构体
func GetSyscallNewProcessGroup() *syscall.SysProcAttr {
	syscallNewProcessGroupLin := &syscall.SysProcAttr{
		Setpgid: true,
	}

	return syscallNewProcessGroupLin
}

第三个文件(针对Windows)如下:

package osctrl

import (
	"syscall"
)

// GetSyscallNewProcessGroup 返回一个用于启动新进程组的 SysProcAttr 结构体
func GetSyscallNewProcessGroup() *syscall.SysProcAttr {
	syscallNewProcessGroupWin := &syscall.SysProcAttr{
		CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
	}

	return syscallNewProcessGroupWin
}

gopls报告了以下警告: No packages found for open file C:my\pack\path\osctrl\osctrl_darwin.go: <nil>. If this file contains build tags, try adding "-tags=<build tag>" to your gopls "buildFlag" configuration (see (https://github.com/golang/tools/blob/master/gopls/doc/settings.md#buildflags-string). Otherwise, see the troubleshooting guidelines for help investigating (https://github.com/golang/tools/blob/master/gopls/doc/troubleshooting.md).

并且当我在Linux和Darwin文件中的syscall.SysProcAttr上悬停光标时,无法获取信息,而在Windows文件中则可以。

(程序使用set GOOS=linux && set GOARCH=386 && go build .可以正常编译。)

我应该怎么做才能解决这些警告?


更多关于Golang中使用gopls在VSCode创建特定操作系统/架构文件时出现警告的实战教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

我尝试了 gopls -tags linux 但不起作用…

更多关于Golang中使用gopls在VSCode创建特定操作系统/架构文件时出现警告的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据我对构建标志信息的理解,它是 linux

好的,谢谢 @NobbZ,我该如何告诉 gopls 切换到另一个操作系统呢?

为什么不按照链接文档中的说明操作呢?

{
  "gopls": {
    "buildFlags" : [
      "linux"
    ]
  }
}

(在手机上输入,可能包含错误)

在这种情况下,如果我希望 gopls 将代码解释为在 Linux 环境下运行,我应该怎么写?

(在那个网站上,关于“buildFlags”的内容实际上只有两行。)

我可能找到了一个解决方案:

我需要在 .vscode/settings.json 中添加:

"gopls.env": {
    "GOFLAGS": "-tags=linux",
},

这样对吗?(我可以添加多个操作系统吗?)

gekigek99:

tools/gopls/doc/settings.md at master · golang/tools · GitHub

向该列表中添加相应的标签。

Gopls 使用 Go 语言编译器的 API,因此无法查看在您当前平台上无法构建的文件。

您可以告知 gopls 假装当前环境是 Darwin,但这样 Linux 环境下的文件仍然无法工作,而 Windows 环境下的文件现在也会出现问题。

您可以选择在不同的“配置文件”之间来回切换,或者接受在某些文件中无法获得工具支持的事实。

尝试了你的解决方案,但出现了一个 gopls 错误:

Error loading workspace: err: exit status 1: stderr: cannot find package "linux" in any of: 	C:\Program Files\Go\src\linux (from $GOROOT) 	C:\Users\luca\go\src\linux (from $GOPATH) cannot find package "-e" in any of: 	C:\Program Files\Go\src\-e (from $GOROOT) 	C:\Users\luca\go\src\-e (from $GOPATH) cannot find package "-f" in any of: 	C:\Program Files\Go\src\-f (from $GOROOT) 	C:\Users\luca\go\src\-f (from $GOPATH) cannot find package "{{context.ReleaseTags}}" in any of: 	C:\Program Files\Go\src\{{context.ReleaseTags}} (from $GOROOT) 	C:\Users\luca\go\src\{{context.ReleaseTags}} (from $GOPATH) : packages.Load error

我该怎么办? (另外,当我采用自己的解决方案时,_windows.go 文件中的函数重复会导致错误(不是警告))

谢谢

这个问题是由于gopls无法识别特定操作系统的构建标签导致的。你需要为这些文件添加正确的构建标签,并配置gopls的构建标志。

首先,在每个文件顶部添加对应的构建标签:

osctrl_darwin.go:

//go:build darwin
// +build darwin

package osctrl

import (
    "syscall"
)

// GetSyscallNewProcessGroup 返回一个用于启动新进程组的 SysProcAttr 结构体
func GetSyscallNewProcessGroup() *syscall.SysProcAttr {
    syscallNewProcessGroupLin := &syscall.SysProcAttr{
        Setpgid: true,
    }

    return syscallNewProcessGroupLin
}

osctrl_linux.go:

//go:build linux
// +build linux

package osctrl

import (
    "syscall"
)

// GetSyscallNewProcessGroup 返回一个用于启动新进程组的 SysProcAttr 结构体
func GetSyscallNewProcessGroup() *syscall.SysProcAttr {
    syscallNewProcessGroupLin := &syscall.SysProcAttr{
        Setpgid: true,
    }

    return syscallNewProcessGroupLin
}

osctrl_windows.go:

//go:build windows
// +build windows

package osctrl

import (
    "syscall"
)

// GetSyscallNewProcessGroup 返回一个用于启动新进程组的 SysProcAttr 结构体
func GetSyscallNewProcessGroup() *syscall.SysProcAttr {
    syscallNewProcessGroupWin := &syscall.SysProcAttr{
        CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
    }

    return syscallNewProcessGroupWin
}

然后,配置VSCode的gopls设置。在VSCode的设置中(settings.json),添加以下配置:

{
    "gopls": {
        "buildFlags": ["-tags=windows,darwin,linux"]
    }
}

或者,如果你需要更精确的控制,可以为不同的工作区配置不同的标签:

{
    "gopls": {
        "buildFlags": ["-tags=windows"]
    }
}

如果你使用go.work文件,确保工作区配置正确。创建一个go.work文件:

go 1.18

use ./osctrl

完成这些更改后,重新启动VSCode或重新加载窗口(Ctrl+Shift+P -> “Developer: Reload Window”)。gopls现在应该能够正确识别这些特定操作系统的文件,警告应该消失,并且悬停功能应该正常工作。

回到顶部