go: bump rules_go, autodetect nix for go toolchains

Change-Id: If10a7843e5e54ade82fbeec85f4e6727e4d2a117
diff --git a/WORKSPACE b/WORKSPACE
index 68f8f7d..caa380b 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -169,24 +169,27 @@
 http_archive(
     name = "io_bazel_rules_go",
     urls = [
-        "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.18.7/rules_go-0.18.7.tar.gz",
-        "https://github.com/bazelbuild/rules_go/releases/download/0.18.7/rules_go-0.18.7.tar.gz",
+        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.21.3/rules_go-v0.21.3.tar.gz",
+        "https://github.com/bazelbuild/rules_go/releases/download/v0.21.3/rules_go-v0.21.3.tar.gz",
     ],
-    sha256 = "45409e6c4f748baa9e05f8f6ab6efaa05739aa064e3ab94e5a1a09849c51806a",
+    sha256 = "af04c969321e8f428f63ceb73463d6ea817992698974abeff0161e069cd08bd6",
 )
 
-load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
-
-go_rules_dependencies()
-
-go_register_toolchains()
+# Invoke go_rules_dependencies depending on host platform.
+load("//tools:go_sdk.bzl", "gen_imports")
+gen_imports(name = "go_sdk_imports")
+load("@go_sdk_imports//:imports.bzl", "load_go_sdk")
+load_go_sdk()
 
 # Go Gazelle rules
 
 http_archive(
     name = "bazel_gazelle",
-    urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.17.0/bazel-gazelle-0.17.0.tar.gz"],
-    sha256 = "3c681998538231a2d24d0c07ed5a7658cb72bfb5fd4bf9911157c0e9ac6a2687",
+    urls = [
+        "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/bazel-gazelle/releases/download/v0.20.0/bazel-gazelle-v0.20.0.tar.gz",
+        "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.20.0/bazel-gazelle-v0.20.0.tar.gz",
+    ],
+    sha256 = "d8c45ee70ec39a57e7a05e5027c32b1576cc7f16d9dd37135b0eddde45cf1b10",
 )
 
 load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
diff --git a/tools/go_sdk.bzl b/tools/go_sdk.bzl
new file mode 100644
index 0000000..1884c42
--- /dev/null
+++ b/tools/go_sdk.bzl
@@ -0,0 +1,28 @@
+def _gen_imports_impl(ctx):
+    ctx.file("BUILD", "")
+
+    is_nixos = "NIX_PATH" in ctx.os.environ
+    bzl_file_content = """
+load(
+    "@io_bazel_rules_go//go:deps.bzl",
+    "go_register_toolchains",
+    "go_rules_dependencies",
+)
+def load_go_sdk():
+    go_rules_dependencies()
+    go_register_toolchains({go_version})
+    """.format(
+        go_version = 'go_version = "host"' if is_nixos else "",
+    )
+
+    ctx.file("imports.bzl", bzl_file_content)
+
+_gen_imports = repository_rule(
+    implementation = _gen_imports_impl,
+    attrs = dict(),
+)
+
+def gen_imports(name):
+    _gen_imports(
+        name = name,
+    )