summaryrefslogtreecommitdiff
path: root/doc/go1.20.html
blob: 4cec64c86930fe4db7cdce9519d848736af2de3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
<!--{
	"Title": "Go 1.20 Release Notes",
	"Path":  "/doc/go1.20"
}-->

<!--
NOTE: In this document and others in this directory, the convention is to
set fixed-width phrases with non-fixed-width spaces, as in
<code>hello</code> <code>world</code>.
Do not send CLs removing the interior tags from such phrases.
-->

<style>
  main ul li { margin: 0.5em 0; }
</style>

<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.20</h2>

<p>
  <strong>
    Go 1.20 is not yet released. These are work-in-progress
    release notes. Go 1.20 is expected to be released in February 2023.
  </strong>
</p>

<h2 id="language">Changes to the language</h2>

<p>
  Go 1.20 includes three changes to the language.
</p>

<p><!-- https://go.dev/issue/46505 -->
  Go 1.17 added <a href="/ref/spec#Conversions_from_slice_to_array_pointer">conversions from slice to an array pointer</a>.
  Go 1.20 extends this to allow conversions from a slice to an array:
  given a slice <code>x</code>, <code>[4]byte(x)</code> can now be written
  instead of <code>*(*[4]byte)(x)</code>.
</p>

<p><!-- https://go.dev/issue/53003 -->
  The <a href="/ref/spec/#Package_unsafe"><code>unsafe</code> package</a> defines
  three new functions <code>SliceData</code>, <code>String</code>, and <code>StringData</code>.
  Along with Go 1.17's <code>Slice</code>, these functions now provide the complete ability to
  construct and deconstruct slice and string values, without depending on their exact representation.
</p>

<p><!-- https://go.dev/issue/8606 -->
  The specification now defines that struct values are compared one field at a time,
  considering fields in the order they appear in the struct type definition,
  and stopping at the first mismatch.
  The specification could previously have been read as if
  all fields needed to be compared beyond the first mismatch.
  Similarly, the specification now defines that array values are compared
  one element at a time, in increasing index order.
  In both cases, the difference affects whether certain comparisons must panic.
  Existing programs are unchanged: the new spec wording describes
  what the implementations have always done.
</p>

<h2 id="ports">Ports</h2>

<h3 id="freebsd-riscv">FreeBSD/RISC-V</h3>

<p><!-- https://go.dev/issue/53466 -->
  Go 1.20 adds experimental support for FreeBSD on RISC-V (<code>GOOS=freebsd</code>, <code>GOARCH=riscv64</code>).
</p>

<h2 id="tools">Tools</h2>

<h3 id="go-command">Go command</h3>

<p><!-- CL 432535, https://go.dev/issue/47257 -->
  The directory <code>$GOROOT/pkg</code> no longer stores
  pre-compiled package archives for the standard library:
  <code>go</code> <code>install</code> no longer writes them,
  the <code>go</code> build no longer checks for them,
  and the Go distribution no longer ships them.
  Instead, packages in the standard library are built as needed
  and cached in the build cache, just like packages outside <code>GOROOT</code>.
  This change reduces the size of the Go distribution and also
  avoids C toolchain skew for packages that use cgo.
</p>

<p><!-- CL 448357: cmd/go: print test2json start events -->
  The implementation of <code>go</code> <code>test</code> <code>-json</code>
  has been improved to make it more robust.
  Programs that run <code>go</code> <code>test</code> <code>-json</code>
  do not need any updates.
  Programs that invoke <code>go</code> <code>tool</code> <code>test2json</code>
  directly should now run the test binary with <code>-v=json</code>
  (for example, <code>go</code> <code>test</code> <code>-v=json</code>
  or <code>./pkg.test</code> <code>-test.v=json</code>)
  instead of plain <code>-v</code>.
</p>

<p><!-- CL 448357: cmd/go: print test2json start events -->
  A related change to <code>go</code> <code>test</code> <code>-json</code>
  is the addition of an event with <code>Action</code> set to <code>start</code>
  at the beginning of each test program's execution.
  When running multiple tests using the <code>go</code> command,
  these start events are guaranteed to be emitted in the same order as
  the packages named on the command line.
</p>

<p><!-- https://go.dev/issue/45454, CL 421434 -->
  The <code>go</code> command now defines
  architecture feature build tags, such as <code>amd64.v2</code>,
  to allow selecting a package implementation file based on the presence
  or absence of a particular architecture feature.
  See <a href="/cmd/go#hdr-Build_constraints"><code>go</code> <code>help</code> <code>buildconstraint</code></a> for details.
</p>

<p><!-- https://go.dev/issue/50332 -->
  The <code>go</code> subcommands now accept
  <code>-C</code> <code>&lt;dir&gt;</code> to change directory to &lt;dir&gt;
  before performing the command, which may be useful for scripts that need to
  execute commands in multiple different modules.
</p>

<p><!-- https://go.dev/issue/41696, CL 416094 -->
  The <code>go</code> <code>build</code> and <code>go</code> <code>test</code>
  commands no longer accept the <code>-i</code> flag,
  which has been <a href="https://go.dev/issue/41696">deprecated since Go 1.16</a>.
</p>

<p><!-- https://go.dev/issue/38687, CL 421440 -->
  The <code>go</code> <code>generate</code> command now accepts
  <code>-skip</code> <code>&lt;pattern&gt;</code> to skip <code>//go:generate</code> directives
  matching <code>&lt;pattern&gt;</code>.
</p>

<p><!-- https://go.dev/issue/41583 -->
  The <code>go</code> <code>test</code> command now accepts
  <code>-skip</code> <code>&lt;pattern&gt;</code> to skip tests, subtests, or examples
  matching <code>&lt;pattern&gt;</code>.
</p>

<p><!-- https://go.dev/issue/37015 -->
  When the main module is located within <code>GOPATH/src</code>,
  <code>go</code> <code>install</code> no longer installs libraries for
  non-<code>main</code> packages to <code>GOPATH/pkg</code>,
  and <code>go</code> <code>list</code> no longer reports a <code>Target</code>
  field for such packages. (In module mode, compiled packages are stored in the
  <a href="https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching">build cache</a>
  only, but <a href="https://go.dev/issue/37015">a bug</a> had caused
  the <code>GOPATH</code> install targets to unexpectedly remain in effect.)
</p>

