scripts/Windows/install_go.ps1

$go_versions = @(
    @{
        "version" = "1.13.3"
        "folder" = "go113"
    }
    @{
        "version" = "1.12.12"
        "folder" = "go112"
    }
    @{
        "version" = "1.11.13"
        "folder" = "go111"
    }
    @{
        "version" = "1.10.8"
        "folder" = "go110"
    }
    @{
        "version" = "1.9.7"
        "folder" = "go19"
    }
    @{
        "version" = "1.8.7"
        "folder" = "go18"
    }
    @{
        "version" = "1.7.6"
        "folder" = "go17"
    }
    @{
        "version" = "1.6.4"
        "folder" = "go16"
    }
    @{
        "version" = "1.5.4"
        "folder" = "go15"
    }
    @{
        "version" = "1.4.3"
        "folder" = "go14"
    }
)

function InstallGo ($go_version, $folder_name) {

    Write-Host "Installing Go $go_version x86..." -ForegroundColor Cyan

    $destDir = "C:\$folder_name"

    Write-Host "Removing Go in $destDir..."
    if(Test-Path $destDir) {
        Remove-Item $destDir -Recurse -Force
    }
    if(Test-Path "$destDir-x86") {
        Remove-Item "$destDir-x86" -Recurse -Force
    }
    
    Write-Host "Downloading..."
    $goDistPath = "$env:TEMP\go$go_version.windows-386.zip"
    (New-Object Net.WebClient).DownloadFile("https://storage.googleapis.com/golang/go$go_version.windows-386.zip", $goDistPath)
    
    Write-Host "Unpacking..."
    7z x $goDistPath -o"$destDir-temp-x86" | Out-Null
    [IO.Directory]::Move("$destDir-temp-x86\go", "$destDir-x86")
    Remove-Item "$destDir-temp-x86" -Recurse -Force
    del $goDistPath
    
    Write-Host "Installing Go $go_version x64..." -ForegroundColor Cyan
    
    Write-Host "Downloading..."
    $goDistPath = "$env:TEMP\go$go_version.windows-amd64.zip"
    (New-Object Net.WebClient).DownloadFile("https://storage.googleapis.com/golang/go$go_version.windows-amd64.zip", $goDistPath)
    
    Write-Host "Unpacking..."
    7z x $goDistPath -o"$destDir-temp-x64" | Out-Null
    [IO.Directory]::Move("$destDir-temp-x64\go", "$destDir")
    Remove-Item "$destDir-temp-x64" -Recurse -Force
    del $goDistPath
}

if(Test-Path 'C:\go') {
    Remove-Item 'C:\go' -Recurse -Force
}
if(Test-Path 'C:\go-x86') {
    Remove-Item 'C:\go-x86' -Recurse -Force
}

# install go
for($i = 0; $i -lt $go_versions.Count; $i++) {
    InstallGo $go_versions[$i].version $go_versions[$i].folder
}

cmd /c mklink /J C:\go "C:\$($go_versions[0].folder)"
cmd /c mklink /J C:\go-x86 "C:\$($go_versions[0].folder)-x86"

# make sure paths added
Add-Path C:\go\bin
Add-SessionPath C:\go\bin

# set GOROOT variable
[Environment]::SetEnvironmentVariable("GOROOT", 'C:\go', "Machine")

go version

# test go installations

C:\go\bin\go.exe version
C:\go-x86\bin\go.exe version

<#
for($i = 0; $i -lt $go_versions.Count; $i++) {
    & "C:\$($go_versions[$i].folder)\bin\go.exe" version
    & "C:\$($go_versions[$i].folder)-x86\bin\go.exe" version
}
#>