| --- |
| title: Go 1.23 Release Notes |
| template: false |
| --- |
| |
| <!-- |
| NOTE: In this document and others in this directory, the convention is to |
| set fixed-width phrases with non-fixed-width spaces, as in |
| `hello` `world`. |
| --> |
| |
| <style> |
| main ul li { margin: 0.5em 0; } |
| </style> |
| |
| ## Introduction to Go 1.23 {#introduction} |
| |
| The latest Go release, version 1.23, arrives six months after [Go 1.22](/doc/go1.22). |
| 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/61405, CL 557835, CL 584596 --> |
| The "range" clause in a "for-range" loop now accepts iterator functions of the following types |
| |
| func(func() bool) |
| func(func(K) bool) |
| func(func(K, V) bool) |
| |
| as range expressions. |
| Calls of the iterator argument function produce the iteration values for the "for-range" loop. |
| For details see the [`iter`](/pkg/iter) package documentation, the |
| [language spec](/ref/spec#For_range), and the [Range over Function |
| Types blog post](/blog/range-functions). |
| For motivation see the 2022 ["range-over-func" discussion](/issue/56413). |
| |
| <!-- go.dev/issue/46477, CL 566856, CL 586955, CL 586956 --> |
| Go 1.23 includes preview support for [generic type aliases](/issue/46477). |
| Building the toolchain with `GOEXPERIMENT=aliastypeparams` enables this feature within a package. |
| (Using generic alias types across package boundaries is not yet supported.) |
| |
| ## Tools {#tools} |
| |
| ### Telemetry |
| |
| <!-- go.dev/issue/58894, go.dev/issue/67111 --> |
| Starting in Go 1.23, the Go toolchain can collect usage and breakage |
| statistics that help the Go team understand how the Go toolchain is |
| used and how well it is working. We refer to these statistics as |
| [Go telemetry](/doc/telemetry). |
| |
| Go telemetry is an _opt-in system_, controlled by the |
| [`go` `telemetry` command](/cmd/go/#hdr-Manage_telemetry_data_and_settings). |
| By default, the toolchain programs |
| collect statistics in counter files that can be inspected locally |
| but are otherwise unused (`go` `telemetry` `local`). |
| |
| To help us keep Go working well and understand Go usage, |
| please consider opting in to Go telemetry by running |
| `go` `telemetry` `on`. |
| In that mode, |
| anonymous counter reports are uploaded to |
| [telemetry.go.dev](https://telemetry.go.dev) weekly, |
| where they are aggregated into graphs and also made |
| available for download by any Go contributors or users |
| wanting to analyze the data. |
| See “[Go Telemetry](/doc/telemetry)” for more details |
| about the Go Telemetry system. |
| |
| ### Go command {#go-command} |
| |
| Setting the `GOROOT_FINAL` environment variable no longer has an effect |
| ([#62047](/issue/62047)). |
| Distributions that install the `go` command to a location other than |
| `$GOROOT/bin/go` should install a symlink instead of relocating |
| or copying the `go` binary. |
| |
| <!-- go.dev/issue/34208, CL 563137, CL 586095 --> |
| The new `go` `env` `-changed` flag causes the command to print only |
| those settings whose effective value differs from the default value |
| that would be obtained in an empty environment with no prior uses of the `-w` flag. |
| |
| <!-- go.dev/issue/27005, CL 585401 --> |
| The new `go` `mod` `tidy` `-diff` flag causes the command not to modify |
| the files but instead print the necessary changes as a unified diff. |
| It exits with a non-zero code if updates are needed. |
| |
| <!-- go.dev/issue/52792, CL 562775 --> |
| The `go` `list` `-m` `-json` command now includes new `Sum` and `GoModSum` fields. |
| This is similar to the existing behavior of the `go` `mod` `download` `-json` command. |
| |
| <!-- go.dev/issue/65573 ("cmd/go: separate default GODEBUGs from go language version") --> |
| The new `godebug` directive in `go.mod` and `go.work` declares a |
| [GODEBUG setting](/doc/godebug) to apply for the work module or workspace in use. |
| |
| ### Vet {#vet} |
| |
| <!-- go.dev/issue/46136 --> |
| The `go vet` subcommand now includes the |
| [stdversion](https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/stdversion) |
| analyzer, which flags references to symbols that are too new for the version |
| of Go in effect in the referring file. (The effective version is determined |
| by the `go` directive in the file's enclosing `go.mod` file, and |
| by any [`//go:build` constraints](/cmd/go#hdr-Build_constraints) |
| in the file.) |
| |
| For example, it will report a diagnostic for a reference to the |
| `reflect.TypeFor` function (introduced in go1.22) from a file in a |
| module whose go.mod file specifies `go 1.21`. |
| |
| ### Cgo {#cgo} |
| |
| <!-- go.dev/issue/66456 --> |
| [`cmd/cgo`](/pkg/cmd/cgo) supports the new `-ldflags` flag for passing flags to the C linker. |
| The `go` command uses it automatically, avoiding "argument list too long" |
| errors with a very large `CGO_LDFLAGS`. |
| |
| ### Trace {#trace} |
| |
| <!-- go.dev/issue/65316 --> |
| The `trace` tool now better tolerates partially broken traces by attempting to |
| recover what trace data it can. This functionality is particularly helpful when |
| viewing a trace that was collected during a program crash, since the trace data |
| leading up to the crash will now [be recoverable](/issue/65319) under most |
| circumstances. |
| |
| ## Runtime {#runtime} |
| |
| The traceback printed by the runtime after an unhandled panic or other |
| fatal error now indents the second and subsequent lines of the error |
| message (for example, the argument to panic) by a single tab, so that |
| it can be unambiguously distinguished from the stack trace of the |
| first goroutine. See [#64590](/issue/64590) for discussion. |
| |
| ## Compiler {#compiler} |
| |
| The build time overhead to building with [Profile Guided Optimization](/doc/pgo) has been reduced significantly. |
| Previously, large builds could see 100%+ build time increase from enabling PGO. |
| In Go 1.23, overhead should be in the single digit percentages. |
| |
| <!-- https://go.dev/issue/62737 , https://golang.org/cl/576681, https://golang.org/cl/577615 --> |
| The compiler in Go 1.23 can now overlap the stack frame slots of local variables |
| accessed in disjoint regions of a function, which reduces stack usage |
| for Go applications. |
| |
| <!-- https://go.dev/cl/577935 --> |
| For 386 and amd64, the compiler will use information from PGO to align certain |
| hot blocks in loops. This improves performance an additional 1-1.5% at |
| a cost of an additional 0.1% text and binary size. This is currently only implemented |
| on 386 and amd64 because it has not shown an improvement on other platforms. |
| Hot block alignment can be disabled with `-gcflags=[<packages>=]-d=alignhot=0`. |
| |
| ## Linker {#linker} |
| |
| <!-- go.dev/issue/67401, CL 585556, CL 587220, and many more --> |
| The linker now disallows using a `//go:linkname` directive to refer to |
| internal symbols in the standard library (including the runtime) that |
| are not marked with `//go:linkname` on their definitions. |
| Similarly, the linker disallows references to such symbols from assembly |
| code. |
| For backward compatibility, existing usages of `//go:linkname` found in |
| a large open-source code corpus remain supported. |
| Any new references to standard library internal symbols will be disallowed. |
| |
| A linker command line flag `-checklinkname=0` can be used to disable |
| this check, for debugging and experimenting purposes. |
| |
| <!-- CL 473495 --> |
| When building a dynamically linked ELF binary (including PIE binary), the |
| new `-bindnow` flag enables immediate function binding. |
| |
| ## Standard library {#library} |
| |
| ### Timer changes |
| |
| Go 1.23 makes two significant changes to the implementation of |
| [`time.Timer`](/pkg/time#Timer) and [`time.Ticker`](/pkg/time#Ticker). |
| |
| <!-- go.dev/issue/61542 --> |
| First, `Timer`s and `Ticker`s that are no longer referred to by the program |
| become eligible for garbage collection immediately, even if their |
| `Stop` methods have not been called. |
| Earlier versions of Go did not collect unstopped `Timer`s until after |
| they had fired and never collected unstopped `Ticker`s. |
| |
| <!-- go.dev/issue/37196 --> |
| Second, the timer channel associated with a `Timer` or `Ticker` is |
| now unbuffered, with capacity 0. |
| The main effect of this change is that Go now guarantees |
| that for any call to a `Reset` or `Stop` method, no stale values |
| prepared before that call will be sent or received after the call. |
| Earlier versions of Go used channels with a one-element buffer, |
| making it difficult to use `Reset` and `Stop` correctly. |
| A visible effect of this change is that `len` and `cap` of timer channels |
| now returns 0 instead of 1, which may affect programs that |
| poll the length to decide whether a receive on the timer channel |
| will succeed. |
| Such code should use a non-blocking receive instead. |
| |
| These new behaviors are only enabled when the main Go program |
| is in a module with a `go.mod` `go` line using Go 1.23.0 or later. |
| When Go 1.23 builds older programs, the old behaviors remain in effect. |
| The new [GODEBUG setting](/doc/godebug) [`asynctimerchan=1`](/pkg/time/#NewTimer) |
| can be used to revert back to asynchronous channel behaviors |
| even when a program names Go 1.23.0 or later in its `go.mod` file. |
| |
| ### New unique package |
| |
| The new [`unique`](/pkg/unique) package provides facilities for |
| canonicalizing values (like "interning" or "hash-consing"). |
| |
| Any value of comparable type may be canonicalized with the new |
| `Make[T]` function, which produces a reference to a canonical copy of |
| the value in the form of a `Handle[T]`. |
| Two `Handle[T]` are equal if and only if the values used to produce the |
| handles are equal, allowing programs to deduplicate values and reduce |
| their memory footprint. |
| Comparing two `Handle[T]` values is efficient, reducing down to a simple |
| pointer comparison. |
| |
| ### Iterators |
| |
| The new [`iter`](/pkg/iter) package provides the basic definitions for working with |
| user-defined iterators. |
| |
| The [`slices`](/pkg/slices) package adds several functions that work with iterators: |
| - [All](/pkg/slices#All) returns an iterator over slice indexes and values. |
| - [Values](/pkg/slices#Values) returns an iterator over slice elements. |
| - [Backward](/pkg/slices#Backward) returns an iterator that loops over |
| a slice backward. |
| - [Collect](/pkg/slices#Collect) collects values from an iterator into |
| a new slice. |
| - [AppendSeq](/pkg/slices#AppendSeq) appends values from an iterator to |
| an existing slice. |
| - [Sorted](/pkg/slices#Sorted) collects values from an iterator into a |
| new slice, and then sorts the slice. |
| - [SortedFunc](/pkg/slices#SortedFunc) is like `Sorted` but with a |
| comparison function. |
| - [SortedStableFunc](/pkg/slices#SortedStableFunc) is like `SortFunc` |
| but uses a stable sort algorithm. |
| - [Chunk](/pkg/slices#Chunk) returns an iterator over consecutive |
| sub-slices of up to n elements of a slice. |
| |
| The [`maps`](/pkg/maps) package adds several functions that work with iterators: |
| - [All](/pkg/maps#All) returns an iterator over key-value pairs from a map. |
| - [Keys](/pkg/maps#Keys) returns an iterator over keys in a map. |
| - [Values](/pkg/maps#Values) returns an iterator over values in a map. |
| - [Insert](/pkg/maps#Insert) adds the key-value pairs from an iterator to an existing map. |
| - [Collect](/pkg/maps#Collect) collects key-value pairs from an iterator into a new map and returns it. |
| |
| ### New structs package |
| |
| The new [`structs`](/pkg/structs) package provides |
| types for struct fields that modify properties of |
| the containing struct type such as memory layout. |
| |
| In this release, the only such type is |
| [`HostLayout`](/pkg/structs#HostLayout) |
| which indicates that a structure with a field of that |
| type has a layout that conforms to host platform |
| expectations. HostLayout should be used in types that |
| are passed to, returned from, or accessed |
| via a pointer passed to/from host APIs. |
| Without this marker, struct layout order is not |
| guaranteed by the language spec, though as of Go 1.23 |
| the host and language layouts happen to match. |
| |
| ### Minor changes to the library {#minor_library_changes} |
| |
| #### [`archive/tar`](/pkg/archive/tar/) |
| |
| If the argument to [`FileInfoHeader`](/pkg/archive/tar#FileInfoHeader) implements the new [`FileInfoNames`](/pkg/archive/tar#FileInfoNames) |
| interface, then the interface methods will be used to set the Uname/Gname |
| of the file header. This allows applications to override the system-dependent |
| Uname/Gname lookup. |
| |
| #### [`crypto/tls`](/pkg/crypto/tls/) |
| |
| The TLS client now supports the Encrypted Client Hello [draft specification](https://www.ietf.org/archive/id/draft-ietf-tls-esni-18.html). |
| This feature can be enabled by setting the [`Config.EncryptedClientHelloConfigList`](/pkg/crypto/tls#Config.EncryptedClientHelloConfigList) |
| field to an encoded ECHConfigList for the host that is being connected to. |
| |
| The [`QUICConn`](/pkg/crypto/tls#QUICConn) type used by QUIC implementations includes new events |
| reporting on the state of session resumption, and provides a way for |
| the QUIC layer to add data to session tickets and session cache entries. |
| |
| 3DES cipher suites were removed from the default list used when |
| [`Config.CipherSuites`](/pkg/crypto/tls#Config.CipherSuites) is nil. The default can be reverted by adding `tls3des=1` to |
| the GODEBUG environment variable. |
| |
| The experimental post-quantum key exchange mechanism X25519Kyber768Draft00 |
| is now enabled by default when [`Config.CurvePreferences`](/pkg/crypto/tls#Config.CurvePreferences) is nil. |
| The default can be reverted by adding `tlskyber=0` to the GODEBUG environment variable. |
| |
| Go 1.23 changed the behavior of [`X509KeyPair`](/pkg/crypto/tls#X509KeyPair) and [`LoadX509KeyPair`](/pkg/crypto/tls#LoadX509KeyPair) |
| to populate the [`Certificate.Leaf`](/pkg/crypto/tls#Certificate.Leaf) field of the returned [`Certificate`](/pkg/crypto/tls#Certificate). |
| The new `x509keypairleaf` [GODEBUG setting](/doc/godebug) is added for this behavior. |
| |
| #### [`crypto/x509`](/pkg/crypto/x509/) |
| |
| [`CreateCertificateRequest`](/pkg/crypto/x509#CreateCertificateRequest) now correctly supports RSA-PSS signature algorithms. |
| |
| [`CreateCertificateRequest`](/pkg/crypto/x509#CreateCertificateRequest) and [`CreateRevocationList`](/pkg/crypto/x509#CreateRevocationList) now verify the generated signature using the signer’s public key. If the signature is invalid, an error is returned. This has been the behavior of [`CreateCertificate`](/pkg/crypto/x509#CreateCertificate) since Go 1.16. |
| |
| The [`x509sha1` GODEBUG setting](/pkg/crypto/x509#InsecureAlgorithmError) will |
| be removed in the next Go major release (Go 1.24). This will mean that `crypto/x509` |
| will no longer support verifying signatures on certificates that use SHA-1 based |
| signature algorithms. |
| |
| The new [`ParseOID`](/pkg/crypto/x509#ParseOID) function parses a dot-encoded ASN.1 Object Identifier string. |
| The [`OID`](/pkg/crypto/x509#OID) type now implements the [`encoding.BinaryMarshaler`](/pkg/encoding#BinaryMarshaler), |
| [`encoding.BinaryUnmarshaler`](/pkg/encoding#BinaryUnmarshaler), [`encoding.TextMarshaler`](/pkg/encoding#TextMarshaler), [`encoding.TextUnmarshaler`](/pkg/encoding#TextUnmarshaler) interfaces. |
| |
| #### [`database/sql`](/pkg/database/sql/) |
| |
| Errors returned by [`driver.Valuer`](/pkg/driver#Valuer) implementations are now wrapped for |
| improved error handling during operations like [`DB.Query`](/pkg/database/sql#DB.Query), [`DB.Exec`](/pkg/database/sql#DB.Exec), |
| and [`DB.QueryRow`](/pkg/database/sql#DB.QueryRow). |
| |
| #### [`debug/elf`](/pkg/debug/elf/) |
| |
| The `debug/elf` package now defines [`PT_OPENBSD_NOBTCFI`](/pkg/debug/elf#PT_OPENBSD_NOBTCFI). This [`ProgType`](/pkg/debug/elf#ProgType) is |
| used to disable Branch Tracking Control Flow Integrity (BTCFI) enforcement |
| on OpenBSD binaries. |
| |
| Now defines the symbol type constants [`STT_RELC`](/pkg/debug/elf#STT_RELC), [`STT_SRELC`](/pkg/debug/elf#STT_SRELC), and |
| [`STT_GNU_IFUNC`](/pkg/debug/elf#STT_GNU_IFUNC). |
| |
| #### [`encoding/binary`](/pkg/encoding/binary/) |
| |
| The new [`Encode`](/pkg/encoding/binary#Encode) and [`Decode`](/pkg/encoding/binary#Decode) functions are byte slice equivalents |
| to [`Read`](/pkg/encoding/binary#Read) and [`Write`](/pkg/encoding/binary#Write). |
| [`Append`](/pkg/encoding/binary#Append) allows marshaling multiple data into the same byte slice. |
| |
| #### [`go/ast`](/pkg/go/ast/) |
| |
| The new [`Preorder`](/pkg/go/ast#Preorder) function returns a convenient iterator over all the |
| nodes of a syntax tree. |
| |
| #### [`go/types`](/pkg/go/types/) |
| |
| <!-- see ../../../../2-language.md --> |
| |
| The [`Func`](/pkg/go/types#Func) type, which represents a function or method symbol, now |
| has a [`Func.Signature`](/pkg/go/types#Func.Signature) method that returns the function's type, which |
| is always a `Signature`. |
| |
| The [`Alias`](/pkg/go/types#Alias) type now has an [`Rhs`](/pkg/go/types#Rhs) method that returns the type on the |
| right-hand side of its declaration: given `type A = B`, the `Rhs` of A |
| is B. ([#66559](/issue/66559)) |
| |
| The methods [`Alias.Origin`](/pkg/go/types#Alias.Origin), [`Alias.SetTypeParams`](/pkg/go/types#Alias.SetTypeParams), [`Alias.TypeParams`](/pkg/go/types#Alias.TypeParams), |
| and [`Alias.TypeArgs`](/pkg/go/types#Alias.TypeArgs) have been added. They are needed for generic alias types. |
| |
| <!-- CL 577715, CL 579076 --> |
| By default, go/types now produces [`Alias`](/pkg/go/types#Alias) type nodes for type aliases. |
| This behavior can be controlled by the `GODEBUG` `gotypesalias` flag. |
| Its default has changed from 0 in Go 1.22 to 1 in Go 1.23. |
| |
| #### [`math/rand/v2`](/pkg/math/rand/v2/) |
| |
| The [`Uint`](/pkg/math/rand/v2#Uint) function and [`Rand.Uint`](/pkg/math/rand/v2#Rand.Uint) method have been added. |
| They were inadvertently left out of Go 1.22. |
| |
| The new [`ChaCha8.Read`](/pkg/math/rand/v2#ChaCha8.Read) method implements the [`io.Reader`](/pkg/io#Reader) interface. |
| |
| #### [`net`](/pkg/net/) |
| |
| The new type [`KeepAliveConfig`](/pkg/net#KeepAliveConfig) permits fine-tuning the keep-alive |
| options for TCP connections, via a new [`TCPConn.SetKeepAliveConfig`](/pkg/net#TCPConn.SetKeepAliveConfig) |
| method and new KeepAliveConfig fields for [`Dialer`](/pkg/net#Dialer) and [`ListenConfig`](/pkg/net#ListenConfig). |
| |
| The [`DNSError`](/pkg/net#DNSError) type now wraps errors caused by timeouts or cancellation. |
| For example, `errors.Is(someDNSErr, context.DeadlineExceedeed)` |
| will now report whether a DNS error was caused by a timeout. |
| |
| The new `GODEBUG` setting `netedns0=0` disables sending EDNS0 |
| additional headers on DNS requests, as they reportedly break the DNS |
| server on some modems. |
| |
| #### [`net/http`](/pkg/net/http/) |
| |
| [`Cookie`](/pkg/net/http#Cookie) now preserves double quotes surrounding a cookie value. |
| The new [`Cookie.Quoted`](/pkg/net/http#Cookie.Quoted) field indicates whether the [`Cookie.Value`](/pkg/net/http#Cookie.Value) |
| was originally quoted. |
| |
| The new [`Request.CookiesNamed`](/pkg/net/http#Request.CookiesNamed) method retrieves all cookies that match the given name. |
| |
| The new [`Cookie.Partitioned`](/pkg/net/http#Cookie.Partitioned) field identifies cookies with the Partitioned attribute. |
| |
| The patterns used by [`ServeMux`](/pkg/net/http#ServeMux) now allow one or more spaces or tabs after the method name. |
| Previously, only a single space was permitted. |
| |
| The new [`ParseCookie`](/pkg/net/http#ParseCookie) function parses a Cookie header value and |
| returns all the cookies which were set in it. Since the same cookie |
| name can appear multiple times the returned Values can contain |
| more than one value for a given key. |
| |
| The new [`ParseSetCookie`](/pkg/net/http#ParseSetCookie) function parses a Set-Cookie header value and |
| returns a cookie. It returns an error on syntax error. |
| |
| [`ServeContent`](/pkg/net/http#ServeContent), [`ServeFile`](/pkg/net/http#ServeFile), and [`ServeFileFS`](/pkg/net/http#ServeFileFS) now remove |
| the `Cache-Control`, `Content-Encoding`, `Etag`, and `Last-Modified` |
| headers when serving an error. These headers usually apply to the |
| non-error content, but not to the text of errors. |
| |
| Middleware which wraps a [`ResponseWriter`](/pkg/net/http#ResponseWriter) and applies on-the-fly |
| encoding, such as `Content-Encoding: gzip`, will not function after |
| this change. The previous behavior of [`ServeContent`](/pkg/net/http#ServeContent), [`ServeFile`](/pkg/net/http#ServeFile), |
| and [`ServeFileFS`](/pkg/net/http#ServeFileFS) may be restored by setting |
| `GODEBUG=httpservecontentkeepheaders=1`. |
| |
| Note that middleware which changes the size of the served content |
| (such as by compressing it) already does not function properly when |
| [`ServeContent`](/pkg/net/http#ServeContent) handles a Range request. On-the-fly compression |
| should use the `Transfer-Encoding` header instead of `Content-Encoding`. |
| |
| For inbound requests, the new [`Request.Pattern`](/pkg/net/http#Request.Pattern) field contains the [`ServeMux`](/pkg/net/http#ServeMux) |
| pattern (if any) that matched the request. This field is not set when |
| `GODEBUG=httpmuxgo121=1` is set. |
| |
| #### [`net/http/httptest`](/pkg/net/http/httptest/) |
| |
| The new [`NewRequestWithContext`](/pkg/net/http/httptest#NewRequestWithContext) method creates an incoming request with |
| a [`context.Context`](/pkg/context#Context). |
| |
| #### [`net/netip`](/pkg/net/netip/) |
| |
| In Go 1.22 and earlier, using |
| [`reflect.DeepEqual`](/pkg/reflect#DeepEqual) to compare an |
| [`Addr`](/pkg/net/netip#Addr) holding an IPv4 address to one holding |
| the IPv4-mapped IPv6 form of that address incorrectly returned true, |
| even though the `Addr` values were different when comparing with `==` or |
| [`Addr.Compare`](/pkg/net/netip#Addr.Compare). |
| This bug is now fixed and all three approaches now report the same |
| result. |
| |
| #### [`os`](/pkg/os/) |
| |
| The [`Stat`](/pkg/os#Stat) function now sets the [`ModeSocket`](/pkg/os#ModeSocket) bit for |
| files that are Unix sockets on Windows. These files are identified |
| by having a reparse tag set to `IO_REPARSE_TAG_AF_UNIX`. |
| |
| On Windows, the mode bits reported by [`Lstat`](/pkg/os#Lstat) and [`Stat`](/pkg/os#Stat) for |
| reparse points changed. Mount points no longer have [`ModeSymlink`](/pkg/os#ModeSymlink) set, |
| and reparse points that are not symlinks, Unix sockets, or dedup files |
| now always have [`ModeIrregular`](/pkg/os#ModeIrregular) set. |
| This behavior is controlled by the `winsymlink` setting. |
| For Go 1.23, it defaults to `winsymlink=1`. |
| Previous versions default to `winsymlink=0`. |
| |
| The [`CopyFS`](/pkg/os#CopyFS) function copies an [`io/fs.FS`](/pkg/io/fs#FS) into the local filesystem. |
| |
| On Windows, [`Readlink`](/pkg/os#Readlink) no longer tries to normalize volumes |
| to drive letters, which was not always even possible. |
| This behavior is controlled by the `winreadlinkvolume` setting. |
| For Go 1.23, it defaults to `winreadlinkvolume=1`. |
| Previous versions default to `winreadlinkvolume=0`. |
| |
| <!-- go.dev/issue/62654, CL 570036, CL 570681 --> |
| On Linux with pidfd support (generally Linux v5.4+), |
| [`Process`](/pkg/os#Process)-related functions and methods use pidfd (rather |
| than PID) internally, eliminating potential mistargeting when a PID is reused |
| by the OS. Pidfd support is fully transparent to a user, except for additional |
| process file descriptors that a process may have. |
| |
| #### [`path/filepath`](/pkg/path/filepath/) |
| |
| The new [`Localize`](/pkg/path/filepath#Localize) function safely converts a slash-separated |
| path into an operating system path. |
| |
| On Windows, [`EvalSymlinks`](/pkg/path/filepath#EvalSymlinks) no longer evaluates mount points, |
| which was a source of many inconsistencies and bugs. |
| This behavior is controlled by the `winsymlink` setting. |
| For Go 1.23, it defaults to `winsymlink=1`. |
| Previous versions default to `winsymlink=0`. |
| |
| On Windows, [`EvalSymlinks`](/pkg/path/filepath#EvalSymlinks) no longer tries to normalize |
| volumes to drive letters, which was not always even possible. |
| This behavior is controlled by the `winreadlinkvolume` setting. |
| For Go 1.23, it defaults to `winreadlinkvolume=1`. |
| Previous versions default to `winreadlinkvolume=0`. |
| |
| #### [`reflect`](/pkg/reflect/) |
| |
| The new methods synonymous with the methods of the same name |
| in [`Value`](/pkg/reflect#Value) are added to [`Type`](/pkg/reflect#Type): |
| 1. [`Type.OverflowComplex`](/pkg/reflect#Type.OverflowComplex) |
| 2. [`Type.OverflowFloat`](/pkg/reflect#Type.OverflowFloat) |
| 3. [`Type.OverflowInt`](/pkg/reflect#Type.OverflowInt) |
| 4. [`Type.OverflowUint`](/pkg/reflect#Type.OverflowUint) |
| |
| The new [`SliceAt`](/pkg/reflect#SliceAt) function is analogous to [`NewAt`](/pkg/reflect#NewAt), but for slices. |
| |
| The [`Value.Pointer`](/pkg/reflect#Value.Pointer) and [`Value.UnsafePointer`](/pkg/reflect#Value.UnsafePointer) methods now support values of kind [`String`](/pkg/reflect#String). |
| |
| The new methods [`Value.Seq`](/pkg/reflect#Value.Seq) and [`Value.Seq2`](/pkg/reflect#Value.Seq2) return sequences that iterate over the value |
| as though it were used in a for/range loop. |
| The new methods [`Type.CanSeq`](/pkg/reflect#Type.CanSeq) and [`Type.CanSeq2`](/pkg/reflect#Type.CanSeq2) report whether calling |
| [`Value.Seq`](/pkg/reflect#Value.Seq) and [`Value.Seq2`](/pkg/reflect#Value.Seq2), respectively, will succeed without panicking. |
| |
| #### [`runtime/debug`](/pkg/runtime/debug/) |
| |
| The [`SetCrashOutput`](/pkg/runtime/debug#SetCrashOutput) function allows the user to specify an alternate |
| file to which the runtime should write its fatal crash report. |
| It may be used to construct an automated reporting mechanism for all |
| unexpected crashes, not just those in goroutines that explicitly use |
| `recover`. |
| |
| <!-- pacify TestCheckAPIFragments --> |
| |
| #### [`runtime/pprof`](/pkg/runtime/pprof/) |
| |
| The maximum stack depth for `alloc`, `mutex`, `block`, `threadcreate` and `goroutine` |
| profiles has been raised from 32 to 128 frames. |
| |
| #### [`runtime/trace`](/pkg/runtime/trace/) |
| |
| <!-- go.dev/issue/65319 --> |
| The runtime now explicitly flushes trace data when a program crashes due to an |
| uncaught panic. This means that more complete trace data will be available in a |
| trace if the program crashes while tracing is active. |
| |
| #### [`slices`](/pkg/slices/) |
| |
| <!-- see ../../3-iter.md --> |
| |
| <!-- see ../../3-iter.md --> |
| |
| The [`Repeat`](/pkg/slices#Repeat) function returns a new slice that repeats the |
| provided slice the given number of times. |
| |
| #### [`sync`](/pkg/sync/) |
| |
| The [`Map.Clear`](/pkg/sync#Map.Clear) method deletes all the entries, resulting in |
| an empty [`Map`](/pkg/sync#Map). It is analogous to `clear`. |
| |
| #### [`sync/atomic`](/pkg/sync/atomic/) |
| |
| <!-- Issue #61395 --> |
| The new [`And`](/pkg/sync/atomic#And) and [`Or`](/pkg/sync/atomic#Or) operators apply a bitwise `AND` or `OR` to |
| the given input, returning the old value. |
| |
| #### [`syscall`](/pkg/syscall/) |
| |
| The syscall package now defines [`WSAENOPROTOOPT`](/pkg/syscall#WSAENOPROTOOPT) on Windows. |
| |
| The [`GetsockoptInt`](/pkg/syscall#GetsockoptInt) function is now supported on Windows. |
| |
| #### [`testing/fstest`](/pkg/testing/fstest/) |
| |
| [`TestFS`](/pkg/testing/fstest#TestFS) now returns a structured error that can be unwrapped |
| (via method `Unwrap() []error`). This allows inspecting errors |
| using [`errors.Is`](/pkg/errors#Is) or [`errors.As`](/pkg/errors#As). |
| |
| #### [`text/template`](/pkg/text/template/) |
| |
| Templates now support the new "else with" action, which reduces template complexity in some use cases. |
| |
| #### [`time`](/pkg/time/) |
| |
| [`Parse`](/pkg/time#Parse) and [`ParseInLocation`](/pkg/time#ParseInLocation) now return an error if the time zone |
| offset is out of range. |
| |
| On Windows, [`Timer`](/pkg/time#Timer), [`Ticker`](/pkg/time#Ticker), and functions that put the goroutine to sleep, |
| such as [`Sleep`](/pkg/time#Sleep), got their time resolution improved to 0.5ms instead of 15.6ms. |
| |
| #### [`unicode/utf16`](/pkg/unicode/utf16/) |
| |
| The [`RuneLen`](/pkg/unicode/utf16#RuneLen) function returns the number of 16-bit words in |
| the UTF-16 encoding of the rune. It returns -1 if the rune |
| is not a valid value to encode in UTF-16. |
| |
| ## Ports {#ports} |
| |
| ### Darwin {#darwin} |
| |
| <!-- go.dev/issue/64207 --> |
| As [announced](go1.22#darwin) in the Go 1.22 release notes, |
| Go 1.23 requires macOS 11 Big Sur or later; |
| support for previous versions has been discontinued. |
| |
| ### Linux {#linux} |
| |
| <!-- go.dev/issue/67001 --> |
| Go 1.23 is the last release that requires Linux kernel version 2.6.32 or later. Go 1.24 will require Linux kernel version 3.2 or later. |
| |
| ### OpenBSD {#openbsd} |
| |
| <!-- go.dev/issue/55999, CL 518629, CL 518630 --> |
| Go 1.23 adds experimental support for OpenBSD on 64-bit RISC-V (`GOOS=openbsd`, `GOARCH=riscv64`). |
| |
| ### ARM64 {#arm64} |
| |
| <!-- go.dev/issue/60905, CL 559555 --> |
| Go 1.23 introduces a new `GOARM64` environment variable, which specifies the minimum target version of the ARM64 architecture at compile time. Allowed values are `v8.{0-9}` and `v9.{0-5}`. This may be followed by an option specifying extensions implemented by target hardware. Valid options are `,lse` and `,crypto`. |
| |
| The `GOARM64` environment variable defaults to `v8.0`. |
| |
| ### RISC-V {#riscv} |
| |
| <!-- go.dev/issue/61476, CL 541135 --> |
| Go 1.23 introduces a new `GORISCV64` environment variable, which selects the [RISC-V user-mode application profile](https://github.com/riscv/riscv-profiles/blob/main/src/profiles.adoc) for which to compile. Allowed values are `rva20u64` and `rva22u64`. |
| |
| The `GORISCV64` environment variable defaults to `rva20u64`. |
| |
| ### Wasm {#wasm} |
| |
| <!-- go.dev/issue/63718 --> |
| The `go_wasip1_wasm_exec` script in `GOROOT/misc/wasm` has dropped support |
| for versions of `wasmtime` < 14.0.0. |
| |
| <!-- These items need to be completed and moved to an appropriate location in the release notes. --> |
| |
| <!-- These items need to be reviewed, and mentioned in the Go 1.23 release notes if applicable. |
| |
| None right now; more may come up later on. |
| --> |
| |
| <!-- Maybe should be documented? Maybe shouldn't? Someone familiar with the change needs to determine. |
| |
| CL 359594 ("x/website/_content/ref/mod: document dotless module paths") - resolved go.dev/issue/32819 ("cmd/go: document that module names without dots are reserved") and also mentioned accepted proposal go.dev/issue/37641 |
| CL 555075 ("x/tools/go/ssa: support range-over-func") - x/tools CL implements range-over-func support in x/tools/go/ssa for accepted proposal https://go.dev/issue/66601; this particular proposal and change doesn't seem to need a dedicated mention in Go 1.23 release notes but someone more familiar should take another look |
| --> |
| |
| <!-- Items that don't need to be mentioned in Go 1.23 release notes but are picked up by relnote todo. |
| |
| CL 458895 - an x/playground fix that mentioned an accepted cmd/go proposal go.dev/issue/40728 in Go 1.16 milestone... |
| CL 582097 - an x/build CL working on relnote itself; it doesn't need a release note |
| CL 561935 - crypto CL that used purego tag and mentioned accepted-but-not-implemented proposal https://go.dev/issue/23172 to document purego tag; doesn't need a release note |
| CL 568340 - fixed a spurious race in time.Ticker.Reset (added via accepted proposal https://go.dev/issue/33184), doesn't seem to need a release note |
| CL 562619 - x/website CL documented minimum bootstrap version on go.dev, mentioning accepted proposals go.dev/issue/54265 and go.dev/issue/44505; doesn't need a release note |
| CL 557055 - x/tools CL implemented accepted proposal https://go.dev/issue/46941 for x/tools/go/ssa |
| CL 564275 - an x/tools CL that updates test data in preparation for accepted proposal https://go.dev/issue/51473; said proposal isn't implemented for Go 1.23 and so it doesn't need a release note |
| CL 572535 - used "unix" build tag in more places, mentioned accepted proposal https://go.dev/issue/51572; doesn't need a release note |
| CL 555255 - an x/tools CL implements accepted proposal https://go.dev/issue/53367 for x/tools/go/cfg |
| CL 585216 - an x/build CL mentions accepted proposal https://go.dev/issue/56001 because it fixed a bug causing downloads not to be produced for that new-to-Go-1.22 port; this isn't relevant to Go 1.23 release notes |
| CL 481062 - added examples for accepted proposal https://go.dev/issue/56102; doesn't need a release note |
| CL 497195 - an x/net CL adds one of 4 fields for accepted proposal https://go.dev/issue/57893 in x/net/http2; seemingly not related to net/http and so doesn't need a Go 1.23 release note |
| CL 463097, CL 568198 - x/net CLs that implemented accepted proposal https://go.dev/issue/57953 for x/net/websocket; no need for rel note |
| many x/net CLs - work on accepted proposal https://go.dev/issue/58547 to add a QUIC implementation to x/net/quic |
| CL 514775 - implements a performance optimization for accepted proposal https://go.dev/issue/59488 |
| CL 484995 - x/sys CL implements accepted proposal https://go.dev/issue/59537 to add x/sys/unix API |
| CL 555597 - optimizes TypeFor (added in accepted proposal https://go.dev/issue/60088) for non-interface types; doesn't seem to need a release note |
| a few x/tools CLs deprecated and deleted the experimental golang.org/x/tools/cmd/getgo tool per accepted proposal https://go.dev/issue/60951; an unreleased change and not something that's in scope of Go 1.23 release notes |
| many x/vuln CLs to implement accepted proposal https://go.dev/issue/61347 ("x/vuln: convert govulncheck output to sarif format") in govulncheck |
| CL 516355 - x/crypto CL that implemented accepted proposal https://go.dev/issue/61447 for x/crypto/ssh; doesn't need a Go 1.23 release note |
| CL 559799 - a Go 1.22 release note edit CL mentioned a Go 1.22 accepted proposal https://go.dev/issue/62039, a little after Go 1.23 development began |
| CL 581555 - an x/tools CL mentioned accepted proposal https://go.dev/issue/62292 for x/tools/go/aalysis; doesn't need a Go 1.23 release note |
| CL 578355 - mentioned accepted proposal https://go.dev/issue/63131 to add GOARCH=wasm32, but that proposal hasn't been implemented in Go 1.23 so it doesn't need a release note |
| CL 543335 - x/exp CL that backported a change to behavior in slices package (accepted proposal https://go.dev/issue/63393) to x/exp/slices; doesn't need a Go 1.23 release note |
| CL 556820 - x/tools CL implemented accepted proposal https://go.dev/issue/64548 for x/tools/go/analysis |
| CL 557056 - x/tools CL implemented accepted proposal https://go.dev/issue/64608 for x/tools/go/packages |
| CL 558695 - x/crypto CL worked on accepted proposal https://go.dev/issue/64962 for x/crypto/ssh |
| CL 572016 - x/tools CL implemented accepted proposal https://go.dev/issue/65754 for x/tools/go/cfg |
| a few x/tools CLs tagged and deleted the golang.org/x/tools/cmd/guru command per accepted proposal https://go.dev/issue/65880; an unreleased change and not something that's in scope of Go 1.23 release notes |
| CL 580076 - seemingly internal cmd/go change to propagate module information for accepted proposal https://go.dev/issue/66315; doesn't seem to warrant a release note |
| CL 529816 - the 'tests' vet check was initially added to the 'go test' suite per accepted proposal https://go.dev/issue/44251, but the change was rolled back in CL 571695, with no roll forward as of 2024-05-23; nothing to document in Go 1.23 release notes for it at this time |
| CL 564035 - changed encoding/xml, but the change was too disrptive and rolled back in CL 570175, reopening tracking issue go.dev/issue/65691; nothing to document in Go 1.23 release notes |
| CL 587855 - a demonstration of benefit of accepted proposal https://go.dev/issue/60529; actual change isn't happening in Go 1.23 so doesn't need a release note |
| CL 526875 - x/crypto CL implemented accepted proposal https://go.dev/issue/62518 for x/crypto/ssh |
| --> |