<p><!-- https://go.dev/issue/55022 -->
  The <code>go</code> <code>build</code>, <code>go</code> <code>install</code>,
  and other build-related commands now support a <code>-pgo</code> flag that enables
  profile-guided optimization, which is described in more detail in the
  <a href="#compiler">Compiler</a> section below.
  The <code>-pgo</code> flag specifies the file path of the profile.
  Specifying <code>-pgo=auto</code> causes the <code>go</code> command to search
  for a file named <code>default.pgo</code> in the main package's directory and
  use it if present.
  This mode currently requires a single main package to be specified on the
  command line, but we plan to lift this restriction in a future release.
  Specifying <code>-pgo=off</code> turns off profile-guided optimization.
</p>

<h4 id="go-version"><code>go</code> <code>version</code></h4>

<p><!-- https://go.dev/issue/48187 -->
  The <code>go</code> <code>version</code> <code>-m</code> command
  now supports reading more types of Go binaries, most notably, Windows DLLs
  built with <code>go</code> <code>build</code> <code>-buildmode=c-shared</code>
  and Linux binaries without execute permission.
</p>

<h3 id="cgo">Cgo</h3>

<p><!-- CL 450739 -->
  The <code>go</code> command now disables <code>cgo</code> by default
  on systems without a C toolchain.
  More specifically, when the <code>CGO_ENABLED</code> environment variable is unset,
  the <code>CC</code> environment variable is unset,
  and the default C compiler (typically <code>clang</code> or <code>gcc</code>)
  is not found in the path,
  <code>CGO_ENABLED</code> defaults to <code>0</code>.
  As always, you can override the default by setting <code>CGO_ENABLED</code> explicitly.
</p>

<p>
  The most important effect of the default change is that when Go is installed
  on a system without a C compiler, it will now use pure Go builds for packages
  in the standard library that use cgo, instead of using pre-distributed package archives
  (which have been removed, as <a href="#go-command">noted above</a>)
  or attempting to use cgo and failing.
  This makes Go work better in some minimal container environments
  as well as on macOS, where pre-distributed package archives have
  not been used for cgo-based packages since Go 1.16.
</p>

<p>
  The packages in the standard library that use cgo are <a href="/pkg/net/">net</a>,
  <a href="/pkg/os/user/">os/user</a>, and
  <a href="/pkg/plugin/">plugin</a>.
  On macOS, the net and os/user packages have been rewritten not to use cgo:
  the same code is now used for cgo and non-cgo builds as well as cross-compiled builds.
  On Windows, the net and os/user packages have never used cgo.
  On other systems, builds with cgo disabled will use a pure Go version of these packages.
</p>

<p>
  On macOS, the race detector has been rewritten not to use cgo:
  race-detector-enabled programs can be built and run without Xcode.
  On Linux and other Unix systems, and on Windows, a host C toolchain
  is required to use the race detector.
</p>

<h3 id="cover">Cover</h3>

<p><!-- CL 436236, CL 401236, CL 438503 -->
  TODO coverage
</p>

<h3 id="vet">Vet</h3>

<h4 id="vet-loopclosure">Improved detection of loop variable capture by nested functions</h4>

<p><!-- CL 447256, https://go.dev/issue/55972: extend the loopclosure analysis to parallel subtests -->
  The <code>vet</code> tool now reports references to loop variables following
  a call to <a href="/pkg/testing/#T.Parallel"><code>T.Parallel()</code></a>
  within subtest function bodies. Such references may observe the value of the
  variable from a different iteration (typically causing test cases to be
  skipped) or an invalid state due to unsynchronized concurrent access.
</p>

<p><!-- CL 452615 -->
  The tool also detects reference mistakes in more places. Previously it would
  only consider the last statement of the loop body, but now it recursively
  inspects the last statements within if, switch, and select statements.
</p>

<h4 id="vet-timeformat">New diagnostic for incorrect time formats</h4>

<p><!-- CL 354010, https://go.dev/issue/48801: check for time formats with 2006-02-01 -->
  The vet tool now reports use of the time format 2006-02-01 (yyyy-dd-mm)
  with <a href="/pkg/time/#Time.Format"><code>Time.Format</code></a> and
  <a href="/pkg/time/#Parse"><code>time.Parse</code></a>.
  This format does not appear in common date standards, but is frequently
  used by mistake when attempting to use the ISO 8601 date format
  (yyyy-mm-dd).
</p>

<h2 id="runtime">Runtime</h2>

<p>
  TODO: complete this section, or delete if not needed
</p>

<h2 id="compiler">Compiler</h2>

<p><!-- https://go.dev/issue/55022 -->
  Go 1.20 adds preview support for profile-guided optimization (PGO).
  PGO enables the toolchain to perform application- and workload-specific
  optimizations based on run-time profile information.
  Currently, the compiler supports pprof CPU profiles, which can be collected
  through usual means, such as the <code>runtime/pprof</code> or
  <code>net/http/pprof</code> packages.
  To enable PGO, pass the path of a pprof profile file via the
  <code>-pgo</code> flag to <code>go</code> <code>build</code>,
  as mentioned <a href="#go-command">above</a>.
  Go 1.20 uses PGO to more aggressively inline functions at hot call sites.
  Benchmarks for a representative set of Go programs show enabling
  profile-guided inlining optimization improves performance about 3–4%.
  We plan to add more profile-guided optimizations in future releases.
  Note that profile-guided optimization is a preview, so please use it
  with appropriate caution.
</p>

<p>
  TODO: complete this section
</p>

<h2 id="linker">Linker</h2>

<p>
  TODO: complete this section, or delete if not needed
</p>

<h2 id="bootstrap">Bootstrap</h2>

<p><!-- https://go.dev/issue/44505 -->
  When building a Go release from source and GOROOT_BOOTSTRAP is not set,
  previous versions of Go looked for a Go 1.4 or later bootstrap toolchain in the directory $HOME/go1.4 (%HOMEDRIVE%%HOMEPATH%\go1.4 on Windows).
  Go 1.18 and Go 1.19 looked first for $HOME/go1.17 or $HOME/sdk/go1.17 before falling back to $HOME/go1.4,
  in ancitipation of requiring Go 1.17 for use when bootstrapping Go 1.20.
  Go 1.20 does require a Go 1.17 release for bootstrapping, but we realized that we should
  adopt the latest point release of the bootstrap toolchain, so it requires Go 1.17.13.
  Go 1.20 looks for $HOME/go1.17.13 or $HOME/sdk/go1.17.13 before falling back to $HOME/go1.4
  (to support systems that hard-coded the path $HOME/go1.4 but have installed
  a newer Go toolchain there).
  In the future, we plan to move the bootstrap toolchain forward approximately once a year,
  and in particular we expect that Go 1.22 will require the final point release of Go 1.20 for bootstrap.
