diff --git a/docs/usage.rst b/docs/usage.rst
index 34c07a0..64e27ac 100644
--- a/docs/usage.rst
+++ b/docs/usage.rst
@@ -946,6 +946,17 @@ Check `Visual Studio Code Marketplace `_ for updates.
+
+go
+ The name of Go package or module, e.g. ``github.com/caddyserver/caddy/v2/cmd``.
+
Combine others' results
~~~~~~~~~~~~~~~~~~~~~~~
::
diff --git a/nvchecker_source/go.py b/nvchecker_source/go.py
new file mode 100644
index 0000000..00a017b
--- /dev/null
+++ b/nvchecker_source/go.py
@@ -0,0 +1,36 @@
+# MIT licensed
+# Copyright (c) 2024 bgme .
+
+from lxml import html
+
+from nvchecker.api import (
+ VersionResult, Entry, AsyncCache, KeyManager,
+ session, GetVersionError, HTTPError
+)
+
+GO_PKG_URL = 'https://pkg.go.dev/{pkg}?tab=versions'
+
+
+async def get_version(
+ name: str, conf: Entry, *,
+ cache: AsyncCache, keymanager: KeyManager,
+ **kwargs,
+) -> VersionResult:
+ key = tuple(sorted(conf.items()))
+ return await cache.get(key, get_version_impl)
+
+
+async def get_version_impl(info) -> VersionResult:
+ conf = dict(info)
+ pkg_name = conf.get('go')
+
+ url = GO_PKG_URL.format(pkg=pkg_name)
+ res = await session.get(url)
+ doc = html.fromstring(res.body.decode())
+
+ elements = doc.xpath("//div[@class='Version-tag']/a/text()")
+ try:
+ version = elements[0]
+ return version
+ except IndexError:
+ raise GetVersionError("parse error", pkg_name=pkg_name)
diff --git a/tests/test_go.py b/tests/test_go.py
new file mode 100644
index 0000000..b0d39aa
--- /dev/null
+++ b/tests/test_go.py
@@ -0,0 +1,36 @@
+# MIT licensed
+# Copyright (c) 2024 bgme .
+
+import pytest
+
+from nvchecker.api import HTTPError
+
+lxml_available = True
+try:
+ import lxml
+except ImportError:
+ lxml_available = False
+
+pytestmark = [
+ pytest.mark.asyncio(scope="session"),
+ pytest.mark.needs_net,
+ pytest.mark.skipif(not lxml_available, reason="needs lxml")
+]
+
+
+async def test_go(get_version):
+ assert await get_version("one version", {
+ "source": "go",
+ "go": "github.com/caddyserver/replace-response",
+ }) == "v0.0.0-20231221003037-a85d4ddc11d6"
+
+ assert await get_version("multiple version", {
+ "source": "go",
+ "go": "github.com/corazawaf/coraza-caddy",
+ }) == "v1.2.2"
+
+ with pytest.raises(HTTPError):
+ await get_version("not found", {
+ "source": "go",
+ "go": "github.com/asdas/sadfasdf",
+ })