Radar #002 · Week 40 · Sep 28 – Oct 4, 2026from 3 items
Go 1.27 adds experimental arch‑specific SIMD vector APIs, the `debug/pe.ImportDirectory` symbol is deprecated, and a `cgobindings` GOEXPERIMENT is accepted for the cgo‑without‑a‑C‑toolchain proposal.
Worth knowingstdlib
Arch‑specific SIMD vector APIs (experimental)
- What changed
- Go 1.27 introduces experimental arch‑specific SIMD vector APIs.
- Production impact
- The source does not say.
- Try it
- Build a program that imports the new SIMD package and runs on a supported architecture.
- Source
- go.dev/blog/archsimd
Explain it and run it
Understand it, then run it
Run it now
package main
import "fmt"
// This program demonstrates how you would add two float32 slices
// without the experimental archsimd package, which is not available
// in Go 1.27.1. It uses a plain loop as a fallback.
func addFloat32(a, b []float32) []float32 {
if len(a) != len(b) {
panic("slice length mismatch")
}
out := make([]float32, len(a))
for i := range a {
out[i] = a[i] + b[i]
}
return out
}
func main() {
x := []float32{1.0, 2.0, 3.0, 4.0}
y := []float32{5.0, 6.0, 7.0, 8.0}
z := addFloat32(x, y)
fmt.Println("result:", z) // prints [6 8 10 12]
}
What it printed when we ran it on Go 1.27.1
result: [6 8 10 12]
After the change ships
go · the proposal's code; it does not compile until the change ships
// Does not compile until the experimental archsimd API ships.
package main
import (
"fmt"
"simd/archsimd"
)
func main() {
// Enable the SIMD experiment when building:
// GOEXPERIMENT=simd go run .
x := []float32{1, 2, 3, 4}
y := []float32{5, 6, 7, 8}
// Load full vectors (4 × float32 fits Float32x4)
a := archsimd.LoadFloat32x4(x)
b := archsimd.LoadFloat32x4(y)
// Perform element‑wise addition; the method name is the same on all architectures.
c := a.Add(b)
// Store the result back to a slice.
out := make([]float32, 4)
c.Store(out)
fmt.Println("result:", out) // expected: [6 8 10 12]
}
Run sends this program (for Solidity, the contract and its tests) to our own sandbox, where it is compiled and run once, with no network, and what it printed or the test report comes back here. Nothing is kept. Runs are counted per visitor for the day so everyone gets a turn; the details are on the legal page.
Worth knowingstdlib
Deprecate `debug/pe.ImportDirectory`
- What changed
- The proposal deprecates
debug/pe.ImportDirectory. - Production impact
- The source does not say.
- Try it
- Search your code for uses of
debug/pe.ImportDirectoryand replace or remove them. - Source
- github.com/golang/go/issues/81594
Explain it and run it
Understand it, then run it
Run it now
package main
import (
"debug/pe"
"fmt"
)
func main() {
// In Go 1.27.1 the type `pe.ImportDirectory` still exists but is marked deprecated.
// This program creates a zero value of that type and prints it to show the API is usable.
var dir pe.ImportDirectory
fmt.Printf("zero ImportDirectory value: %+v\n", dir)
}
What it printed when we ran it on Go 1.27.1
zero ImportDirectory value: {OriginalFirstThunk:0 TimeDateStamp:0 ForwarderChain:0 Name:0 FirstThunk:0 dll:}
Run sends this program (for Solidity, the contract and its tests) to our own sandbox, where it is compiled and run once, with no network, and what it printed or the test report comes back here. Nothing is kept. Runs are counted per visitor for the day so everyone gets a turn; the details are on the legal page.
Worth knowingtooling
Add `cgobindings` GOEXPERIMENT for cgo without a C toolchain
- What changed
- A
cgobindingsGOEXPERIMENT is accepted to allow experimentation with cgo that does not require a C toolchain. - Production impact
- The source does not say.
- Try it
- Build a program with
GOEXPERIMENT=cgobindingsand observe the behavior of cgo. - Source
- github.com/golang/go/issues/81662
Explain it and run it
Understand it, then run it
Run it now
package main
import (
"fmt"
"os"
)
func main() {
// In Go 1.27.1 the cgobindings GOEXPERIMENT does not exist.
// This program shows that the experiment flag is not set,
// which means cgo still requires a C toolchain.
if exp := os.Getenv("GOEXPERIMENT"); exp == "" {
fmt.Println("GOEXPERIMENT is empty – cgobindings is not available")
} else {
fmt.Printf("GOEXPERIMENT=%s – cgobindings may be enabled in a future release\n", exp)
}
}
What it printed when we ran it on Go 1.27.1
GOEXPERIMENT is empty – cgobindings is not available
Run sends this program (for Solidity, the contract and its tests) to our own sandbox, where it is compiled and run once, with no network, and what it printed or the test report comes back here. Nothing is kept. Runs are counted per visitor for the day so everyone gets a turn; the details are on the legal page.
Exercise
Write a small program that uses the newly introduced experimental SIMD API to add two slices of int32 on a supported architecture.
The 60-second version
In Go 1.27 the team added experimental architecture‑specific SIMD vector APIs, giving you a way to write vectorized code on supported CPUs. At the same time the `debug/pe.ImportDirectory` symbol has been marked as deprecated, so you should check any Windows PE handling code for its usage. Finally, a new GOEXPERIMENT called `cgobindings` was accepted, allowing developers to try cgo without a C toolchain while the proposal is evaluated. These changes are not part of a point release, so they won’t break existing builds, but they provide new avenues to explore performance and tooling improvements.
Written by gpt-oss-120b · claims checked against the sources · human-reviewed