</p>

<h2 id="library">Core library</h2>

<h3 id="crypto/ecdh">New crypto/ecdh package</h3>

<p><!-- https://go.dev/issue/52221, CL 398914, CL 450335 -->
  Go 1.20 adds a new <a href="/pkg/crypto/ecdh/"><code>crypto/ecdh</code></a> package
  to provide direct support for Elliptic Curve Diffie-Hellman key exchange
  over NIST curves and Curve25519.
</p>
<p>
  Programs should prefer to use <code>crypto/ecdh</code>
  or <a href="/pkg/crypto/ecdsa/"><code>crypto/ecdsa</code></a>
  instead of the lower-level functionality in <a href="/pkg/crypto/elliptic/"><code>crypto/elliptic</code></a>.
</p>

<h3 id="errors">Wrapping multiple errors</h3>

<p><!-- CL 432898 -->
  Go 1.20 expands support for error wrapping to permit an error to
  wrap multiple other errors.
</p>
<p>
  An error <code>e</code> can wrap more than one error by providing
  an <code>Unwrap</code> method that returns a <code>[]error</code>.
</p>
<p>
  The <a href="/pkg/errors/#Is"><code>errors.Is</code></a> and
  <a href="/pkg/errors/#As"><code>errors.As</code></a> functions
  have been updated to inspect multiply wrapped errors.
</p>
<p>
  The <a href="/pkg/fmt/#Errorf"><code>fmt.Errorf</code></a> function
  now supports multiple occurrances of the <code>%w</code> format verb,
  which will cause it to return an error that wraps all of those error operands.
</p>
<p>
  The new function <a href="/pkg/errors/#Join"><code>errors.Join</code></a>
  returns an error wrapping a list of errors.
</p>

<h3 id="http_responsecontroller">HTTP ResponseController</h3>

<p><!-- CL 436890, https://go.dev/issue/54136 -->
  The new
  <a href="/pkg/net/http/#ResponseController"><code>"net/http".ResponseController</code></a>
  type provides access to extended per-request functionality not handled by the
  <a href="/pkg/net/http/#ResponseWriter"><code>"net/http".ResponseWriter</code></a> interface.
</p>

<p>
  Previously, we have added new per-request functionality by defining optional
  interfaces which a <code>ResponseWriter</code> can implement, such as
  <a href="/pkg/net/http/#Flusher"><code>Flusher</code></a>. These interfaces
  are not discoverable and clumsy to use.
</p>

<p>
  The <code>ResponseController</code> type provides a clearer, more discoverable way
  to add per-handler controls. Two such controls also added in Go 1.20 are
  <code>SetReadDeadline</code> and <code>SetWriteDeadline</code>, which allow setting
  per-request read and write deadlines. For example:
</p>

<pre>
func RequestHandler(w ResponseWriter, r *Request) {
  rc := http.NewResponseController(w)
  rc.SetWriteDeadline(0) // disable Server.WriteTimeout when sending a large response
  io.Copy(w, bigData)
}
</pre>

<h3 id="reverseproxy_rewrite">New ReverseProxy Rewrite hook</h3>

<p><!-- https://go.dev/issue/53002, CL 407214 -->
  The <a href="/pkg/net/http/httputil/#ReverseProxy"><code>httputil.ReverseProxy</code></a>
  forwarding proxy includes a new
  <a href="/pkg/net/http/httputil/#ReverseProxy.Rewrite"><code>Rewrite</code></a>
  hook function, superseding the
  previous <code>Director</code> hook.
</p>

<p>
  The <code>Rewrite</code> hook accepts a
  <a href="/pkg/net/http/httputil/#ProxyRequest"><code>ProxyRequest</code></a> parameter,
  which includes both the inbound request received by the proxy and the outbound
  request that it will send.
  Unlike <code>Director</code> hooks, which only operate on the outbound request,
  this permits <code>Rewrite</code> hooks to avoid certain scenarios where
  a malicious inbound request may cause headers added by the hook
  to be removed before forwarding.
  See <a href="https://go.dev/issue/50580">issue #50580</a>.
</p>

<p>
  The <a href="/pkg/net/http/httputil/#ProxyRequest.SetURL"><code>ProxyRequest.SetURL</code></a>
  method routes the outbound request to a provided destination
  and supersedes the <code>NewSingleHostReverseProxy</code> function.
  Unlike <code>NewSingleHostReverseProxy</code>, <code>SetURL</code>
  also sets the <code>Host</code> header of the outbound request.
</p>

<p><!-- https://go.dev/issue/50465, CL 407414 -->
  The
  <a href="/pkg/net/http/httputil/#ProxyRequest.SetXForwarded"><code>ProxyRequest.SetXForwarded</code></a>
  method sets the <code>X-Forwarded-For</code>, <code>X-Forwarded-Host</code>,
  and <code>X-Forwarded-Proto</code> headers of the outbound request.
  When using a <code>Rewrite</code>, these headers are not added by default.
</p>

<p>
  An example of a <code>Rewrite</code> hook using these features is:
</p>

<pre>
proxyHandler := &httputil.ReverseProxy{
  Rewrite: func(r *httputil.ProxyRequest) {
    r.SetURL(outboundURL) // Forward request to outboundURL.
    r.SetXForwarded()     // Set X-Forwarded-* headers.
    r.Out.Header.Set("X-Additional-Header", "header set by the proxy")
  },
}
</pre>

<p><!-- CL 407375 -->
 <a href="/pkg/net/http/httputil/#ReverseProxy"><code>ReverseProxy</code></a> no longer adds a <code>User-Agent</code> header
  to forwarded requests when the incoming request does not have one.
</p>

<h3 id="minor_library_changes">Minor changes to the library</h3>

<p>
  As always, there are various minor changes and updates to the library,
  made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
  in mind.
  There are also various performance improvements, not enumerated here.
</p>

<p>
  TODO: complete this section
</p>

<dl id="archive/tar"><dt><a href="/pkg/archive/tar/">archive/tar</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/55356, CL 449937 -->
      When the <code>GODEBUG=tarinsecurepath=0</code> environment variable is set,
      <a href="/pkg/archive/tar/#Reader.Next"><code>Reader.Next</code></a> method
      will now return the error <a href="/pkg/archive/tar/#ErrInsecurePath"><code>ErrInsecurePath</code></a>
      for an entry with a file name that is an absolute path,
      refers to a location outside the current directory, contains invalid
      characters, or (on Windows) is a reserved name such as <code>NUL</code>.
      A future version of Go may disable insecure paths by default.
    </p>
  </dd>
