| --- |
| title: Go 1.27 Release Notes |
| template: false |
| --- |
| |
| <style> |
| main ul li { margin: 0.5em 0; } |
| </style> |
| |
| ## Introduction to Go 1.27 {#introduction} |
| |
| The latest Go release, version 1.27, arrives in [August 2026](/doc/devel/release#go1.27.0), six months after [Go 1.26](/doc/go1.26). |
| Most of its changes are in the implementation of the toolchain, runtime, and libraries. |
| As always, the release maintains the Go 1 [promise of compatibility](/doc/go1compat). |
| We expect almost all Go programs to continue to compile and run as before. |
| |
| ## Changes to the language {#language} |
| |
| <!-- go.dev/issue/77273 --> |
| |
| Go 1.27 now supports [generic methods](/issue/77273): |
| a [method declaration](/ref/spec#Method_declarations) may declare its own |
| [type parameters](/ref/spec#Type_parameter_declarations). |
| This widely anticipated change allows adding generic functions within |
| the namespace of a particular data type where before one had to declare |
| such functions with a scope of the entire package. |
| As an example, `math/rand/v2` now also declares a generic method with signature |
| `(*Rand) N[Int intType](Int) Int`, whereas previously it had just a |
| generic function `N[Int intType](Int) Int` (see [below](#rand) for details). |
| Note that methods of [interfaces](/ref/spec#Interface_types) may not declare |
| type parameters nor can interface methods be implemented by generic methods. |
| |
| <!-- go.dev/issue/9859 --> |
| |
| A key in a [struct literal](/ref/spec#Composite_literals) may now be any |
| valid [field selector](/issue/9859) for the struct type, not just a |
| (top-level) field name of the struct. |
| |
| <!-- go.dev/issue/77245 --> |
| |
| Function type inference has been [generalized](/issue/77245) to apply in all |
| contexts where a generic function is [assigned](/ref/spec#Assignability) to a |
| variable of (or converted to) a matching function type. |
| |
| ## Tools {#tools} |
| |
| <!-- go.dev/issue/77177 --> |
| |
| Response file (`@file`) parsing is now supported for the `compile`, `link`, `asm`, `cgo`, `cover`, and `pack` tools. |
| The response file contains whitespace-separated arguments with support for single-quoted and double-quoted strings, escape sequences, and backslash-newline line continuation. |
| The format is compatible with GCC's response file implementation to ensure interoperability with existing build systems. |
| |
| ### Go command {#go-command} |
| |
| <!-- go.dev/issue/78090 --> |
| |
| The `go` command no longer has support for the `bzr` version control system. |
| It will no longer be able to directly fetch modules hosted on `bzr` servers. |
| |
| #### `GODEBUG` |
| |
| <!-- go.dev/issue/79422 --> |
| |
| Starting with Go 1.27, the `go` command now recognizes a `GODEBUG` setting |
| for which support was removed (such as `asynctimerchan`, see [below](#runtime)) if it appears in `go.mod` |
| files (`godebug` entries) and `.go` source files (`//go:debug` comments). |
| It accepts these settings if they are set to the final default value established before |
| the setting was removed. |
| If they are set to an old value, the `go` command will fail. |
| This change is in the spirit of the [Go 1 compatibility guarantee](/doc/go1compat) |
| and allows existing programs that set supported `GODEBUG` settings to continue to |
| build and run without changes even when the respective setting support has been removed. |
| |
| #### `go test` |
| |
| `go test` now invokes the `stdversion` vet check by default. |
| This reports the use of standard library symbols that are too new |
| for the Go version in force in the referring file, |
| as determined by `go` directive in `go.mod` and build tags on the file. |
| |
| <!-- go.dev/issue/62728 --> |
| |
| `go test -json` now annotates `"Action":"output"` lines with an optional |
| new field `"OutputType"`, specifying the type of output. |
| Currently, the possible values include "error", "error-continue", and "frame". |
| See [cmd/test2json help](/cmd/test2json#hdr-Output_Format) for details. |
| |
| #### `go doc` |
| |
| <!-- go.dev/issue/63696 --> |
| |
| The `go doc` command now supports `package@version` syntax, such as |
| `go doc example.com/pkg@v1.2.3`. |
| |
| <!-- go.dev/issue/26715 --> |
| |
| The `go doc` command now accepts the `-ex` command-line option to |
| list executable examples of the given package or symbol. |
| When an example name is passed on the command line (such as |
| `go doc bytes.ExampleBuffer`), `go doc` now prints the example source |
| code along with comments. |
| |
| #### `go fix` |
| |
| The `go fix` command contains several new modernizers (`atomictypes`, `embedlit`, `slicesbackward`, and `unsafefuncs`). |
| |
| <!-- go.dev/issue/77581 --> |
| |
| The existing `fmtappendf` analyzer was removed due to stylistic concerns. |
| |
| The existing `waitgroup` analyzer was renamed to `waitgroupgo` to avoid ambiguity. |
| |
| #### `go mod tidy` |
| |
| <!-- go.dev/issue/56471 --> |
| |
| For modules specifying `go 1.27` or later in their `go.mod` file, `go mod tidy` |
| now automatically merges duplicate require blocks. This ensures the file |
| maintains a clean, standard structure containing at most two require blocks: |
| one for direct dependencies and one for indirect dependencies. |
| |
| Existing comment blocks attached to dependencies are preserved during this |
| consolidation. If a comment block is associated with a mixed set of directives |
| (containing both direct and indirect dependencies), the comment block is merged |
| and attached to the new direct dependency block. |
| |
| Previously, if a `go.mod` file accumulated multiple disjoint require blocks |
| (often due to manual edits, unresolved Git merge conflicts, or legacy upgrades) |
| `go mod tidy` would leave the extra blocks intact or inadvertently create new |
| ones. The tool now strictly enforces the two-block layout, consolidating |
| disparate requirements into their respective blocks and cleaning up the |
| structure of the module file automatically. |
| |
| ### Trace |
| |
| <!-- go.dev/issue/78921 --> |
| |
| `go tool trace`'s `-http` command-line option now restricts the listen |
| address to localhost when passed only a port (e.g., `-http=:6060`). |
| This change makes `go tool trace` consistent with the behavior of |
| `go tool pprof`'s `-http` flag. |
| To listen on all addresses, explicitly include the specified address |
| (e.g., `-http=0.0.0.0:6060`). |
| |
| ## Runtime {#runtime} |
| |
| <!-- CL 742580 --> |
| |
| Tracebacks for modules with `go` directives configuring Go 1.27 or later will now |
| include [`runtime/pprof`](https://pkg.go.dev/runtime/pprof) goroutine labels in |
| the header line. This behavior can be disabled with `tracebacklabels=0` `GODEBUG` setting |
| (added in [Go 1.26](/doc/godebug#go-126)). This opt-out is expected to be |
| kept indefinitely in case goroutine labels acquire sensitive information that |
| shouldn't be made available in tracebacks. |
| |
| <!-- CL 781580 --> |
| |
| The `asynctimerchan` `GODEBUG` setting (added in [Go 1.23](/doc/godebug#go-123)) |
| has been removed permanently. Channels created by package [time](https://pkg.go.dev/time) |
| are now always unbuffered (synchronous), irrespective of `GODEBUG` settings. |
| |
| ### Faster memory allocation |
| |
| <!-- go.dev.issue/79286 --> |
| |
| The compiler now generates calls to size-specialized memory allocation |
| routines, reducing the cost of some small (<80 byte) memory allocations by |
| up to 30%. |
| Improvements vary depending on the workload, but the overall improvement is |
| expected to be ~1% in real allocation-heavy programs. |
| This causes the binary size to increase by about 60 KB (independent of the |
| workload). |
| Please [file an issue](/issue/new) if you notice any regressions. |
| You may set `GOEXPERIMENT=nosizespecializedmalloc` at build time to disable |
| it. |
| This opt-out setting is expected to be removed in Go 1.28. |
| |
| ### Goroutine leak profile {#goroutineleak-profiles} |
| |
| <!-- go.dev/issue/74609 --> |
| |
| A new profile type that reports leaked goroutines, previously available |
| as an experiment in [Go 1.26](/doc/go1.26#goroutineleak-profiles), is now |
| generally available. |
| The new profile type, named `goroutineleak`, is supported in the |
| [`runtime/pprof`](/pkg/runtime/pprof) package. |
| It is also available as the [`net/http/pprof`](/pkg/net/http/pprof) |
| endpoint `/debug/pprof/goroutineleak`. |
| |
| A *leaked* goroutine is a goroutine blocked on some concurrency primitive |
| (channels, [`sync.Mutex`](/pkg/sync#Mutex), [`sync.Cond`](/pkg/sync#Cond), etc) |
| that cannot possibly become unblocked. |
| The runtime detects leaked goroutines using the garbage collector: if a |
| goroutine G is blocked on concurrency primitive P, and P is unreachable from |
| any runnable goroutine or any goroutine that *those* could unblock, then P |
| cannot be unblocked, so goroutine G can never wake up. |
| While it is impossible to detect permanently blocked goroutines in all cases, |
| this approach detects a large class of such leaks. |
| |
| Because this technique builds on reachability, the runtime may fail to identify |
| leaks caused by blocking on concurrency primitives reachable through global |
| variables or the local variables of runnable goroutines. |
| |
| See [Go 1.26 release notes](/doc/go1.26#goroutineleak-profiles) for an example. |
| |
| Special thanks to Vlad Saioc at Uber for contributing this work. |
| |
| The `goroutineleakprofile` `GOEXPERIMENT` setting is now deleted. |
| |
| ## Compiler {#compiler} |
| |
| The compiler now resolves a relative filename in a `//line` or `/*line*/` |
| directive against the directory of the file containing the directive, |
| matching the behavior of [`go/scanner`](/pkg/go/scanner). |
| Absolute filenames are unaffected. |
| See [#70478](/issue/70478). |
| |
| <!-- go.dev/issue/60324, CL 770200 --> |
| |
| The compiler now generates simpler names for function literals |
| (closures). |
| Previously, when the containing function is inlined, the function |
| literal's name can get quite long. |
| Now the compiler chooses the same name for the function literal |
| regardless of inlining. |
| It may also combine multiple instances of the same function literal |
| (as its containing function is inlined) to share the same code in |
| the compiled binary. |
| This change does not affect the functionality of Go code. |
| Tests that check symbol names may need update, although it is |
| recommended to not depend on the names of function literals. |
| For programs that [incorrectly](/pkg/reflect#Value.Pointer) compare |
| function code pointer for equality, the issue may be more exposed |
| with Go 1.27, as function literals with different captured closure |
| data may have equal code pointers in more cases. |
| |
| ## Linker {#linker} |
| |
| <!-- CL 751260, go.dev/issue/58722 --> |
| |
| When targeting macOS, the linker now accepts `-macos` and `-macsdk` |
| command-line options, which specify the OS and SDK versions in the |
| `LC_BUILD_VERSION` load command. |
| By default, it selects the oldest supported macOS version (currently |
| [13.0.0](#darwin)) and a recent SDK version (currently 26.2.0). |
| |
| ## Standard library {#library} |
| |
| ### New encoding/json/v2 and encoding/json/jsontext packages {#jsonv2} |
| |
| <!-- go.dev/issue/71497 --> |
| |
| Two new packages are now available: |
| |
| - The [`encoding/json/v2`](/pkg/encoding/json/v2) package is a major |
| revision of [`encoding/json`](/pkg/encoding/json). It provides |
| [`Marshal`](/pkg/encoding/json/v2#Marshal), |
| [`MarshalWrite`](/pkg/encoding/json/v2#MarshalWrite), |
| [`MarshalEncode`](/pkg/encoding/json/v2#MarshalEncode), |
| [`Unmarshal`](/pkg/encoding/json/v2#Unmarshal), |
| [`UnmarshalRead`](/pkg/encoding/json/v2#UnmarshalRead), and |
| [`UnmarshalDecode`](/pkg/encoding/json/v2#UnmarshalDecode), |
| all of which accept variadic [`Options`](/pkg/encoding/json/v2#Options) |
| arguments to configure marshaling and unmarshaling behavior. |
| |
| - The [`encoding/json/jsontext`](/pkg/encoding/json/jsontext) package |
| provides lower-level syntactic processing of JSON. |
| The [`Encoder`](/pkg/encoding/json/jsontext#Encoder) and |
| [`Decoder`](/pkg/encoding/json/jsontext#Decoder) types operate on |
| JSON as a sequence of |
| [`Token`](/pkg/encoding/json/jsontext#Token) and |
| [`Value`](/pkg/encoding/json/jsontext#Value), |
| maintaining a state machine to ensure the produced or consumed |
| sequence is valid JSON text. |
| |
| The v2 package chooses stricter, more interoperable defaults than v1: |
| it rejects invalid UTF-8 in JSON strings and rejects duplicate names within |
| a JSON object. See the v1 [`encoding/json`](/pkg/encoding/json#hdr-Migrating_to_v2) package |
| documentation for the complete set of behavioral differences and |
| the options available to adjust them. |
| |
| The [`encoding/json`](/pkg/encoding/json) package is now backed by the |
| v2 implementation. Marshaling and unmarshaling behavior is preserved, but |
| the exact text of error messages may differ. The package also gains a number of |
| new [`Options`](/pkg/encoding/json#Options) that can configure v2 to operate |
| with v1 semantics to avoid requiring a full migration to the new API. |
| The v1 API will continue to be supported and users are not required to migrate. |
| |
| Marshal performance is broadly at parity with the previous implementation, |
| while unmarshal performance is significantly faster. |
| |
| Users who encounter compatibility problems with the new implementation |
| may disable it by setting `GOEXPERIMENT=nojsonv2` at build time, |
| restoring the original v1 implementation. |
| This opt-out is expected to be removed in a future release. |
| |
| Some notable changes to `encoding/json/v2` over the course of the `GOEXPERIMENT` include |
| the following removals: |
| the `format` tag option ([#79071](/issue/79071)), |
| the `unknown` tag option ([#77271](/issue/77271)), |
| the `DiscardUnknownMembers` marshal option ([#77271](/issue/77271)), |
| and the `SkipFunc` sentinel error ([#74324](/issue/74324)). |
| In addition, the `inline` tag option was renamed to `embed` ([#79985](/issue/79985)), and |
| behavior was updated for the [`string`](/pkg/encoding/json/v2#hdr-JSON_Representation_of_Go_structs) |
| tag option ([#79065](/issue/79065)) |
| and the [`MatchCaseInsensitiveNames`](/pkg/encoding/json/v2#MatchCaseInsensitiveNames) |
| option ([CL 792780](/cl/792780)). |
| In `encoding/json/jsontext`, the numeric [`Token`](/pkg/encoding/json/jsontext#Token) |
| accessors were changed to also return errors ([#77666](/issue/77666)). |
| |
| See the [proposal issue](/issue/71497) for background and additional detail. |
| If you need to disable the new implementation, [please file an issue](/issue/new). |
| |
| ### New crypto/mldsa package {#crypto_mldsa} |
| |
| <!-- https://go.dev/issue/77626, https://go.dev/issue/78888 --> |
| |
| The new [`crypto/mldsa`](/pkg/crypto/mldsa) package implements the post-quantum ML-DSA signature |
| scheme specified in FIPS 204. |
| |
| [`crypto/x509`](/pkg/crypto/x509) now supports ML-DSA private keys, public keys, and signatures. |
| |
| [`crypto/tls`](/pkg/crypto/tls) now supports ML-DSA signatures in TLS 1.3, with the new |
| [`MLDSA44`](/pkg/crypto/tls#MLDSA44), [`MLDSA65`](/pkg/crypto/tls#MLDSA65), |
| and [`MLDSA87`](/pkg/crypto/tls#MLDSA87) [`SignatureScheme`](/pkg/crypto/tls#SignatureScheme) values. |
| |
| ### New uuid package {#uuid} |
| |
| <!-- https://go.dev/issue/62026 --> |
| |
| The new [`uuid`](/pkg/uuid) package generates and parses UUIDs. |
| |
| |
| ### New experimental simd package {#simd} |
| |
| Go 1.27 introduces a new experimental [`simd`](/pkg/simd) |
| package that provides portable and vector-size-agnostic SIMD |
| support. It will make use of the hardware instructions |
| if they are available. |
| This package is enabled by setting the environment variable |
| `GOEXPERIMENT=simd` at build time. |
| |
| The `simd` package is available on all architectures, and provides |
| vector types of unspecified size such as [`Int8s`](/pkg/simd#Int8s) and [`Float32s`](/pkg/simd#Float32s). |
| It supports a "scalable" subset of the operations present in the |
| [`simd/archsimd`](/pkg/simd/archsimd) package |
| that are hardware-supported or easily emulated across architectures |
| and vector widths. |
| |
| See the [proposal issue](/issue/78902) for more details. |
| |
| ### Experimental simd/archsimd package {#archsimd} |
| |
| Go 1.27 continues the experimental support for SIMD operations in |
| the [`simd/archsimd`](/pkg/simd/archsimd/) package that began in [Go 1.26](/doc/go1.26#simd). |
| This release revises the amd64 API and adds support for arm64 "Neon" 128-bit SIMD and WebAssembly 128-bit SIMD. |
| The `simd/archsimd` package is enabled by setting the environment variable |
| `GOEXPERIMENT=simd` at build time. |
| |
| This package provides access to architecture-specific SIMD operations. |
| It supports 128-bit vector types on wasm, arm64, and amd64, |
| and 256-bit and 512-bit vector types on some amd64 processors. |
| The API is not yet considered stable. |
| |
| See the [package documentation](/pkg/simd/archsimd) and the [proposal issue](/issue/73787) for more details. |
| |
| We intend to provide support for additional architectures in future versions, but the |
| API is intentionally architecture-specific and thus non-portable. |
| |
| ### Minor changes to the library {#minor_library_changes} |
| |
| #### [`bytes`](/pkg/bytes/) |
| |
| <!-- 6-stdlib/99-minor/bytes/71151.md --> |
| |
| The new [`CutLast`](/pkg/bytes#CutLast) function slices a `[]byte` |
| around the last occurrence of a separator. |
| It can replace and simplify some common uses of [`LastIndex`](/pkg/bytes#LastIndex). |
| |
| #### [`compress/flate`](/pkg/compress/flate/) |
| |
| <!-- go.dev/issue/75532, CL 707355 --> |
| |
| Compression speed is improved in Go 1.27. |
| The exact encoded output from [`Writer`](/pkg/compress/flate#Writer) may be different from Go 1.26 |
| as a result of the encoder implementation change. |
| Since DEFLATE is the underlying compression used in [`archive/zip`](/pkg/archive/zip), [`compress/gzip`](/pkg/compress/gzip), [`compress/zlib`](/pkg/compress/zlib), and [`image/png`](/pkg/image/png), |
| the outputs from those packages may also have changed. |
| |
| #### [`crypto`](/pkg/crypto/) |
| |
| <!-- 6-stdlib/99-minor/crypto/77626.md --> |
| |
| The new [`MLDSAMu`](/pkg/crypto#MLDSAMu) [`Hash`](/pkg/crypto#Hash) value |
| is added for use as a signaling mechanism for External μ ML-DSA signing. |
| |
| #### [`crypto/ecdsa`](/pkg/crypto/ecdsa/) |
| |
| <!-- 6-stdlib/99-minor/crypto/ecdsa/hashlen.md --> |
| |
| [`PrivateKey.Sign`](/pkg/crypto/ecdsa#PrivateKey.Sign) now checks that the length of the hash is correct, |
| if a non-nil [`SignerOpts`](/pkg/crypto#SignerOpts) is provided. |
| |
| #### [`crypto/tls`](/pkg/crypto/tls/) |
| |
| <!-- 6-stdlib/99-minor/crypto/tls/77363.md --> |
| |
| The new [`QUICConfig.ClientHelloInfoConn`](/pkg/crypto/tls#QUICConfig.ClientHelloInfoConn) field specifies the [`net.Conn`](/pkg/net#Conn) to use |
| for the [`ClientHelloInfo.Conn`](/pkg/crypto/tls#ClientHelloInfo.Conn) field during QUIC server handshakes. |
| |
| <!-- 6-stdlib/99-minor/crypto/tls/78543.md --> |
| |
| The [`MLKEM1024`](/pkg/crypto/tls#MLKEM1024) key exchange is now supported. It can be enabled by adding it to |
| [`Config.CurvePreferences`](/pkg/crypto/tls#Config.CurvePreferences). |
| |
| <!-- 6-stdlib/99-minor/crypto/tls/78888.md --> |
| <!-- crypto/tls ML-DSA support is documented in doc/next/6-stdlib/70-mldsa.md. --> |
| |
| <!-- 6-stdlib/99-minor/crypto/tls/79367.md --> |
| |
| [`Config.Rand`](/pkg/crypto/tls#Config.Rand) is now deprecated. |
| For deterministic testing, use [`testing/cryptotest.SetGlobalRandom`](/pkg/testing/cryptotest#SetGlobalRandom). |
| |
| <!-- 6-stdlib/99-minor/crypto/tls/tlsmlkem.md --> |
| |
| Post-quantum hybrid key exchanges can now be explicitly enabled in |
| [`Config.CurvePreferences`](/pkg/crypto/tls#Config.CurvePreferences) even if the `tlsmlkem=0` or `tlssecpmlkem=0` `GODEBUG` |
| options are used. Those options were always meant to only apply to the default |
| set used when [`Config.CurvePreferences`](/pkg/crypto/tls#Config.CurvePreferences) is nil. |
| |
| <!-- go.dev/issue/24673 --> |
| |
| The new [`ConnectionState.LocalCertificate`](/pkg/crypto/tls#ConnectionState.LocalCertificate) |
| field contains the certificate chain presented to the connection peer during the handshake. |
| |
| <!-- go.dev/issue/75316 --> |
| |
| The `tlsunsafeekm` (added in [Go 1.22](/doc/godebug#go-122)), |
| `tlsrsakex` (added in [Go 1.22](/doc/godebug#go-122)), |
| `tls3des` (added in [Go 1.23](/doc/godebug#go-123)), |
| `tls10server` (added in [Go 1.22](/doc/godebug#go-122)), |
| and `x509keypairleaf` (added in [Go 1.23](/doc/godebug#go-123)) |
| `GODEBUG` settings have been removed permanently. |
| |
| <!-- go.dev/issue/72111 --> |
| |
| The `tlskyber` `GODEBUG` setting (added in [Go 1.23](/doc/godebug#go-123)) |
| was removed in [Go 1.24](/doc/godebug#go-124) but the removal was not |
| documented in the [release notes for Go 1.24](/doc/go1.24.md) at that time; |
| it is documented now. |
| |
| #### [`crypto/x509`](/pkg/crypto/x509/) |
| |
| <!-- 6-stdlib/99-minor/crypto/x509/75260.md --> |
| |
| When parsing into [`pkix.Name`](/pkg/crypto/x509/pkix#Name) fields, |
| a wider range of [`pkix.AttributeTypeAndValue.Value`](/pkg/crypto/x509/pkix#AttributeTypeAndValue.Value) |
| types is now supported, and unknown types are parsed into |
| [`asn1.RawValue`](/pkg/encoding/asn1#RawValue). |
| |
| <!-- 6-stdlib/99-minor/crypto/x509/76133.md --> |
| |
| The new [`Certificate.RawSignatureAlgorithm`](/pkg/crypto/x509#Certificate.RawSignatureAlgorithm), [`CertificateRequest.RawSignatureAlgorithm`](/pkg/crypto/x509#CertificateRequest.RawSignatureAlgorithm), |
| and [`RevocationList.RawSignatureAlgorithm`](/pkg/crypto/x509#RevocationList.RawSignatureAlgorithm) fields expose the DER-encoded |
| AlgorithmIdentifier of the signature algorithm, including when the |
| SignatureAlgorithm field is [`UnknownSignatureAlgorithm`](/pkg/crypto/x509#UnknownSignatureAlgorithm). |
| |
| <!-- 6-stdlib/99-minor/crypto/x509/77865.md --> |
| |
| [`SystemCertPool`](/pkg/crypto/x509#SystemCertPool) now respects SSL_CERT_FILE and SSL_CERT_DIR on Windows and |
| Darwin. When these environment variables are set, roots are loaded from disk and |
| instead of using the platform certificate verification APIs, the native Go |
| verifier is used. This behavior can be disabled with |
| `GODEBUG=x509sslcertoverrideplatform=0`. |
| |
| <!-- 6-stdlib/99-minor/crypto/x509/78888.md --> |
| <!-- crypto/x509 ML-DSA support is documented in doc/next/6-stdlib/70-mldsa.md. --> |
| |
| #### [`crypto/x509/pkix`](/pkg/crypto/x509/pkix/) |
| |
| <!-- 6-stdlib/99-minor/crypto/x509/pkix/33093.md --> |
| |
| [`RDNSequence.String`](/pkg/crypto/x509/pkix#RDNSequence.String) (and therefore [`Name.String`](/pkg/crypto/x509/pkix#Name.String)) now renders string-typed |
| attribute values as strings even when the attribute's OID is unrecognized. |
| Previously such values were always hex-encoded in their DER form. |
| See [#33093](/issue/33093). |
| |
| #### [`database/sql`](/pkg/database/sql/) |
| |
| <!-- 6-stdlib/99-minor/database/sql/67546.md --> |
| |
| The new [`ConvertAssign`](/pkg/database/sql#ConvertAssign) function gives database drivers access |
| to the type conversions performed by [`Rows.Scan`](/pkg/database/sql#Rows.Scan). |
| |
| #### [`database/sql/driver`](/pkg/database/sql/driver/) |
| |
| <!-- 6-stdlib/99-minor/database/sql/driver/67546.md --> |
| |
| Drivers may implement the new [`RowsColumnScanner`](/pkg/database/sql/driver#RowsColumnScanner) interface |
| to scan directly into user-provided destinations. |
| |
| #### [`go/constant`](/pkg/go/constant/) |
| |
| <!-- 6-stdlib/99-minor/go/constant/79042.md --> |
| |
| The new [`StringLen`](/pkg/go/constant#StringLen) function returns |
| the length of a string [`Value`](/pkg/go/constant#Value) without |
| fully constructing the `Value`. |
| |
| #### [`go/scanner`](/pkg/go/scanner/) |
| |
| <!-- 6-stdlib/99-minor/go/scanner/74958.md --> |
| |
| The scanner now allows retrieving the end position of a token via the new [`Scanner.End`](/pkg/go/scanner#Scanner.End) method. |
| |
| #### [`go/token`](/pkg/go/token/) |
| |
| <!-- 6-stdlib/99-minor/go/token/76285.md --> |
| |
| [`File`](/pkg/go/token#File) now has a `String` method. |
| |
| #### [`go/types`](/pkg/go/types/) |
| |
| <!-- 6-stdlib/99-minor/go/types/69420.md --> |
| |
| The [`Hasher`](/pkg/go/types#Hasher) type is an implementation of |
| [`maphash.Hasher`](/pkg/maphash#Hasher) for [`Type`](/pkg/go/types#Type)s |
| that respects the [`Identical`](/pkg/go/types#Identical) equivalence relation, allowing `Types` |
| to be used in hash tables and similar data structures. |
| [`HasherIgnoreTags`](/pkg/go/types#HasherIgnoreTags) is the analogous hasher for [`IdenticalIgnoreTags`](/pkg/go/types#IdenticalIgnoreTags). |
| |
| <!-- 6-stdlib/99-minor/go/types/76472.md --> |
| <!-- CL 736441 --> |
| |
| The `gotypesalias` `GODEBUG` setting (added in [Go 1.22](/doc/godebug#go-122)) |
| has been removed permanently and the package [`go/types`](/pkg/go/types) |
| now always produces an [`Alias`](/pkg/go/types#Alias) type node for |
| [alias declarations](/ref/spec#Alias_declarations) irrespective of `GODEBUG` settings. |
| |
| <!-- 6-stdlib/99-minor/go/types/79287.md --> |
| <!-- nothing to see here but some String methods --> |
| |
| #### [`hash/maphash`](/pkg/hash/maphash/) |
| |
| <!-- 6-stdlib/99-minor/hash/maphash/70471.md --> |
| |
| The [`Hasher`](/pkg/hash/maphash#Hasher) interface type defines the contract between values of a |
| particular type and future hash-based data structures such as hash |
| tables and Bloom filters; see [#70471](/issue/70471). |
| |
| The [`ComparableHasher`](/pkg/hash/maphash#ComparableHasher) type provides a |
| convenient implementation of [`Hasher`](/pkg/hash/maphash#Hasher) for |
| comparable types where the `Equal` method is defined as `==`. |
| |
| #### [`math/big`](/pkg/math/big/) |
| |
| <!-- 6-stdlib/99-minor/math/big/76821.md --> |
| <!-- go.dev/issue/76821 --> |
| |
| [`Int`](/pkg/math/big#Int) now has a [`Divide`](/pkg/math/big#Int.Divide) method |
| to compute quotient and remainder of two [`Int`](/pkg/math/big#Int) values. |
| It supports rounding modes [`Trunc`](/pkg/math/big#Trunc), [`Floor`](/pkg/math/big#Floor), |
| [`Round`](/pkg/math/big#Round), and [`Ceil`](/pkg/math/big#Ceil). |
| |
| #### [`math/rand/v2`](/pkg/math/rand/v2/) {#rand} |
| |
| <!-- 6-stdlib/99-minor/math/rand/v2/77853.md --> |
| |
| [`Rand`](/pkg/math/rand/v2#Rand) now supports a generic method |
| [`N`](/pkg/math/rand/v2#Rand.N), |
| matching the behavior of the top-level [`N`](/pkg/math/rand/v2#N) function. |
| |
| #### [`net`](/pkg/net/) |
| |
| <!-- 6-stdlib/99-minor/net/78137.md --> |
| |
| [`UnixConn`](/pkg/net#UnixConn) read methods now return [`io.EOF`](/pkg/io#EOF) directly instead of wrapping it in [`net.OpError`](/pkg/net#OpError) when the underlying read returns EOF. |
| |
| #### [`net/http`](/pkg/net/http/) |
| |
| <!-- 6-stdlib/99-minor/net/http/21753.md --> |
| |
| [`Transport`](/pkg/net/http#Transport) and [`Server`](/pkg/net/http#Server) support TLS ALPN protocol negotiation on |
| user-provided [`net.Conn`](/pkg/net#Conn) connections which implement a |
| `ConnectionState() tls.ConnectionState` method. |
| |
| <!-- 6-stdlib/99-minor/net/http/75500.md --> |
| |
| HTTP/2 server now accepts client priority signals, as defined in RFC 9218, |
| allowing it to prioritize serving HTTP/2 streams with higher priority. If the |
| old behavior is preferred, where streams are served in a round-robin manner |
| regardless of priority, [`Server.DisableClientPriority`](/pkg/net/http#Server.DisableClientPriority) can be set to `true`. |
| |
| <!-- 6-stdlib/99-minor/net/http/77370.md --> |
| |
| HTTP/1 [`Response.Body`](/pkg/net/http#Response.Body) now automatically drains any unread content upon being |
| closed, up to a conservative limit, to allow better connection reuse. For most |
| programs, this change should be a no-op, or result in a performance improvement. |
| In rare cases, programs that do not benefit from connection reuse might |
| experience performance degradation if they had been improperly allowing an |
| excessive amount of idle connections to linger; usually by setting |
| [`Transport.MaxIdleConns`](/pkg/net/http#Transport.MaxIdleConns) to `0` or using different [`Client`](/pkg/net/http#Client)s for different |
| requests, thereby bypassing [`Transport.MaxIdleConns`](/pkg/net/http#Transport.MaxIdleConns) limit. In these cases, |
| setting [`Transport.DisableKeepAlives`](/pkg/net/http#Transport.DisableKeepAlives) to `true` will disable connection reuse. |
| However, such performance degradation usually indicates improper configuration |
| or usage of [`Transport`](/pkg/net/http#Transport) or [`Client`](/pkg/net/http#Client) in the first place, and a deeper look would |
| likely be beneficial. |
| |
| <!-- go.dev/issue/79936 --> |
| |
| The new [`Server.MaxHeaderValueCount`](/pkg/net/http#Server.MaxHeaderValueCount) |
| field allows HTTP servers to control the number of header values that they are |
| willing to accept. If unset, |
| [`DefaultMaxHeaderValueCount`](/pkg/net/http#DefaultMaxHeaderValueCount) is |
| used. |
| |
| #### [`net/http/httptest`](/pkg/net/http/httptest/) |
| |
| <!-- 6-stdlib/99-minor/net/http/httptest/76608.md --> |
| |
| The new [`NewTestServer`](/pkg/net/http/httptest#NewTestServer) function |
| creates a [`Server`](/pkg/net/http/httptest#Server) configured to use an in-memory |
| fake network suitable for use with the [`testing/synctest`](/pkg/testing/synctest) package. |
| |
| #### [`net/url`](/pkg/net/url/) |
| |
| <!-- 6-stdlib/99-minor/net/url/73450.md --> |
| |
| The new [`URL.Clone`](/pkg/net/url#URL.Clone) method creates a deep copy of a URL. |
| The new [`Values.Clone`](/pkg/net/url#Values.Clone) method creates a deep copy of Values. |
| |
| #### [`runtime/secret`](/pkg/runtime/secret/) |
| |
| Goroutines that are created while in [secret mode](/pkg/runtime/secret#Do) |
| will now themselves execute in secret mode. |
| |
| #### [`strings`](/pkg/strings/) |
| |
| <!-- 6-stdlib/99-minor/strings/71151.md --> |
| |
| The new [`CutLast`](/pkg/strings#CutLast) function slices a string |
| around the last occurrence of a separator. |
| It can replace and simplify some common uses of [`LastIndex`](/pkg/strings#LastIndex). |
| |
| #### [`syscall`](/pkg/syscall/) |
| |
| <!-- CL 750680 --> |
| |
| On Plan 9, the [`Errno`](/pkg/syscall#Errno) type is now defined and |
| implements the `error` interface, as on other platforms. Plan 9 system |
| calls return `ErrorString` values, so `Errno` is never returned by this |
| package on Plan 9. It is defined so that portable code referring to |
| `syscall.Errno` builds on Plan 9 without build constraints. |
| |
| #### [`testing/synctest`](/pkg/testing/synctest/) |
| |
| <!-- 6-stdlib/99-minor/testing/synctest/77169.md --> |
| |
| The new [`Sleep`](/pkg/testing/synctest#Sleep) helper function combines [`time.Sleep`](/pkg/time#Sleep) and [`synctest.Wait`](/pkg/testing/synctest#Wait). |
| |
| #### [`unicode`](/pkg/unicode/) |
| |
| <!-- 6-stdlib/99-minor/unicode/77266.md --> |
| |
| The unicode package and associated support throughout the system have been upgraded from Unicode 15 to Unicode 17. |
| See the [Unicode 16.0.0](https://www.unicode.org/versions/Unicode16.0.0/) and |
| [Unicode 17.0.0](https://www.unicode.org/versions/Unicode17.0.0/) |
| release notes for information about the changes. |
| |
| ## Ports {#ports} |
| |
| ### Darwin {#darwin} |
| |
| <!-- go.dev/issue/75836 --> |
| |
| As [announced](go1.26#darwin) in the Go 1.26 release notes, |
| Go 1.27 requires macOS 13 Ventura or later; |
| support for previous versions has been discontinued. |
| |
| ### PowerPC {#ppc64} |
| |
| <!-- go.dev/issue/76244 --> |
| |
| On the big-endian 64-bit PowerPC port on Linux (`GOOS=linux` `GOARCH=ppc64`), |
| the Go toolchain now generates binaries that use the ELFv2 |
| system ABI. |
| ELFv2 support requires Linux kernel 3.13 or later. |
| RHEL7 backported this support to its 3.10 kernel. |
| |
| Cgo, position-independent executables (PIE), and external linking |
| are now supported. |
| Using these features requires an ELFv2 compatible runtime |
| (libc and all linked and loaded libraries). |
| |
| For programs that do not use cgo, the Go toolchain still |
| generates static binaries with internal linking by default. |
| For programs that have cgo options, if a static, pure-Go binary |
| is needed, one can set the environment variable `CGO_ENABLED=0` |
| when running `go build`. |