diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts
index 537348b..9e39075 100644
--- a/__tests__/setup-go.test.ts
+++ b/__tests__/setup-go.test.ts
@@ -13,6 +13,8 @@ let matchers = require('../matchers.json');
 let goTestManifest = require('./data/versions-manifest.json');
 let matcherPattern = matchers.problemMatcher[0].pattern[0];
 let matcherRegExp = new RegExp(matcherPattern.regexp);
+let win32Join = path.win32.join;
+let posixJoin = path.posix.join;
 
 describe('setup-go', () => {
   let inputs = {} as any;
@@ -27,8 +29,10 @@ describe('setup-go', () => {
   let getSpy: jest.SpyInstance;
   let platSpy: jest.SpyInstance;
   let archSpy: jest.SpyInstance;
+  let joinSpy: jest.SpyInstance;
   let dlSpy: jest.SpyInstance;
   let extractTarSpy: jest.SpyInstance;
+  let extractZipSpy: jest.SpyInstance;
   let cacheSpy: jest.SpyInstance;
   let dbgSpy: jest.SpyInstance;
   let whichSpy: jest.SpyInstance;
@@ -61,10 +65,21 @@ describe('setup-go', () => {
     archSpy.mockImplementation(() => os['arch']);
     execSpy = jest.spyOn(cp, 'execSync');
 
+    // switch path join behaviour based on set os.platform
+    joinSpy = jest.spyOn(path, 'join');
+    joinSpy.mockImplementation((...paths: string[]): string => {
+      if (os['platform'] == 'win32') {
+        return win32Join(...paths);
+      }
+
+      return posixJoin(...paths);
+    });
+
     // @actions/tool-cache
     findSpy = jest.spyOn(tc, 'find');
     dlSpy = jest.spyOn(tc, 'downloadTool');
     extractTarSpy = jest.spyOn(tc, 'extractTar');
+    extractZipSpy = jest.spyOn(tc, 'extractZip');
     cacheSpy = jest.spyOn(tc, 'cacheDir');
     getSpy = jest.spyOn(im, 'getVersionsDist');
     getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo');
@@ -325,6 +340,31 @@ describe('setup-go', () => {
     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`);
   });
 
+  it('downloads a version not in the cache (windows)', async () => {
+    os.platform = 'win32';
+    os.arch = 'x64';
+
+    inputs['go-version'] = '1.13.1';
+    process.env['RUNNER_TEMP'] = 'C:\\temp\\';
+
+    findSpy.mockImplementation(() => '');
+    dlSpy.mockImplementation(() => 'C:\\temp\\some\\path');
+    extractZipSpy.mockImplementation(() => 'C:\\temp\\some\\other\\path');
+
+    let toolPath = path.normalize('C:\\cache\\go\\1.13.0\\x64');
+    cacheSpy.mockImplementation(() => toolPath);
+
+    await main.run();
+
+    let expPath = path.win32.join(toolPath, 'bin');
+    expect(dlSpy).toHaveBeenCalledWith(
+      'https://storage.googleapis.com/golang/go1.13.1.windows-amd64.zip',
+      'C:\\temp\\go1.13.1.windows-amd64.zip',
+      undefined
+    );
+    expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`);
+  });
+
   it('does not find a version that does not exist', async () => {
     os.platform = 'linux';
     os.arch = 'x64';
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 1426785..f598dfd 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -62942,7 +62942,11 @@ function resolveVersionFromManifest(versionSpec, stable, auth) {
 function installGoVersion(info, auth) {
     return __awaiter(this, void 0, void 0, function* () {
         core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`);
-        const downloadPath = yield tc.downloadTool(info.downloadUrl, undefined, auth);
+        // Windows requires that we keep the extension (.zip) for extraction
+        const isWindows = os_1.default.platform() === 'win32';
+        const tempDir = process.env.RUNNER_TEMP || '.';
+        const fileName = isWindows ? path.join(tempDir, info.fileName) : undefined;
+        const downloadPath = yield tc.downloadTool(info.downloadUrl, fileName, auth);
         core.info('Extracting Go...');
         let extPath = yield extractGoArchive(downloadPath);
         core.info(`Successfully extracted go to ${extPath}`);
diff --git a/src/installer.ts b/src/installer.ts
index c1a1e39..58c9428 100644
--- a/src/installer.ts
+++ b/src/installer.ts
@@ -132,7 +132,13 @@ async function installGoVersion(
   auth: string | undefined
 ): Promise<string> {
   core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`);
-  const downloadPath = await tc.downloadTool(info.downloadUrl, undefined, auth);
+
+  // Windows requires that we keep the extension (.zip) for extraction
+  const isWindows = os.platform() === 'win32';
+  const tempDir = process.env.RUNNER_TEMP || '.';
+  const fileName = isWindows ? path.join(tempDir, info.fileName) : undefined;
+
+  const downloadPath = await tc.downloadTool(info.downloadUrl, fileName, auth);
 
   core.info('Extracting Go...');
   let extPath = await extractGoArchive(downloadPath);