</dl><!-- archive/tar -->

<dl id="archive/zip"><dt><a href="/pkg/archive/zip/">archive/zip</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/55356 -->
      When the <code>GODEBUG=zipinsecurepath=0</code> environment variable is set,
      <a href="/pkg/archive/zip/#NewReader"><code>NewReader</code></a> will now return the error
      <a href="/pkg/archive/zip/#ErrInsecurePath"><code>ErrInsecurePath</code></a>
      when opening an archive which contains any file name that is an absolute path,
      refers to a location outside the current directory, contains invalid
      characters, or (on Windows) is a reserved names such as <code>NUL</code>.
      A future version of Go may disable insecure paths by default.
    </p>
    <p><!-- CL 449955 -->
      Reading from a directory file that contains file data will now return an error.
      The zip specification does not permit directory files to contain file data,
      so this change only affects reading from invalid archives.
    </p>
  </dd>
</dl><!-- archive/zip -->

<dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt>
  <dd>
    <p><!-- CL 407176 -->
      The new
      <a href="/pkg/bytes/#CutPrefix"><code>CutPrefix</code></a> and
      <a href="/pkg/bytes/#CutSuffix"><code>CutSuffix</code></a> functions
      are like <a href="/pkg/bytes/#TrimPrefix"><code>TrimPrefix</code></a>
      and <a href="/pkg/bytes/#TrimSuffix"><code>TrimSuffix</code></a>
      but also report whether the string was trimmed.
    </p>

    <p><!-- CL 359675, https://go.dev/issue/45038 -->
      The new <a href="/pkg/bytes/#Clone"><code>Clone</code></a> function
      allocates a copy of a byte slice.
    </p>
  </dd>
</dl><!-- bytes -->

<dl id="context"><dt><a href="/pkg/context/">context</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/51365, CL 375977 -->
      The new <a href="/pkg/context/#WithCancelCause"><code>WithCancelCause</code></a> function
      provides a way to cancel a context with a given error.
      That error can be retrieved by calling the new <a href="/pkg/context/#Cause"><code>Cause</code></a> function.
    </p>
  </dd>
</dl><!-- context -->

<dl id="crypto/ecdsa"><dt><a href="/pkg/crypto/ecdsa/">crypto/ecdsa</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/56088, CL 450816 -->
      The new <a href="/pkg/crypto/ecdsa/#PrivateKey.ECDH"><code>PrivateKey.ECDH</code></a> method
      converts an <code>ecdsa.PrivateKey</code> to an <code>ecdh.PrivateKey</code>.
    </p>
  </dd>
</dl><!-- crypto/ecdsa -->

<dl id="crypto/ed25519"><dt><a href="/pkg/crypto/ed25519/">crypto/ed25519</a></dt>
  <dd>
    <p><!-- CL 373076, CL 404274, https://go.dev/issue/31804 -->
      The <a href="/pkg/crypto/ed25519/#PrivateKey.Sign"><code>PrivateKey.Sign</code></a> method
      and the
      <a href="/pkg/crypto/ed25519/#VerifyWithOptions"><code>VerifyWithOptions</code></a> function
      now support signing pre-hashed messages with Ed25519ph,
      indicated by an
      <a href="/pkg/crypto/ed25519/#Options.HashFunc"><code>Options.HashFunc</code></a>
      that returns
      <a href="/pkg/crypto/#SHA512"><code>crypto.SHA512</code></a>.
      They also now support Ed25519ctx and Ed25519ph with context,
      indicated by setting the new
      <a href="/pkg/crypto/ed25519/#Options.Context"><code>Options.Context</code></a>
      field.
    </p>
  </dd>
</dl><!-- crypto/ed25519 -->

<dl id="crypto/elliptic"><dt><a href="/pkg/crypto/elliptic/">crypto/elliptic</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/34648 -->
      Use of custom <a href="/pkg/crypto/elliptic/#Curve"><code>Curve</code></a> implementations
      not provided by this package (that is, curves other than
      <a href="/pkg/crypto/elliptic/#P224"><code>P224</code></a>,
      <a href="/pkg/crypto/elliptic/#P256"><code>P256</code></a>,
      <a href="/pkg/crypto/elliptic/#P384"><code>P384</code></a>, and
      <a href="/pkg/crypto/elliptic/#P521"><code>P521</code></a>)
      is deprecated.
    </p>
  </dd>
</dl><!-- crypto/elliptic -->

<dl id="crypto/rsa"><dt><a href="/pkg/crypto/rsa/">crypto/rsa</a></dt>
  <dd>
    <p><!-- CL 418874, https://go.dev/issue/19974 -->
      The new field <a href="/pkg/crypto/rsa/#OAEPOptions.MGFHash">OAEPOptions.MGFHash</a>
      allows configuring the MGF1 hash separately for OAEP encryption.
    </p>
  </dd>
</dl><!-- crypto/rsa -->

<dl id="crypto/subtle"><dt><a href="/pkg/crypto/subtle/">crypto/subtle</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/53021, CL 421435 -->
      The new function <a href="/pkg/crypto/subtle/#XORBytes">XORBytes</a>
      XORs two byte slices together.
    </p>
  </dd>
</dl><!-- crypto/subtle -->

<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
  <dd>
    <p><!-- CL 426455 -->
      The TLS client now shares parsed certificates across all clients actively using that certificate.
      The savings can be significant in programs that make many concurrent connections to a
      server or collection of servers sharing any part of their certificate chains.
    </p>

    <p><!-- https://go.dev/issue/48152, CL 449336 -->
      For a handshake failure due to a certificate verification failure,
      the TLS client and server now return an error of the new type
      <a href="/pkg/crypto/tls/#CertificateVerificationError"><code>CertificateVerificationError</code></a>,
      which includes the presented certificates.
    </p>
  </dd>
</dl><!-- crypto/tls -->

<dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt>
  <dd>
    <p><!-- CL 450816 -->
      <a href="/pkg/crypto/x509/#CreateCertificateRequest"><code>CreateCertificateRequest</code></a>
      and
      <a href="/pkg/crypto/x509/#MarshalPKCS8PrivateKey"><code>MarshalPKCS8PrivateKey</code></a>
      now support keys of type <a href="/pkg/crypto/ecdh.PrivateKey"><code>*crypto/ecdh.PrivateKey</code></a>.
      <a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a>
      and
      <a href="/pkg/crypto/x509/#MarshalPKIXPublicKey"><code>MarshalPKIXPublicKey</code></a>
      now support keys of type <a href="/pkg/crypto/ecdh.PublicKey"><code>*crypto/ecdh.PublicKey</code></a>.
      X.509 unmarshaling continues to unmarshal elliptic curve keys into
      <code>*ecdsa.PublicKey</code> and <code>*ecdsa.PrivateKey</code>.
      Use their new <code>ECDH</code> methods to convert to the <code>crypto/ecdh</code> form.
    </p>
    <p><!-- CL 449235 -->
      The new <a href="/pkg/crypto/x509/#SetFallbackRoots"><code>SetFallbackRoots</code></a>
      function allows a program to define a set of fallback root certificates in case the
      operating system verifier or standard platform root bundle is unavailable at runtime.
      It will most commonly be used with the new TODO LINK TO x/crypto PACKAGE ONCE IT EXISTS.
    </p>
  </dd>
</dl><!-- crypto/x509 -->

<dl id="debug/elf"><dt><a href="/pkg/debug/elf/">debug/elf</a></dt>
  <dd>
    <p><!-- CL 429601 -->
      Attempts to read from a <code>SHT_NOBITS</code> section using
      <a href="/pkg/debug/elf/#Section.Data"><code>Section.Data</code></a>
      or the reader returned by <a href="/pkg/debug/elf/#Section.Open"><code>Section.Open</code></a>
      now return an error.
    </p>
    <p><!-- CL 420982 -->
      Additional <a href="/pkg/debug/elf/#R_LARCH"><code>R_LARCH_*</code></a> constants are defined for use with LoongArch systems.
    </p>
    <p><!-- CL 420982, CL 435415, CL 425555 -->
      Additional <a href="/pkg/debug/elf/#R_PPC64"><code>R_PPC64_*</code></a> constants are defined for use with PPC64 ELFv2 relocations.
    </p>
    <p><!-- CL 411915 -->
      The constant value for <a href="/pkg/debug/elf/#R_PPC64_SECTOFF_LO_DS"><code>R_PPC64_SECTOFF_LO_DS</code></a> is corrected, from 61 to 62.
    </p>
  </dd>
</dl><!-- debug/elf -->

<dl id="debug/pe"><dt><a href="/pkg/debug/pe/">debug/pe</a></dt>
  <dd>
    <p><!-- CL 421357 -->
      Additional <a href="/pkg/debug/pe/#IMAGE_FILE_MACHINE_RISCV128"><code>IMAGE_FILE_MACHINE_RISCV*</code></a> constants are defined for use with RISC-V systems.
    </p>
  </dd>
</dl><!-- debug/pe -->

<dl id="encoding/binary"><dt><a href="/pkg/encoding/binary/">encoding/binary</a></dt>
  <dd>
    <p><!-- CL 420274 -->
      The <a href="/pkg/encoding/binary/#ReadVarint"><code>ReadVarint</code></a> and
      <a href="/pkg/encoding/binary/#ReadUvarint"><code>ReadUvarint</code></a>
      functions will now return <code>io.ErrUnexpectedEOF</code> after reading a partial value,
      rather than <code>io.EOF</code>.
    </p>
  </dd>
</dl><!-- encoding/binary -->

<dl id="encoding/xml"><dt><a href="/pkg/encoding/xml/">encoding/xml</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/53346, CL 424777 -->
      The new <a href="/pkg/encoding/xml/#Encoder.Close"><code>Encoder.Close</code></a> method
      can be used to check for unclosed elements when finished encoding.
    </p>

    <p><!-- CL 103875, CL 105636 -->
      The decoder now rejects element and attribute names with more than one colon,
      such as <code>&lt;a:b:c&gt;</code>,
      as well as namespaces that resolve to an empty string, such as <code>xmlns:a=""</code>.
    </p>

    <p><!-- CL 107255 -->
      The decoder now rejects elements that use different namespace prefixes in the opening and closing tag,
      even if those prefixes both denote the same namespace.
    </p>
  </dd>
</dl><!-- encoding/xml -->

<dl id="errors"><dt><a href="/pkg/errors/">errors</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/53435 -->
      The new <a href="/pkg/errors/#Join"><code>Join</code></a> function returns an error wrapping a list of errors.
    </p>
  </dd>
</dl><!-- errors -->

<dl id="fmt"><dt><a href="/pkg/fmt/">fmt</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/53435 -->
      The <a href="/pkg/fmt/#Errorf"><code>Errorf</code></a> function supports multiple occurrences of
      the <code>%w</code> format verb, returning an error that unwraps to the list of all arguments to <code>%w</code>.
    </p>
    <p><!-- https://go.dev/issue/51668, CL 400875 -->
      The new <a href="/pkg/fmt/#FormatString"><code>FormatString</code></a> function recovers the
      formatting directive corresponding to a <a href="/pkg/fmt/#State"><code>State</code></a>,
      which can be useful in <a href="/pkg/fmt/#Formatter"><code>Formatter</code></a>.
      implementations.
    </p>
  </dd>
</dl><!-- fmt -->

<dl id="go/ast"><dt><a href="/pkg/go/ast/">go/ast</a></dt>
  <dd>
    <p><!-- CL 426091, https://go.dev/issue/50429 -->
      The new <a href="/pkg/go/ast/#RangeStmt.Range"><code>RangeStmt.Range</code></a> field
      records the position of the <code>range</code> keyword in a range statement.
    </p>
    <p><!-- CL 427955, https://go.dev/issue/53202 -->
      The new <a href="/pkg/go/ast/#File.FileStart"><code>File.FileStart</code></a>
      and <a href="/pkg/go/ast/#File.FileEnd"><code>File.FileEnd</code></a> fields
      record the position of the start and end of the entire source file.
    </p>
  </dd>
</dl><!-- go/ast -->

<dl id="go/token"><dt><a href="/pkg/go/token/">go/token</a></dt>
  <dd>
    <p><!-- CL 410114, https://go.dev/issue/53200 -->
      The new <a href="/pkg/go/token/#FileSet.RemoveFile"><code>FileSet.RemoveFile</code></a> method
      removes a file from a <code>FileSet</code>.
      Long-running programs can use this to release memory associated
      with files they no longer need.
    </p>
  </dd>
</dl><!-- go/token -->

<dl id="io"><dt><a href="/pkg/io/">io</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/45899, CL 406776 -->
      The new <a href="/pkg/io/#OffsetWriter"><code>OffsetWriter</code></a> wraps an underlying
      <a href="/pkg/io/#WriterAt"><code>WriterAt</code></a>
      and provides <code>Seek</code>, <code>Write</code>, and <code>WriteAt</code> methods
      that adjust their effective file offset position by a fixed amount.
    </p>
  </dd>
</dl><!-- io -->

<dl id="io/fs"><dt><a href="/pkg/io/fs/">io/fs</a></dt>
  <dd>
    <p><!-- CL 363814, https://go.dev/issue/47209 -->
      The new error <a href="/pkg/io/fs/#SkipAll"><code>SkipAll</code></a>
      terminates a <a href="/pkg/io/fs/#WalkDir"><code>WalkDir</code></a>
      immediately but successfully.
    </p>
  </dd>
</dl><!-- io -->

<dl id="math/rand"><dt><a href="/pkg/math/rand/">math/rand</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/54880, CL 436955, https://go.dev/issue/56319 -->
      The <a href="/pkg/math/rand/">math/rand</a> package now automatically seeds
      the global random number generator
      (used by top-level functions like <code>Float64</code> and <code>Int</code>) with a random value,
      and the top-level <a href="/pkg/math/rand/#Seed"><code>Seed</code></a> function has been deprecated.
      Programs that need a reproducible sequence of random numbers
      should prefer to allocate their own random source, using <code>rand.New(rand.NewSource(seed))</code>.
    </p>
    <p>
      Programs that need the earlier consistent global seeding behavior can set
      <code>GODEBUG=randautoseed=0</code> in their environment.
    </p>
    <p><!-- https://go.dev/issue/20661 -->
      The top-level <a href="/pkg/math/rand/#Read"><code>Read</code></a> function has been deprecated.
      In almost all cases,  <a href="/pkg/crypto/rand/#Read"><code>crypto/rand.Read</code></a> is more appropriate.
    </p>
  </dd>
</dl><!-- math/rand -->

<dl id="mime"><dt><a href="/pkg/mime/">mime</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/48866 -->
      The <a href="/pkg/mime/#ParseMediaType"><code>ParseMediaType</code></a> function now allows duplicate parameter names,
      so long as the values of the names are the same.
    </p>
  </dd>
</dl><!-- mime -->

<dl id="mime/multipart"><dt><a href="/pkg/mime/multipart/">mime/multipart</a></dt>
  <dd>
    <p><!-- CL 431675 -->
      Methods of the <a href="/pkg/mime/multipart/#Reader"><code>Reader</code></a> type now wrap errors
      returned by the underlying <code>io.Reader</code>.
    </p>
  </dd>
</dl><!-- mime/multipart -->

<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/50101, CL 446179 -->
      The <a href="/pkg/net/#LookupCNAME"><code>LookupCNAME</code></a>
      function now consistently returns the contents
      of a <code>CNAME</code> record when one exists. Previously on Unix systems and
      when using the pure Go resolver, <code>LookupCNAME</code> would return an error
      if a <code>CNAME</code> record referred to a name that with no <code>A</code>,
      <code>AAAA</code>, or <code>CNAME</code> record. This change modifies
      <code>LookupCNAME</code> to match the previous behavior on Windows,
      allowing allowing <code>LookupCNAME</code> to succeed whenever a
      <code>CNAME</code> exists.
    </p>

    <p><!-- https://go.dev/issue/53482, CL 413454 -->
      <a href="/pkg/net/#Interface.Flags"><code>Interface.Flags</code></a> now includes the new flag <code>FlagRunning</code>,
      indicating an operationally active interface. An interface which is administratively
      configured but not active (for example, because the network cable is not connected)
      will have <code>FlagUp</code> set but not <code>FlagRunning</code>.
    </p>

    <p><!-- https://go.dev/issue/55301, CL 444955 -->
      The new <a href="/pkg/net/#Dialer.ControlContext"><code>Dialer.ControlContext</code></a> field contains a callback function
      similar to the existing <a href="/pkg/net/#Dialer.Control"><code>Dialer.Control</code></a> hook, that additionally
      accepts the dial context as a parameter.
      <code>Control</code> is ignored when <code>ControlContext</code> is not nil.
    </p>

    <p><!-- CL 428955 -->
      The Go DNS resolver recognizes the <code>trust-ad</code> resolver option.
      When <code>options trust-ad</code> is set in <code>resolv.conf</code>,
      the Go resolver will set the AD bit in DNS queries. The resolver does not
      make use of the AD bit in responses.
    </p>

    <p><!-- CL 448075 -->
      DNS resolution will detect changes to <code>/etc/nsswitch.conf</code>
      and reload the file when it changes. Checks are made at most once every
      five seconds, matching the previous handling of <code>/etc/hosts</code>
      and <code>/etc/resolv.conf</code>.
    </p>
  </dd>
</dl><!-- net -->

<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/51914 -->
      The <a href="/pkg/net/http/#ResponseWriter.WriteHeader"><code>ResponseWriter.WriteHeader</code></a> function now supports sending
      <code>1xx</code> status codes.
    </p>

    <p><!-- https://go.dev/issue/41773, CL 356410 -->
      The new <a href="/pkg/net/http/#Server.DisableGeneralOptionsHandler"><code>Server.DisableGeneralOptionsHandler</code></a> configuration setting
      allows disabling the default <code>OPTIONS *</code> handler.
    </p>

    <p><!-- https://go.dev/issue/54299, CL 447216 -->
      The new <a href="/pkg/net/http/#Transport.OnProxyConnectResponse"><code>Transport.OnProxyConnectResponse</code></a> hook is called
      when a <code>Transport</code> receives an HTTP response from a proxy
      for a <code>CONNECT</code> request.
    </p>

    <p><!-- https://go.dev/issue/53960, CL 418614  -->
      The HTTP server now accepts HEAD requests containing a body,
      rather than rejecting them as invalid.
    </p>

    <p><!-- https://go.dev/issue/53896 -->
      HTTP/2 stream errors returned by <code>net/http</code> functions may be converted
      to a <a href="/pkg/golang.org/x/net/http2/#StreamError"><code>golang.org/x/net/http2.StreamError</code></a> using
      <a href="/pkg/errors/#As"><code>errors.As</code></a>.
    </p>

    <p><!-- https://go.dev/cl/397734 -->
      Leading and trailing spaces are trimmed from cookie names,
      rather than being rejected as invalid.
      For example, a cookie setting of "name =value"
      is now accepted as setting the cookie "name".
    </p>
  </dd>
</dl><!-- net/http -->

<dl id="net/netip"><dt><a href="/pkg/net/netip/">net/netip</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/51766, https://go.dev/issue/51777, CL 412475 -->
      The new <a href="/pkg/net/netip/#IPv6LinkLocalAllRouters">IPv6LinkLocalAllRouters</a>
      and <a href="/pkg/net/netip/#IPv6Loopback">IPv6Loopback</a> functions
      are the <code>net/netip</code> equivalents of
      <a href="/pkg/net/#IPv6loopback"><code>net.IPv6loopback</code></a> and
      <a href="/pkg/net/#IPv6linklocalallrouters"><code>net.IPv6linklocalallrouters</code></a>.
    </p>
  </dd>
</dl><!-- net/netip -->

<dl id="os"><dt><a href="/pkg/os/">os</a></dt>
  <dd>
    <p><!-- CL 448897 -->
      On Windows, the name <code>NUL</code> is no longer treated as a special case in
      <a href="/pkg/os/#Mkdir"><code>Mkdir</code></a> and
      <a href="/pkg/os/#Stat"><code>Stat</code></a>.
    </p>
    <p><!-- https://go.dev/issue/52747, CL 405275 -->
      On Windows, <a href="/pkg/os/#File.Stat"><code>File.Stat</code></a>
      now uses the file handle to retrieve attributes when the file is a directory.
      Previously it would use the path passed to
      <a href="/pkg/os/#Open"><code>Open</code></a>, which may no longer be the file
      represented by the file handle if the file has been moved or replaced.
      This change modifies <code>Open</code> to open directories without the
      <code>FILE_SHARE_DELETE</code> access, which match the behavior of regular files.
    </p>
    <p><!-- https://go.dev/issue/36019, CL 405275 -->
      On Windows, <a href="/pkg/os/#File.Seek"><code>File.Seek</code></a> now supports
      seeking to the beginning of a directory.
    </p>
  </dd>
</dl><!-- os -->

<dl id="os/exec"><dt><a href="/pkg/os/exec/">os/exec</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/50436, CL 401835 -->
      The new <a href="/pkg/os/exec/#Cmd"><code>Cmd</code></a> fields
      <a href="/pkg/os/exec/#Cmd.Cancel"><code>Cancel</code></a> and
      <a href="/pkg/os/exec/#Cmd.WaitDelay"><code>WaitDelay</code></a>
      specify the behavior of the <code>Cmd</code> when its associated
      <code>Context</code> is canceled or its process exits with I/O pipes still
      held open by a child process.
    </p>
  </dd>
</dl><!-- os/exec -->

<dl id="path/filepath"><dt><a href="/pkg/path/filepath/">path/filepath</a></dt>
  <dd>
    <p><!-- CL 363814, https://go.dev/issue/47209 -->
      The new error <a href="/pkg/path/filepath/#SkipAll"><code>SkipAll</code></a>
      terminates a <a href="/pkg/path/filepath/#Walk"><code>Walk</code></a>
      immediately but successfully.
    </p>
    <p><!-- https://go.dev/issue/56219, CL 449239 -->
      The new <a href="/pkg/path/filepath/#IsLocal"><code>IsLocal</code></a> function reports whether a path is
      lexically local to a directory.
      For example, if <code>IsLocal(p)</code> is <code>true</code>,
      then <code>Open(p)</code> will refer to a file that is lexically
      within the subtree rooted at the current directory.
    </p>
  </dd>
</dl><!-- io -->

<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/46746, CL 423794 -->
      The new <a href="/pkg/reflect/#Value.Comparable"><code>Value.Comparable</code></a> and
      <a href="/pkg/reflect/#Value.Equal"><code>Value.Equal</code></a> methods
      can be used to compare two <code>Value</code>s for equality.
      <code>Comparable</code> reports whether <code>Equal</code> is a valid operation for a given <code>Value</code> receiver.
    </p>

    <p><!-- https://go.dev/issue/48000, CL 389635 -->
      The new <a href="/pkg/reflect/#Value.Grow"><code>Value.Grow</code></a> method
      extends a slice to guarantee space for another <code>n</code> elements.
    </p>

    <p><!-- https://go.dev/issue/52376, CL 411476 -->
      The new <a href="/pkg/reflect/#Value.SetZero"><code>Value.SetZero</code></a> method
      sets a value to be the zero value for its type.
    </p>

    <p><!-- CL 425184 -->
      Go 1.18 introduced <a href="/pkg/reflect/#Value.SetIterKey"><code>Value.SetIterKey</code></a>
      and <a href="/pkg/reflect/#Value.SetIterValue"><code>Value.SetIterValue</code></a> methods.
      These are optimizations: <code>v.SetIterKey(it)</code> is meant to be equivalent to <code>v.Set(it.Key())</code>.
      The implementations incorrectly omitted a check for use of unexported fields that was present in the unoptimized forms.
      Go 1.20 corrects these methods to include the unexported field check.
    </p>
  </dd>
</dl><!-- reflect -->

<dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt>
  <dd>
    <p><!-- CL 444817 -->
      Go 1.19.2 and Go 1.18.7 included a security fix to the regular expression parser,
      making it reject very large expressions that would consume too much memory.
      Because Go patch releases do not introduce new API,
      the parser returned <a href="/pkg/regexp/syntax/#ErrInternalError"><code>syntax.ErrInternalError</code></a> in this case.
      Go 1.20 adds a more specific error, <a href="/pkg/regexp/syntax/#ErrLarge"><code>syntax.ErrLarge</code></a>,
      which the parser now returns instead.
    </p>
  </dd>
</dl><!-- regexp -->

<dl id="runtime/metrics"><dt><a href="/pkg/runtime/metrics/">runtime/metrics</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/47216 -->
      Go 1.20 adds new <a href="/pkg/runtime/metrics/#hdr-Supported_metrics">supported metrics</a>,
      including the current <code>GOMAXPROCS</code> setting (<code>/sched/gomaxprocs:threads</code>),
      the number of cgo calls executed (<code>/cgo/go-to-c-calls:calls</code>),
      and various measures of time spent in garbage collection.
    </p>
  </dd>
</dl><!-- runtime/metrics -->

<dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt>
  <dd>
    <p><!-- CL 407176, https://go.dev/issue/42537 -->
      The new
      <a href="/pkg/bytes/#CutPrefix"><code>CutPrefix</code></a> and
      <a href="/pkg/bytes/#CutSuffix"><code>CutSuffix</code></a> functions
      are like <a href="/pkg/bytes/#TrimPrefix"><code>TrimPrefix</code></a>
      and <a href="/pkg/bytes/#TrimSuffix"><code>TrimSuffix</code></a>
      but also report whether the string was trimmed.
    </p>

    <p><!-- CL 359675, https://go.dev/issue/45038 -->
      The new <a href="/pkg/strings/#Clone"><code>Clone</code></a> function
      allocates a copy of a string.
    </p>
  </dd>
</dl><!-- strings -->

<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
  <dd>
    <p><!-- CL 399094, https://go.dev/issue/51972 -->
      The new <a href="/pkg/sync/#Map"><code>Map</code></a> methods <a href="/pkg/sync/#Map.Swap"><code>Swap</code></a>,
      <a href="/pkg/sync/#Map.CompareAndSwap"><code>CompareAndSwap</code></a>, and
      <a href="/pkg/sync/#Map.CompareAndDelete"><code>CompareAndDelete</code></a>
      allow existing map entries to be updated atomically.
    </p>
  </dd>
</dl><!-- sync -->

<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
  <dd>
    <p><!-- CL 411596 -->
      On FreeBSD, compatibility shims needed for FreeBSD 11 and earlier have been removed.
    </p>
    <p><!-- CL 407574 -->
      On Linux, additional <a href="/pkg/syscall/#CLONE_CLEAR_SIGHAND"><code>CLONE_*</code></a> constants
      are defined for use with the <a href="/pkg/syscall/#SysProcAttr.Cloneflags"><code>SysProcAttr.Cloneflags</code></a> field.
    </p>
    <p><!-- CL 417695 -->
      On Linux, the new <a href="/pkg/syscall/#SysProcAttr.CgroupFD"><code>SysProcAttr.CgroupFD</code></a>
      and <a href="/pkg/syscall/#SysProcAttr.UseCgroupFD"><code>SysProcAttr.UseCgroupFD</code></a> fields
      provide a way to place a child process into a specific cgroup.
    </p>
  </dd>
</dl><!-- syscall -->

<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/43620, CL 420254 -->
      The new method <a href="/pkg/testing/#B.Elapsed"><code>B.Elapsed</code></a>
      reports the current elapsed time of the benchmark, which may be useful for
      calculating rates to report with <code>ReportMetric</code>.
    </p>
  </dd>
</dl><!-- testing -->

<dl id="time"><dt><a href="/pkg/time/">time</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/52746, CL 412495 -->
      The new time layout constants <a href="/pkg/time/#DateTime"><code>DateTime</code></a>,
      <a href="/pkg/time/#DateOnly"><code>DateOnly</code></a>, and
      <a href="/pkg/time/#TimeOnly"><code>TimeOnly</code></a>
      provide names for three of the most common layout strings used in a survey of public Go source code.
    </p>

    <p><!-- CL 382734, https://go.dev/issue/50770 -->
      The new <a href="/pkg/time/#Time.Compare"><code>Time.Compare</code></a> method
      compares two times.
    </p>

    <p><!-- CL 425037 -->
      <a href="/pkg/time/#Parse"><code>Parse</code></a>
      now ignores sub-nanosecond precision in its input,
      instead of reporting those digits as an error.
    </p>

    <p><!-- CL 444277 -->
      The <a href="/pkg/time/#Time.MarshalJSON"><code>Time.MarshalJSON</code></a> and
      <a href="/pkg/time/#Time.UnmarshalJSON"><code>Time.UnmarshalJSON</code></a> methods
      are now more strict about adherence to RFC 3339.
    </p>
  </dd>
</dl><!-- time -->

<dl id="unicode/utf16"><dt><a href="/pkg/unicode/utf16/">unicode/utf16</a></dt>
  <dd>
    <p><!-- https://go.dev/issue/51896, CL 409054 -->
      The new  <a href="/pkg/unicode/utf16/#AppendRune"><code>AppendRune</code></a>
      function appends the UTF-16 encoding of a given rune to a uint16 slice,
      analogous to <a href="/pkg/unicode/utf8/#AppendRune"><code>utf8.AppendRune</code></a>.
    </p>
  </dd>
</dl><!-- unicode/utf16 -->

<!-- Silence false positives from x/build/cmd/relnote: -->
<!-- https://go.dev/issue/45964 was documented in Go 1.18 release notes but closed recently -->
<!-- https://go.dev/issue/52114 is an accepted proposal to add golang.org/x/net/http2.Transport.DialTLSContext; it's not a part of the Go release -->
<!-- CL 431335: cmd/api: make check pickier about api/*.txt -->
<!-- CL 447896 api: add newline to 55301.txt; modified api/next/55301.txt -->
<!-- CL 449215 api/next/54299: add missing newline; modified api/next/54299.txt -->
<!-- CL 433057 cmd: update vendored golang.org/x/tools for multiple error wrapping -->
<!-- CL 423362 crypto/internal/boring: update to newer boringcrypto, add arm64 -->
<!-- https://go.dev/issue/53481 x/cryptobyte ReadUint64, AddUint64 -->
<!-- https://go.dev/issue/51994 x/crypto/ssh -->
<!-- https://go.dev/issue/55358 x/exp/slices -->
<!-- https://go.dev/issue/54714 x/sys/unix -->
<!-- https://go.dev/issue/50035 https://go.dev/issue/54237 x/time/rate -->
<!-- CL 421879: cmd/cgo: add and use runtime/cgo.Incomplete instead of //go:notinheap -->
<!-- https://go.dev/issue/46731: replace `//go:notinheap` with runtime/internal/sys.NotInHeap -->
<!-- CL 345488 strconv optimization -->
<!-- CL 428757 reflect deprecation, rolled back -->
<!-- https://go.dev/issue/49390 compile -l -N is fully supported -->
<!-- https://go.dev/issue/54619 x/tools -->
<!-- CL 448898 reverted -->
<!-- https://go.dev/issue/54850 x/net/http2 Transport.MaxReadFrameSize -->
<!-- https://go.dev/issue/56054 x/net/http2 SETTINGS_HEADER_TABLE_SIZE -->
<!-- CL 450375 reverted -->