mirror of
https://github.com/golang/go.git
synced 2026-02-06 10:55:05 +03:00
Compare commits
10 Commits
dev.inline
...
dev.boring
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72237f94a4 | ||
|
|
6f12eb26e4 | ||
|
|
40eb21944e | ||
|
|
34a363c12e | ||
|
|
0ced72fe8b | ||
|
|
418403e7ac | ||
|
|
61246509aa | ||
|
|
e1425b300e | ||
|
|
e52cc9d0fd | ||
|
|
2fb6bf8a4a |
2
.github/ISSUE_TEMPLATE/01-pkgsite.md
vendored
2
.github/ISSUE_TEMPLATE/01-pkgsite.md
vendored
@@ -34,8 +34,6 @@ Please paste a screenshot of the page.
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
If possible, provide a recipe for reproducing the error.
|
If possible, provide a recipe for reproducing the error.
|
||||||
|
|
||||||
Starting with a Private/Incognito tab/window may help rule out problematic browser extensions.
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/02-pkgsite-removal.md
vendored
2
.github/ISSUE_TEMPLATE/02-pkgsite-removal.md
vendored
@@ -2,7 +2,7 @@
|
|||||||
name: Pkg.go.dev package removal request
|
name: Pkg.go.dev package removal request
|
||||||
about: Request a package be removed from the documentation site (pkg.go.dev)
|
about: Request a package be removed from the documentation site (pkg.go.dev)
|
||||||
title: "x/pkgsite: package removal request for [type path here]"
|
title: "x/pkgsite: package removal request for [type path here]"
|
||||||
labels: pkgsite/package-removal
|
labels: pkgsite
|
||||||
---
|
---
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|||||||
51
.github/ISSUE_TEMPLATE/04-vuln.md
vendored
51
.github/ISSUE_TEMPLATE/04-vuln.md
vendored
@@ -1,51 +0,0 @@
|
|||||||
---
|
|
||||||
name: Go vulnerability management - bugs and feature requests
|
|
||||||
about: Issues or feature requests about Go vulnerability management
|
|
||||||
title: "x/vuln: "
|
|
||||||
labels: "vulncheck or vulndb"
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Please answer these questions before submitting your issue. Thanks!
|
|
||||||
|
|
||||||
To add a new vulnerability to the Go vulnerability database
|
|
||||||
(https://vuln.go.dev), see https://go.dev/s/vulndb-report-new.
|
|
||||||
|
|
||||||
To report an issue about a report, see https://go.dev/s/vulndb-report-feedback.
|
|
||||||
-->
|
|
||||||
|
|
||||||
### What version of Go are you using (`go version`)?
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ go version
|
|
||||||
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
### Does this issue reproduce at the latest version of golang.org/x/vuln?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### What operating system and processor architecture are you using (`go env`)?
|
|
||||||
|
|
||||||
<details><summary><code>go env</code> Output</summary><br><pre>
|
|
||||||
$ go env
|
|
||||||
|
|
||||||
</pre></details>
|
|
||||||
|
|
||||||
### What did you do?
|
|
||||||
|
|
||||||
<!--
|
|
||||||
If possible, provide a recipe for reproducing the error.
|
|
||||||
A complete runnable program is good.
|
|
||||||
A link on go.dev/play is best.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### What did you expect to see?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### What did you see instead?
|
|
||||||
|
|
||||||
|
|
||||||
2
.github/SUPPORT.md
vendored
2
.github/SUPPORT.md
vendored
@@ -1,5 +1,5 @@
|
|||||||
Unlike many projects on GitHub, the Go project does not use its bug tracker for general discussion or asking questions.
|
Unlike many projects on GitHub, the Go project does not use its bug tracker for general discussion or asking questions.
|
||||||
We only use our bug tracker for tracking bugs and tracking proposals going through the [Proposal Process](https://go.dev/s/proposal-process).
|
We only use our bug tracker for tracking bugs and tracking proposals going through the [Proposal Process](https://golang.org/s/proposal-process).
|
||||||
|
|
||||||
For asking questions, see:
|
For asking questions, see:
|
||||||
|
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -33,13 +33,13 @@ _testmain.go
|
|||||||
/src/cmd/cgo/zdefaultcc.go
|
/src/cmd/cgo/zdefaultcc.go
|
||||||
/src/cmd/dist/dist
|
/src/cmd/dist/dist
|
||||||
/src/cmd/go/internal/cfg/zdefaultcc.go
|
/src/cmd/go/internal/cfg/zdefaultcc.go
|
||||||
|
/src/cmd/go/internal/cfg/zosarch.go
|
||||||
/src/cmd/internal/objabi/zbootstrap.go
|
/src/cmd/internal/objabi/zbootstrap.go
|
||||||
/src/go/build/zcgo.go
|
/src/go/build/zcgo.go
|
||||||
/src/go/doc/headscan
|
/src/go/doc/headscan
|
||||||
/src/internal/buildcfg/zbootstrap.go
|
/src/internal/buildcfg/zbootstrap.go
|
||||||
/src/runtime/internal/sys/zversion.go
|
/src/runtime/internal/sys/zversion.go
|
||||||
/src/unicode/maketables
|
/src/unicode/maketables
|
||||||
/src/time/tzdata/zzipdata.go
|
|
||||||
/test.out
|
/test.out
|
||||||
/test/garbage/*.out
|
/test/garbage/*.out
|
||||||
/test/pass.out
|
/test/pass.out
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Otherwise, when filing an issue, make sure to answer these five questions:
|
|||||||
4. What did you expect to see?
|
4. What did you expect to see?
|
||||||
5. What did you see instead?
|
5. What did you see instead?
|
||||||
|
|
||||||
For change proposals, see [Proposing Changes To Go](https://go.dev/s/proposal-process).
|
For change proposals, see [Proposing Changes To Go](https://github.com/golang/proposal/).
|
||||||
|
|
||||||
## Contributing code
|
## Contributing code
|
||||||
|
|
||||||
|
|||||||
2862
CONTRIBUTORS
Normal file
2862
CONTRIBUTORS
Normal file
File diff suppressed because it is too large
Load Diff
24
README.boringcrypto.md
Normal file
24
README.boringcrypto.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# dev.boringcrypto branch
|
||||||
|
|
||||||
|
This branch is no more. `GOEXPERIMENT=boringcrypto` on the standard branch does the job now.
|
||||||
|
|
||||||
|
Previous notice:
|
||||||
|
|
||||||
|
We have been working inside Google on a fork of Go that uses
|
||||||
|
BoringCrypto (the core of [BoringSSL][]) for various crypto
|
||||||
|
primitives, in furtherance of some [work related to FIPS 140-2][sp].
|
||||||
|
We have heard that some external users of Go would be interested in
|
||||||
|
this code as well, so this branch holds the patches to make Go use
|
||||||
|
BoringCrypto.
|
||||||
|
|
||||||
|
[BoringSSL]: https://boringssl.googlesource.com/boringssl/
|
||||||
|
[sp]: https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp3678.pdf
|
||||||
|
|
||||||
|
Unlike typical dev branches, we do not intend any eventual merge of
|
||||||
|
this code into the master branch. Instead we intend to maintain in
|
||||||
|
this branch the latest release plus BoringCrypto patches.
|
||||||
|
|
||||||
|
To be clear, we are not making any statements or representations about
|
||||||
|
the suitability of this code in relation to the FIPS 140-2 standard.
|
||||||
|
Interested users will have to evaluate for themselves whether the code
|
||||||
|
is useful for their own purposes.
|
||||||
@@ -4,7 +4,7 @@ Go is an open source programming language that makes it easy to build simple,
|
|||||||
reliable, and efficient software.
|
reliable, and efficient software.
|
||||||
|
|
||||||

|

|
||||||
*Gopher image by [Renee French][rf], licensed under [Creative Commons 4.0 Attributions license][cc4-by].*
|
*Gopher image by [Renee French][rf], licensed under [Creative Commons 3.0 Attributions license][cc3-by].*
|
||||||
|
|
||||||
Our canonical Git repository is located at https://go.googlesource.com/go.
|
Our canonical Git repository is located at https://go.googlesource.com/go.
|
||||||
There is a mirror of the repository at https://github.com/golang/go.
|
There is a mirror of the repository at https://github.com/golang/go.
|
||||||
@@ -39,4 +39,4 @@ proposals only. See https://go.dev/wiki/Questions for a list of
|
|||||||
places to ask questions about the Go language.
|
places to ask questions about the Go language.
|
||||||
|
|
||||||
[rf]: https://reneefrench.blogspot.com/
|
[rf]: https://reneefrench.blogspot.com/
|
||||||
[cc4-by]: https://creativecommons.org/licenses/by/4.0/
|
[cc3-by]: https://creativecommons.org/licenses/by/3.0/
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
pkg crypto/tls, type ConnectionState struct, TLSUnique //deprecated
|
|
||||||
pkg debug/elf, const R_PPC64_SECTOFF_LO_DS = 61
|
|
||||||
pkg encoding/json, method (*RawMessage) MarshalJSON() ([]uint8, error)
|
pkg encoding/json, method (*RawMessage) MarshalJSON() ([]uint8, error)
|
||||||
pkg math, const MaxFloat64 = 1.79769e+308 // 179769313486231570814527423731704356798100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
pkg math, const MaxFloat64 = 1.79769e+308 // 179769313486231570814527423731704356798100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||||
pkg math, const SmallestNonzeroFloat32 = 1.4013e-45 // 17516230804060213386546619791123951641/12500000000000000000000000000000000000000000000000000000000000000000000000000000000
|
pkg math, const SmallestNonzeroFloat32 = 1.4013e-45 // 17516230804060213386546619791123951641/12500000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||||
@@ -502,7 +500,6 @@ pkg text/template/parse, type Node interface { Copy, String, Type }
|
|||||||
pkg unicode, const Version = "10.0.0"
|
pkg unicode, const Version = "10.0.0"
|
||||||
pkg unicode, const Version = "11.0.0"
|
pkg unicode, const Version = "11.0.0"
|
||||||
pkg unicode, const Version = "12.0.0"
|
pkg unicode, const Version = "12.0.0"
|
||||||
pkg unicode, const Version = "13.0.0"
|
|
||||||
pkg unicode, const Version = "6.2.0"
|
pkg unicode, const Version = "6.2.0"
|
||||||
pkg unicode, const Version = "6.3.0"
|
pkg unicode, const Version = "6.3.0"
|
||||||
pkg unicode, const Version = "7.0.0"
|
pkg unicode, const Version = "7.0.0"
|
||||||
@@ -510,91 +507,3 @@ pkg unicode, const Version = "8.0.0"
|
|||||||
pkg unicode, const Version = "9.0.0"
|
pkg unicode, const Version = "9.0.0"
|
||||||
pkg html/template, method (*Template) Funcs(FuncMap) *Template
|
pkg html/template, method (*Template) Funcs(FuncMap) *Template
|
||||||
pkg html/template, type FuncMap map[string]interface{}
|
pkg html/template, type FuncMap map[string]interface{}
|
||||||
pkg syscall (freebsd-386), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-386), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-386), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-386), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-386), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-386), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-386), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-386), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-386), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-386), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-386), const SYS_STATFS = 396
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-386-cgo), const SYS_STATFS = 396
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-amd64), const SYS_STATFS = 396
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-amd64-cgo), const SYS_STATFS = 396
|
|
||||||
pkg syscall (freebsd-arm), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-arm), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-arm), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-arm), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-arm), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-arm), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-arm), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-arm), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-arm), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm), const SYS_STATFS = 396
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm-cgo), const SYS_STATFS = 396
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm64), const SYS_STATFS = 396
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_FSTAT = 189
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_FSTATAT = 493
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_FSTATFS = 397
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_GETDIRENTRIES = 196
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_GETFSSTAT = 395
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_LSTAT = 190
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_LSTAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_MKNODAT = 498
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_STAT = 188
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_STAT ideal-int
|
|
||||||
pkg syscall (freebsd-arm64-cgo), const SYS_STATFS = 396
|
|
||||||
|
|||||||
8717
api/go1.14.txt
8717
api/go1.14.txt
File diff suppressed because it is too large
Load Diff
8026
api/go1.16.txt
8026
api/go1.16.txt
File diff suppressed because it is too large
Load Diff
@@ -69,12 +69,6 @@ pkg math (darwin-amd64), const MinInt = -9223372036854775808
|
|||||||
pkg math (darwin-amd64-cgo), const MaxInt = 9223372036854775807
|
pkg math (darwin-amd64-cgo), const MaxInt = 9223372036854775807
|
||||||
pkg math (darwin-amd64-cgo), const MaxUint = 18446744073709551615
|
pkg math (darwin-amd64-cgo), const MaxUint = 18446744073709551615
|
||||||
pkg math (darwin-amd64-cgo), const MinInt = -9223372036854775808
|
pkg math (darwin-amd64-cgo), const MinInt = -9223372036854775808
|
||||||
pkg math (darwin-arm64), const MaxInt = 9223372036854775807
|
|
||||||
pkg math (darwin-arm64), const MaxUint = 18446744073709551615
|
|
||||||
pkg math (darwin-arm64), const MinInt = -9223372036854775808
|
|
||||||
pkg math (darwin-arm64-cgo), const MaxInt = 9223372036854775807
|
|
||||||
pkg math (darwin-arm64-cgo), const MaxUint = 18446744073709551615
|
|
||||||
pkg math (darwin-arm64-cgo), const MinInt = -9223372036854775808
|
|
||||||
pkg math (freebsd-386), const MaxInt = 2147483647
|
pkg math (freebsd-386), const MaxInt = 2147483647
|
||||||
pkg math (freebsd-386), const MaxUint = 4294967295
|
pkg math (freebsd-386), const MaxUint = 4294967295
|
||||||
pkg math (freebsd-386), const MinInt = -2147483648
|
pkg math (freebsd-386), const MinInt = -2147483648
|
||||||
@@ -93,12 +87,6 @@ pkg math (freebsd-arm), const MinInt = -2147483648
|
|||||||
pkg math (freebsd-arm-cgo), const MaxInt = 2147483647
|
pkg math (freebsd-arm-cgo), const MaxInt = 2147483647
|
||||||
pkg math (freebsd-arm-cgo), const MaxUint = 4294967295
|
pkg math (freebsd-arm-cgo), const MaxUint = 4294967295
|
||||||
pkg math (freebsd-arm-cgo), const MinInt = -2147483648
|
pkg math (freebsd-arm-cgo), const MinInt = -2147483648
|
||||||
pkg math (freebsd-arm64), const MaxInt = 9223372036854775807
|
|
||||||
pkg math (freebsd-arm64), const MaxUint = 18446744073709551615
|
|
||||||
pkg math (freebsd-arm64), const MinInt = -9223372036854775808
|
|
||||||
pkg math (freebsd-arm64-cgo), const MaxInt = 9223372036854775807
|
|
||||||
pkg math (freebsd-arm64-cgo), const MaxUint = 18446744073709551615
|
|
||||||
pkg math (freebsd-arm64-cgo), const MinInt = -9223372036854775808
|
|
||||||
pkg math (linux-386), const MaxInt = 2147483647
|
pkg math (linux-386), const MaxInt = 2147483647
|
||||||
pkg math (linux-386), const MaxUint = 4294967295
|
pkg math (linux-386), const MaxUint = 4294967295
|
||||||
pkg math (linux-386), const MinInt = -2147483648
|
pkg math (linux-386), const MinInt = -2147483648
|
||||||
@@ -174,15 +162,10 @@ pkg reflect, func VisibleFields(Type) []StructField
|
|||||||
pkg reflect, method (Method) IsExported() bool
|
pkg reflect, method (Method) IsExported() bool
|
||||||
pkg reflect, method (StructField) IsExported() bool
|
pkg reflect, method (StructField) IsExported() bool
|
||||||
pkg reflect, method (Value) CanConvert(Type) bool
|
pkg reflect, method (Value) CanConvert(Type) bool
|
||||||
pkg reflect, method (Value) InterfaceData //deprecated
|
|
||||||
pkg runtime/cgo (darwin-amd64-cgo), func NewHandle(interface{}) Handle
|
pkg runtime/cgo (darwin-amd64-cgo), func NewHandle(interface{}) Handle
|
||||||
pkg runtime/cgo (darwin-amd64-cgo), method (Handle) Delete()
|
pkg runtime/cgo (darwin-amd64-cgo), method (Handle) Delete()
|
||||||
pkg runtime/cgo (darwin-amd64-cgo), method (Handle) Value() interface{}
|
pkg runtime/cgo (darwin-amd64-cgo), method (Handle) Value() interface{}
|
||||||
pkg runtime/cgo (darwin-amd64-cgo), type Handle uintptr
|
pkg runtime/cgo (darwin-amd64-cgo), type Handle uintptr
|
||||||
pkg runtime/cgo (darwin-arm64-cgo), func NewHandle(interface{}) Handle
|
|
||||||
pkg runtime/cgo (darwin-arm64-cgo), method (Handle) Delete()
|
|
||||||
pkg runtime/cgo (darwin-arm64-cgo), method (Handle) Value() interface{}
|
|
||||||
pkg runtime/cgo (darwin-arm64-cgo), type Handle uintptr
|
|
||||||
pkg runtime/cgo (freebsd-386-cgo), func NewHandle(interface{}) Handle
|
pkg runtime/cgo (freebsd-386-cgo), func NewHandle(interface{}) Handle
|
||||||
pkg runtime/cgo (freebsd-386-cgo), method (Handle) Delete()
|
pkg runtime/cgo (freebsd-386-cgo), method (Handle) Delete()
|
||||||
pkg runtime/cgo (freebsd-386-cgo), method (Handle) Value() interface{}
|
pkg runtime/cgo (freebsd-386-cgo), method (Handle) Value() interface{}
|
||||||
@@ -195,10 +178,6 @@ pkg runtime/cgo (freebsd-arm-cgo), func NewHandle(interface{}) Handle
|
|||||||
pkg runtime/cgo (freebsd-arm-cgo), method (Handle) Delete()
|
pkg runtime/cgo (freebsd-arm-cgo), method (Handle) Delete()
|
||||||
pkg runtime/cgo (freebsd-arm-cgo), method (Handle) Value() interface{}
|
pkg runtime/cgo (freebsd-arm-cgo), method (Handle) Value() interface{}
|
||||||
pkg runtime/cgo (freebsd-arm-cgo), type Handle uintptr
|
pkg runtime/cgo (freebsd-arm-cgo), type Handle uintptr
|
||||||
pkg runtime/cgo (freebsd-arm64-cgo), func NewHandle(interface{}) Handle
|
|
||||||
pkg runtime/cgo (freebsd-arm64-cgo), method (Handle) Delete()
|
|
||||||
pkg runtime/cgo (freebsd-arm64-cgo), method (Handle) Value() interface{}
|
|
||||||
pkg runtime/cgo (freebsd-arm64-cgo), type Handle uintptr
|
|
||||||
pkg runtime/cgo (linux-386-cgo), func NewHandle(interface{}) Handle
|
pkg runtime/cgo (linux-386-cgo), func NewHandle(interface{}) Handle
|
||||||
pkg runtime/cgo (linux-386-cgo), method (Handle) Delete()
|
pkg runtime/cgo (linux-386-cgo), method (Handle) Delete()
|
||||||
pkg runtime/cgo (linux-386-cgo), method (Handle) Value() interface{}
|
pkg runtime/cgo (linux-386-cgo), method (Handle) Value() interface{}
|
||||||
@@ -278,14 +257,8 @@ pkg syscall (openbsd-amd64), const MSG_CMSG_CLOEXEC = 2048
|
|||||||
pkg syscall (openbsd-amd64), const MSG_CMSG_CLOEXEC ideal-int
|
pkg syscall (openbsd-amd64), const MSG_CMSG_CLOEXEC ideal-int
|
||||||
pkg syscall (openbsd-amd64-cgo), const MSG_CMSG_CLOEXEC = 2048
|
pkg syscall (openbsd-amd64-cgo), const MSG_CMSG_CLOEXEC = 2048
|
||||||
pkg syscall (openbsd-amd64-cgo), const MSG_CMSG_CLOEXEC ideal-int
|
pkg syscall (openbsd-amd64-cgo), const MSG_CMSG_CLOEXEC ideal-int
|
||||||
pkg syscall (windows-386), func CreateIoCompletionPort //deprecated
|
|
||||||
pkg syscall (windows-386), func GetQueuedCompletionStatus //deprecated
|
|
||||||
pkg syscall (windows-386), func PostQueuedCompletionStatus //deprecated
|
|
||||||
pkg syscall (windows-386), type SysProcAttr struct, AdditionalInheritedHandles []Handle
|
pkg syscall (windows-386), type SysProcAttr struct, AdditionalInheritedHandles []Handle
|
||||||
pkg syscall (windows-386), type SysProcAttr struct, ParentProcess Handle
|
pkg syscall (windows-386), type SysProcAttr struct, ParentProcess Handle
|
||||||
pkg syscall (windows-amd64), func CreateIoCompletionPort //deprecated
|
|
||||||
pkg syscall (windows-amd64), func GetQueuedCompletionStatus //deprecated
|
|
||||||
pkg syscall (windows-amd64), func PostQueuedCompletionStatus //deprecated
|
|
||||||
pkg syscall (windows-amd64), type SysProcAttr struct, AdditionalInheritedHandles []Handle
|
pkg syscall (windows-amd64), type SysProcAttr struct, AdditionalInheritedHandles []Handle
|
||||||
pkg syscall (windows-amd64), type SysProcAttr struct, ParentProcess Handle
|
pkg syscall (windows-amd64), type SysProcAttr struct, ParentProcess Handle
|
||||||
pkg testing, method (*B) Setenv(string, string)
|
pkg testing, method (*B) Setenv(string, string)
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
pkg bufio, method (*Writer) AvailableBuffer() []uint8
|
pkg bufio, method (*Writer) AvailableBuffer() []uint8
|
||||||
pkg bufio, method (ReadWriter) AvailableBuffer() []uint8
|
pkg bufio, method (ReadWriter) AvailableBuffer() []uint8
|
||||||
pkg bytes, func Cut([]uint8, []uint8) ([]uint8, []uint8, bool)
|
pkg bytes, func Cut([]uint8, []uint8) ([]uint8, []uint8, bool)
|
||||||
pkg bytes, func Title //deprecated
|
|
||||||
pkg crypto/tls, method (*Conn) NetConn() net.Conn
|
pkg crypto/tls, method (*Conn) NetConn() net.Conn
|
||||||
pkg crypto/tls, type Config struct, PreferServerCipherSuites //deprecated
|
|
||||||
pkg crypto/x509, method (*CertPool) Subjects //deprecated
|
|
||||||
pkg debug/buildinfo, func Read(io.ReaderAt) (*debug.BuildInfo, error)
|
pkg debug/buildinfo, func Read(io.ReaderAt) (*debug.BuildInfo, error)
|
||||||
pkg debug/buildinfo, func ReadFile(string) (*debug.BuildInfo, error)
|
pkg debug/buildinfo, func ReadFile(string) (*debug.BuildInfo, error)
|
||||||
pkg debug/buildinfo, type BuildInfo = debug.BuildInfo
|
pkg debug/buildinfo, type BuildInfo = debug.BuildInfo
|
||||||
pkg debug/dwarf, type BasicType struct, DataBitOffset int64
|
|
||||||
pkg debug/dwarf, type StructField struct, DataBitOffset int64
|
|
||||||
pkg debug/elf, const R_PPC64_RELATIVE = 22
|
pkg debug/elf, const R_PPC64_RELATIVE = 22
|
||||||
pkg debug/elf, const R_PPC64_RELATIVE R_PPC64
|
pkg debug/elf, const R_PPC64_RELATIVE R_PPC64
|
||||||
|
pkg debug/dwarf, type BasicType struct, DataBitOffset int64
|
||||||
|
pkg debug/dwarf, type StructField struct, DataBitOffset int64
|
||||||
pkg debug/plan9obj, var ErrNoSymbols error
|
pkg debug/plan9obj, var ErrNoSymbols error
|
||||||
pkg go/ast, method (*IndexListExpr) End() token.Pos
|
pkg go/ast, method (*IndexListExpr) End() token.Pos
|
||||||
pkg go/ast, method (*IndexListExpr) Pos() token.Pos
|
pkg go/ast, method (*IndexListExpr) Pos() token.Pos
|
||||||
@@ -27,7 +24,6 @@ pkg go/token, const TILDE = 88
|
|||||||
pkg go/token, const TILDE Token
|
pkg go/token, const TILDE Token
|
||||||
pkg go/types, func Instantiate(*Context, Type, []Type, bool) (Type, error)
|
pkg go/types, func Instantiate(*Context, Type, []Type, bool) (Type, error)
|
||||||
pkg go/types, func NewContext() *Context
|
pkg go/types, func NewContext() *Context
|
||||||
pkg go/types, func NewSignature //deprecated
|
|
||||||
pkg go/types, func NewSignatureType(*Var, []*TypeParam, []*TypeParam, *Tuple, *Tuple, bool) *Signature
|
pkg go/types, func NewSignatureType(*Var, []*TypeParam, []*TypeParam, *Tuple, *Tuple, bool) *Signature
|
||||||
pkg go/types, func NewTerm(bool, Type) *Term
|
pkg go/types, func NewTerm(bool, Type) *Term
|
||||||
pkg go/types, func NewTypeParam(*TypeName, Type) *TypeParam
|
pkg go/types, func NewTypeParam(*TypeName, Type) *TypeParam
|
||||||
@@ -85,7 +81,6 @@ pkg net, method (*UDPConn) ReadFromUDPAddrPort([]uint8) (int, netip.AddrPort, er
|
|||||||
pkg net, method (*UDPConn) ReadMsgUDPAddrPort([]uint8, []uint8) (int, int, int, netip.AddrPort, error)
|
pkg net, method (*UDPConn) ReadMsgUDPAddrPort([]uint8, []uint8) (int, int, int, netip.AddrPort, error)
|
||||||
pkg net, method (*UDPConn) WriteMsgUDPAddrPort([]uint8, []uint8, netip.AddrPort) (int, int, error)
|
pkg net, method (*UDPConn) WriteMsgUDPAddrPort([]uint8, []uint8, netip.AddrPort) (int, int, error)
|
||||||
pkg net, method (*UDPConn) WriteToUDPAddrPort([]uint8, netip.AddrPort) (int, error)
|
pkg net, method (*UDPConn) WriteToUDPAddrPort([]uint8, netip.AddrPort) (int, error)
|
||||||
pkg net, type Error interface, Temporary //deprecated
|
|
||||||
pkg net/http, func MaxBytesHandler(Handler, int64) Handler
|
pkg net/http, func MaxBytesHandler(Handler, int64) Handler
|
||||||
pkg net/http, method (*Cookie) Valid() error
|
pkg net/http, method (*Cookie) Valid() error
|
||||||
pkg net/netip, func AddrFrom16([16]uint8) Addr
|
pkg net/netip, func AddrFrom16([16]uint8) Addr
|
||||||
@@ -179,7 +174,6 @@ pkg runtime/debug, type BuildSetting struct, Key string
|
|||||||
pkg runtime/debug, type BuildSetting struct, Value string
|
pkg runtime/debug, type BuildSetting struct, Value string
|
||||||
pkg strings, func Clone(string) string
|
pkg strings, func Clone(string) string
|
||||||
pkg strings, func Cut(string, string) (string, string, bool)
|
pkg strings, func Cut(string, string) (string, string, bool)
|
||||||
pkg strings, func Title //deprecated
|
|
||||||
pkg sync, method (*Mutex) TryLock() bool
|
pkg sync, method (*Mutex) TryLock() bool
|
||||||
pkg sync, method (*RWMutex) TryLock() bool
|
pkg sync, method (*RWMutex) TryLock() bool
|
||||||
pkg sync, method (*RWMutex) TryRLock() bool
|
pkg sync, method (*RWMutex) TryRLock() bool
|
||||||
@@ -189,21 +183,7 @@ pkg syscall (freebsd-amd64), type SysProcAttr struct, Pdeathsig Signal
|
|||||||
pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Pdeathsig Signal
|
pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Pdeathsig Signal
|
||||||
pkg syscall (freebsd-arm), type SysProcAttr struct, Pdeathsig Signal
|
pkg syscall (freebsd-arm), type SysProcAttr struct, Pdeathsig Signal
|
||||||
pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Pdeathsig Signal
|
pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Pdeathsig Signal
|
||||||
pkg syscall (freebsd-arm64), type SysProcAttr struct, Pdeathsig Signal
|
|
||||||
pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Pdeathsig Signal
|
|
||||||
pkg syscall (windows-386), func Syscall //deprecated
|
|
||||||
pkg syscall (windows-386), func Syscall12 //deprecated
|
|
||||||
pkg syscall (windows-386), func Syscall15 //deprecated
|
|
||||||
pkg syscall (windows-386), func Syscall18 //deprecated
|
|
||||||
pkg syscall (windows-386), func Syscall6 //deprecated
|
|
||||||
pkg syscall (windows-386), func Syscall9 //deprecated
|
|
||||||
pkg syscall (windows-386), func SyscallN(uintptr, ...uintptr) (uintptr, uintptr, Errno)
|
pkg syscall (windows-386), func SyscallN(uintptr, ...uintptr) (uintptr, uintptr, Errno)
|
||||||
pkg syscall (windows-amd64), func Syscall //deprecated
|
|
||||||
pkg syscall (windows-amd64), func Syscall12 //deprecated
|
|
||||||
pkg syscall (windows-amd64), func Syscall15 //deprecated
|
|
||||||
pkg syscall (windows-amd64), func Syscall18 //deprecated
|
|
||||||
pkg syscall (windows-amd64), func Syscall6 //deprecated
|
|
||||||
pkg syscall (windows-amd64), func Syscall9 //deprecated
|
|
||||||
pkg syscall (windows-amd64), func SyscallN(uintptr, ...uintptr) (uintptr, uintptr, Errno)
|
pkg syscall (windows-amd64), func SyscallN(uintptr, ...uintptr) (uintptr, uintptr, Errno)
|
||||||
pkg testing, func MainStart(testDeps, []InternalTest, []InternalBenchmark, []InternalFuzzTarget, []InternalExample) *M
|
pkg testing, func MainStart(testDeps, []InternalTest, []InternalBenchmark, []InternalFuzzTarget, []InternalExample) *M
|
||||||
pkg testing, method (*F) Add(...interface{})
|
pkg testing, method (*F) Add(...interface{})
|
||||||
|
|||||||
309
api/go1.19.txt
309
api/go1.19.txt
@@ -1,309 +0,0 @@
|
|||||||
pkg crypto/x509, func ParseRevocationList([]uint8) (*RevocationList, error) #50674
|
|
||||||
pkg crypto/x509, method (*CertPool) Clone() *CertPool #35044
|
|
||||||
pkg crypto/x509, method (*CertPool) Equal(*CertPool) bool #46057
|
|
||||||
pkg crypto/x509, method (*RevocationList) CheckSignatureFrom(*Certificate) error #50674
|
|
||||||
pkg crypto/x509, type RevocationList struct, AuthorityKeyId []uint8 #50674
|
|
||||||
pkg crypto/x509, type RevocationList struct, Extensions []pkix.Extension #50674
|
|
||||||
pkg crypto/x509, type RevocationList struct, Issuer pkix.Name #50674
|
|
||||||
pkg crypto/x509, type RevocationList struct, Raw []uint8 #50674
|
|
||||||
pkg crypto/x509, type RevocationList struct, RawIssuer []uint8 #50674
|
|
||||||
pkg crypto/x509, type RevocationList struct, RawTBSRevocationList []uint8 #50674
|
|
||||||
pkg crypto/x509, type RevocationList struct, Signature []uint8 #50674
|
|
||||||
pkg debug/elf, const EM_LOONGARCH = 258 #46229
|
|
||||||
pkg debug/elf, const EM_LOONGARCH Machine #46229
|
|
||||||
pkg debug/elf, const R_LARCH_32 = 1 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_32 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_64 = 2 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_64 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD16 = 48 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD16 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD24 = 49 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD24 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD32 = 50 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD32 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD64 = 51 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD64 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD8 = 47 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_ADD8 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_COPY = 4 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_COPY R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_IRELATIVE = 12 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_IRELATIVE R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_JUMP_SLOT = 5 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_JUMP_SLOT R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_MARK_LA = 20 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_MARK_LA R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_MARK_PCREL = 21 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_MARK_PCREL R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_NONE = 0 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_NONE R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_RELATIVE = 3 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_RELATIVE R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_ADD = 35 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_ADD R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_AND = 36 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_AND R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_ASSERT = 30 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_ASSERT R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_IF_ELSE = 37 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_IF_ELSE R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_NOT = 31 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_NOT R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 = 45 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 = 44 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 = 40 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 = 41 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 = 42 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 = 38 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 = 43 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_U = 46 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_U R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 = 39 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE = 23 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_DUP = 24 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_DUP R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL = 25 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL = 22 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL = 29 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD = 28 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT = 27 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL = 26 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_SL = 33 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_SL R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_SR = 34 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_SR R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_SUB = 32 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SOP_SUB R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB16 = 53 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB16 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB24 = 54 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB24 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB32 = 55 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB32 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB64 = 56 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB64 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB8 = 52 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_SUB8 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPMOD32 = 6 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPMOD32 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPMOD64 = 7 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPMOD64 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPREL32 = 8 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPREL32 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPREL64 = 9 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_DTPREL64 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_TPREL32 = 10 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_TPREL32 R_LARCH #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_TPREL64 = 11 #46229
|
|
||||||
pkg debug/elf, const R_LARCH_TLS_TPREL64 R_LARCH #46229
|
|
||||||
pkg debug/elf, method (R_LARCH) GoString() string #46229
|
|
||||||
pkg debug/elf, method (R_LARCH) String() string #46229
|
|
||||||
pkg debug/elf, type R_LARCH int #46229
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY = 2 #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5 #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH = 4 #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST = 6 #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES = 1 #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE = 3 #51868
|
|
||||||
pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH32 = 25138 #46229
|
|
||||||
pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH32 ideal-int #46229
|
|
||||||
pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH64 = 25188 #46229
|
|
||||||
pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH64 ideal-int #46229
|
|
||||||
pkg debug/pe, const IMAGE_SCN_CNT_CODE = 32 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_CNT_CODE ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA = 64 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA = 128 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_LNK_COMDAT = 4096 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_LNK_COMDAT ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE = 33554432 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE = 536870912 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_READ = 1073741824 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_READ ideal-int #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_WRITE = 2147483648 #51868
|
|
||||||
pkg debug/pe, const IMAGE_SCN_MEM_WRITE ideal-int #51868
|
|
||||||
pkg debug/pe, method (*File) COFFSymbolReadSectionDefAux(int) (*COFFSymbolAuxFormat5, error) #51868
|
|
||||||
pkg debug/pe, type COFFSymbolAuxFormat5 struct #51868
|
|
||||||
pkg debug/pe, type COFFSymbolAuxFormat5 struct, Checksum uint32 #51868
|
|
||||||
pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumLineNumbers uint16 #51868
|
|
||||||
pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumRelocs uint16 #51868
|
|
||||||
pkg debug/pe, type COFFSymbolAuxFormat5 struct, SecNum uint16 #51868
|
|
||||||
pkg debug/pe, type COFFSymbolAuxFormat5 struct, Selection uint8 #51868
|
|
||||||
pkg debug/pe, type COFFSymbolAuxFormat5 struct, Size uint32 #51868
|
|
||||||
pkg encoding/binary, func AppendUvarint([]uint8, uint64) []uint8 #51644
|
|
||||||
pkg encoding/binary, func AppendVarint([]uint8, int64) []uint8 #51644
|
|
||||||
pkg encoding/binary, type AppendByteOrder interface { AppendUint16, AppendUint32, AppendUint64, String } #50601
|
|
||||||
pkg encoding/binary, type AppendByteOrder interface, AppendUint16([]uint8, uint16) []uint8 #50601
|
|
||||||
pkg encoding/binary, type AppendByteOrder interface, AppendUint32([]uint8, uint32) []uint8 #50601
|
|
||||||
pkg encoding/binary, type AppendByteOrder interface, AppendUint64([]uint8, uint64) []uint8 #50601
|
|
||||||
pkg encoding/binary, type AppendByteOrder interface, String() string #50601
|
|
||||||
pkg encoding/csv, method (*Reader) InputOffset() int64 #43401
|
|
||||||
pkg encoding/xml, method (*Decoder) InputPos() (int, int) #45628
|
|
||||||
pkg flag, func TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
|
|
||||||
pkg flag, method (*FlagSet) TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
|
|
||||||
pkg fmt, func Append([]uint8, ...interface{}) []uint8 #47579
|
|
||||||
pkg fmt, func Appendf([]uint8, string, ...interface{}) []uint8 #47579
|
|
||||||
pkg fmt, func Appendln([]uint8, ...interface{}) []uint8 #47579
|
|
||||||
pkg go/doc, method (*Package) HTML(string) []uint8 #51082
|
|
||||||
pkg go/doc, method (*Package) Markdown(string) []uint8 #51082
|
|
||||||
pkg go/doc, method (*Package) Parser() *comment.Parser #51082
|
|
||||||
pkg go/doc, method (*Package) Printer() *comment.Printer #51082
|
|
||||||
pkg go/doc, method (*Package) Synopsis(string) string #51082
|
|
||||||
pkg go/doc, method (*Package) Text(string) []uint8 #51082
|
|
||||||
pkg go/doc/comment, func DefaultLookupPackage(string) (string, bool) #51082
|
|
||||||
pkg go/doc/comment, method (*DocLink) DefaultURL(string) string #51082
|
|
||||||
pkg go/doc/comment, method (*Heading) DefaultID() string #51082
|
|
||||||
pkg go/doc/comment, method (*List) BlankBefore() bool #51082
|
|
||||||
pkg go/doc/comment, method (*List) BlankBetween() bool #51082
|
|
||||||
pkg go/doc/comment, method (*Parser) Parse(string) *Doc #51082
|
|
||||||
pkg go/doc/comment, method (*Printer) Comment(*Doc) []uint8 #51082
|
|
||||||
pkg go/doc/comment, method (*Printer) HTML(*Doc) []uint8 #51082
|
|
||||||
pkg go/doc/comment, method (*Printer) Markdown(*Doc) []uint8 #51082
|
|
||||||
pkg go/doc/comment, method (*Printer) Text(*Doc) []uint8 #51082
|
|
||||||
pkg go/doc/comment, type Block interface, unexported methods #51082
|
|
||||||
pkg go/doc/comment, type Code struct #51082
|
|
||||||
pkg go/doc/comment, type Code struct, Text string #51082
|
|
||||||
pkg go/doc/comment, type Doc struct #51082
|
|
||||||
pkg go/doc/comment, type Doc struct, Content []Block #51082
|
|
||||||
pkg go/doc/comment, type Doc struct, Links []*LinkDef #51082
|
|
||||||
pkg go/doc/comment, type DocLink struct #51082
|
|
||||||
pkg go/doc/comment, type DocLink struct, ImportPath string #51082
|
|
||||||
pkg go/doc/comment, type DocLink struct, Name string #51082
|
|
||||||
pkg go/doc/comment, type DocLink struct, Recv string #51082
|
|
||||||
pkg go/doc/comment, type DocLink struct, Text []Text #51082
|
|
||||||
pkg go/doc/comment, type Heading struct #51082
|
|
||||||
pkg go/doc/comment, type Heading struct, Text []Text #51082
|
|
||||||
pkg go/doc/comment, type Italic string #51082
|
|
||||||
pkg go/doc/comment, type Link struct #51082
|
|
||||||
pkg go/doc/comment, type Link struct, Auto bool #51082
|
|
||||||
pkg go/doc/comment, type Link struct, Text []Text #51082
|
|
||||||
pkg go/doc/comment, type Link struct, URL string #51082
|
|
||||||
pkg go/doc/comment, type LinkDef struct #51082
|
|
||||||
pkg go/doc/comment, type LinkDef struct, Text string #51082
|
|
||||||
pkg go/doc/comment, type LinkDef struct, URL string #51082
|
|
||||||
pkg go/doc/comment, type LinkDef struct, Used bool #51082
|
|
||||||
pkg go/doc/comment, type List struct #51082
|
|
||||||
pkg go/doc/comment, type List struct, ForceBlankBefore bool #51082
|
|
||||||
pkg go/doc/comment, type List struct, ForceBlankBetween bool #51082
|
|
||||||
pkg go/doc/comment, type List struct, Items []*ListItem #51082
|
|
||||||
pkg go/doc/comment, type ListItem struct #51082
|
|
||||||
pkg go/doc/comment, type ListItem struct, Content []Block #51082
|
|
||||||
pkg go/doc/comment, type ListItem struct, Number string #51082
|
|
||||||
pkg go/doc/comment, type Paragraph struct #51082
|
|
||||||
pkg go/doc/comment, type Paragraph struct, Text []Text #51082
|
|
||||||
pkg go/doc/comment, type Parser struct #51082
|
|
||||||
pkg go/doc/comment, type Parser struct, LookupPackage func(string) (string, bool) #51082
|
|
||||||
pkg go/doc/comment, type Parser struct, LookupSym func(string, string) bool #51082
|
|
||||||
pkg go/doc/comment, type Parser struct, Words map[string]string #51082
|
|
||||||
pkg go/doc/comment, type Plain string #51082
|
|
||||||
pkg go/doc/comment, type Printer struct #51082
|
|
||||||
pkg go/doc/comment, type Printer struct, DocLinkBaseURL string #51082
|
|
||||||
pkg go/doc/comment, type Printer struct, DocLinkURL func(*DocLink) string #51082
|
|
||||||
pkg go/doc/comment, type Printer struct, HeadingID func(*Heading) string #51082
|
|
||||||
pkg go/doc/comment, type Printer struct, HeadingLevel int #51082
|
|
||||||
pkg go/doc/comment, type Printer struct, TextCodePrefix string #51082
|
|
||||||
pkg go/doc/comment, type Printer struct, TextPrefix string #51082
|
|
||||||
pkg go/doc/comment, type Printer struct, TextWidth int #51082
|
|
||||||
pkg go/doc/comment, type Text interface, unexported methods #51082
|
|
||||||
pkg go/types, method (*Func) Origin() *Func #51682
|
|
||||||
pkg go/types, method (*Var) Origin() *Var #51682
|
|
||||||
pkg hash/maphash, func Bytes(Seed, []uint8) uint64 #42710
|
|
||||||
pkg hash/maphash, func String(Seed, string) uint64 #42710
|
|
||||||
pkg html/template, method (*Template) Funcs(template.FuncMap) *Template #46121
|
|
||||||
pkg html/template, type FuncMap = template.FuncMap #46121
|
|
||||||
pkg net/http, method (*MaxBytesError) Error() string #30715
|
|
||||||
pkg net/http, type MaxBytesError struct #30715
|
|
||||||
pkg net/http, type MaxBytesError struct, Limit int64 #30715
|
|
||||||
pkg net/url, func JoinPath(string, ...string) (string, error) #47005
|
|
||||||
pkg net/url, method (*URL) JoinPath(...string) *URL #47005
|
|
||||||
pkg net/url, type URL struct, OmitHost bool #46059
|
|
||||||
pkg os/exec, method (*Cmd) Environ() []string #50599
|
|
||||||
pkg os/exec, type Cmd struct, Err error #43724
|
|
||||||
pkg os/exec, var ErrDot error #43724
|
|
||||||
pkg regexp/syntax, const ErrNestingDepth = "expression nests too deeply" #51684
|
|
||||||
pkg regexp/syntax, const ErrNestingDepth ErrorCode #51684
|
|
||||||
pkg runtime/debug, func SetMemoryLimit(int64) int64 #48409
|
|
||||||
pkg sort, func Find(int, func(int) int) (int, bool) #50340
|
|
||||||
pkg sync/atomic, method (*Bool) CompareAndSwap(bool, bool) bool #50860
|
|
||||||
pkg sync/atomic, method (*Bool) Load() bool #50860
|
|
||||||
pkg sync/atomic, method (*Bool) Store(bool) #50860
|
|
||||||
pkg sync/atomic, method (*Bool) Swap(bool) bool #50860
|
|
||||||
pkg sync/atomic, method (*Int32) Add(int32) int32 #50860
|
|
||||||
pkg sync/atomic, method (*Int32) CompareAndSwap(int32, int32) bool #50860
|
|
||||||
pkg sync/atomic, method (*Int32) Load() int32 #50860
|
|
||||||
pkg sync/atomic, method (*Int32) Store(int32) #50860
|
|
||||||
pkg sync/atomic, method (*Int32) Swap(int32) int32 #50860
|
|
||||||
pkg sync/atomic, method (*Int64) Add(int64) int64 #50860
|
|
||||||
pkg sync/atomic, method (*Int64) CompareAndSwap(int64, int64) bool #50860
|
|
||||||
pkg sync/atomic, method (*Int64) Load() int64 #50860
|
|
||||||
pkg sync/atomic, method (*Int64) Store(int64) #50860
|
|
||||||
pkg sync/atomic, method (*Int64) Swap(int64) int64 #50860
|
|
||||||
pkg sync/atomic, method (*Pointer[$0]) CompareAndSwap(*$0, *$0) bool #50860
|
|
||||||
pkg sync/atomic, method (*Pointer[$0]) Load() *$0 #50860
|
|
||||||
pkg sync/atomic, method (*Pointer[$0]) Store(*$0) #50860
|
|
||||||
pkg sync/atomic, method (*Pointer[$0]) Swap(*$0) *$0 #50860
|
|
||||||
pkg sync/atomic, method (*Uint32) Add(uint32) uint32 #50860
|
|
||||||
pkg sync/atomic, method (*Uint32) CompareAndSwap(uint32, uint32) bool #50860
|
|
||||||
pkg sync/atomic, method (*Uint32) Load() uint32 #50860
|
|
||||||
pkg sync/atomic, method (*Uint32) Store(uint32) #50860
|
|
||||||
pkg sync/atomic, method (*Uint32) Swap(uint32) uint32 #50860
|
|
||||||
pkg sync/atomic, method (*Uint64) Add(uint64) uint64 #50860
|
|
||||||
pkg sync/atomic, method (*Uint64) CompareAndSwap(uint64, uint64) bool #50860
|
|
||||||
pkg sync/atomic, method (*Uint64) Load() uint64 #50860
|
|
||||||
pkg sync/atomic, method (*Uint64) Store(uint64) #50860
|
|
||||||
pkg sync/atomic, method (*Uint64) Swap(uint64) uint64 #50860
|
|
||||||
pkg sync/atomic, method (*Uintptr) Add(uintptr) uintptr #50860
|
|
||||||
pkg sync/atomic, method (*Uintptr) CompareAndSwap(uintptr, uintptr) bool #50860
|
|
||||||
pkg sync/atomic, method (*Uintptr) Load() uintptr #50860
|
|
||||||
pkg sync/atomic, method (*Uintptr) Store(uintptr) #50860
|
|
||||||
pkg sync/atomic, method (*Uintptr) Swap(uintptr) uintptr #50860
|
|
||||||
pkg sync/atomic, type Bool struct #50860
|
|
||||||
pkg sync/atomic, type Int32 struct #50860
|
|
||||||
pkg sync/atomic, type Int64 struct #50860
|
|
||||||
pkg sync/atomic, type Pointer[$0 interface{}] struct #50860
|
|
||||||
pkg sync/atomic, type Uint32 struct #50860
|
|
||||||
pkg sync/atomic, type Uint64 struct #50860
|
|
||||||
pkg sync/atomic, type Uintptr struct #50860
|
|
||||||
pkg time, method (Duration) Abs() Duration #51414
|
|
||||||
pkg time, method (Time) ZoneBounds() (Time, Time) #50062
|
|
||||||
pkg crypto/x509, func ParseCRL //deprecated #50674
|
|
||||||
pkg crypto/x509, func ParseDERCRL //deprecated #50674
|
|
||||||
pkg crypto/x509, method (*Certificate) CheckCRLSignature //deprecated #50674
|
|
||||||
pkg crypto/x509, method (*Certificate) CreateCRL //deprecated #50674
|
|
||||||
pkg crypto/x509/pkix, type CertificateList //deprecated #50674
|
|
||||||
pkg crypto/x509/pkix, type TBSCertificateList //deprecated #50674
|
|
||||||
pkg go/doc, func Synopsis //deprecated #51082
|
|
||||||
pkg go/doc, func ToHTML //deprecated #51082
|
|
||||||
pkg go/doc, func ToText //deprecated #51082
|
|
||||||
pkg io/ioutil, func NopCloser //deprecated #42026
|
|
||||||
pkg io/ioutil, func ReadAll //deprecated #42026
|
|
||||||
pkg io/ioutil, func ReadDir //deprecated #42026
|
|
||||||
pkg io/ioutil, func ReadFile //deprecated #42026
|
|
||||||
pkg io/ioutil, func TempDir //deprecated #42026
|
|
||||||
pkg io/ioutil, func TempFile //deprecated #42026
|
|
||||||
pkg io/ioutil, func WriteFile //deprecated #42026
|
|
||||||
pkg io/ioutil, var Discard //deprecated #42026
|
|
||||||
9165
api/go1.20.txt
9165
api/go1.20.txt
File diff suppressed because it is too large
Load Diff
421
api/go1.21.txt
421
api/go1.21.txt
@@ -1,421 +0,0 @@
|
|||||||
pkg bytes, func ContainsFunc([]uint8, func(int32) bool) bool #54386
|
|
||||||
pkg bytes, method (*Buffer) AvailableBuffer() []uint8 #53685
|
|
||||||
pkg bytes, method (*Buffer) Available() int #53685
|
|
||||||
pkg cmp, func Compare[$0 Ordered]($0, $0) int #59488
|
|
||||||
pkg cmp, func Less[$0 Ordered]($0, $0) bool #59488
|
|
||||||
pkg cmp, type Ordered interface {} #59488
|
|
||||||
pkg context, func AfterFunc(Context, func()) func() bool #57928
|
|
||||||
pkg context, func WithDeadlineCause(Context, time.Time, error) (Context, CancelFunc) #56661
|
|
||||||
pkg context, func WithoutCancel(Context) Context #40221
|
|
||||||
pkg context, func WithTimeoutCause(Context, time.Duration, error) (Context, CancelFunc) #56661
|
|
||||||
pkg crypto/elliptic, func GenerateKey //deprecated #52221
|
|
||||||
pkg crypto/elliptic, func Marshal //deprecated #52221
|
|
||||||
pkg crypto/elliptic, func Unmarshal //deprecated #52221
|
|
||||||
pkg crypto/elliptic, method (*CurveParams) Add //deprecated #34648
|
|
||||||
pkg crypto/elliptic, method (*CurveParams) Double //deprecated #34648
|
|
||||||
pkg crypto/elliptic, method (*CurveParams) IsOnCurve //deprecated #34648
|
|
||||||
pkg crypto/elliptic, method (*CurveParams) ScalarBaseMult //deprecated #34648
|
|
||||||
pkg crypto/elliptic, method (*CurveParams) ScalarMult //deprecated #34648
|
|
||||||
pkg crypto/elliptic, type Curve interface, Add //deprecated #52221
|
|
||||||
pkg crypto/elliptic, type Curve interface, Double //deprecated #52221
|
|
||||||
pkg crypto/elliptic, type Curve interface, IsOnCurve //deprecated #52221
|
|
||||||
pkg crypto/elliptic, type Curve interface, ScalarBaseMult //deprecated #52221
|
|
||||||
pkg crypto/elliptic, type Curve interface, ScalarMult //deprecated #52221
|
|
||||||
pkg crypto/rsa, func GenerateMultiPrimeKey //deprecated #56921
|
|
||||||
pkg crypto/rsa, type PrecomputedValues struct, CRTValues //deprecated #56921
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelApplication = 3 #44886
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelApplication QUICEncryptionLevel #44886
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelEarly = 1 #60107
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelEarly QUICEncryptionLevel #60107
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelHandshake = 2 #44886
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelHandshake QUICEncryptionLevel #44886
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelInitial = 0 #44886
|
|
||||||
pkg crypto/tls, const QUICEncryptionLevelInitial QUICEncryptionLevel #44886
|
|
||||||
pkg crypto/tls, const QUICHandshakeDone = 7 #44886
|
|
||||||
pkg crypto/tls, const QUICHandshakeDone QUICEventKind #44886
|
|
||||||
pkg crypto/tls, const QUICNoEvent = 0 #44886
|
|
||||||
pkg crypto/tls, const QUICNoEvent QUICEventKind #44886
|
|
||||||
pkg crypto/tls, const QUICRejectedEarlyData = 6 #60107
|
|
||||||
pkg crypto/tls, const QUICRejectedEarlyData QUICEventKind #60107
|
|
||||||
pkg crypto/tls, const QUICSetReadSecret = 1 #44886
|
|
||||||
pkg crypto/tls, const QUICSetReadSecret QUICEventKind #44886
|
|
||||||
pkg crypto/tls, const QUICSetWriteSecret = 2 #44886
|
|
||||||
pkg crypto/tls, const QUICSetWriteSecret QUICEventKind #44886
|
|
||||||
pkg crypto/tls, const QUICTransportParameters = 4 #44886
|
|
||||||
pkg crypto/tls, const QUICTransportParameters QUICEventKind #44886
|
|
||||||
pkg crypto/tls, const QUICTransportParametersRequired = 5 #44886
|
|
||||||
pkg crypto/tls, const QUICTransportParametersRequired QUICEventKind #44886
|
|
||||||
pkg crypto/tls, const QUICWriteData = 3 #44886
|
|
||||||
pkg crypto/tls, const QUICWriteData QUICEventKind #44886
|
|
||||||
pkg crypto/tls, func NewResumptionState([]uint8, *SessionState) (*ClientSessionState, error) #60105
|
|
||||||
pkg crypto/tls, func ParseSessionState([]uint8) (*SessionState, error) #60105
|
|
||||||
pkg crypto/tls, func QUICClient(*QUICConfig) *QUICConn #44886
|
|
||||||
pkg crypto/tls, func QUICServer(*QUICConfig) *QUICConn #44886
|
|
||||||
pkg crypto/tls, func VersionName(uint16) string #46308
|
|
||||||
pkg crypto/tls, method (AlertError) Error() string #44886
|
|
||||||
pkg crypto/tls, method (*ClientSessionState) ResumptionState() ([]uint8, *SessionState, error) #60105
|
|
||||||
pkg crypto/tls, method (*Config) DecryptTicket([]uint8, ConnectionState) (*SessionState, error) #60105
|
|
||||||
pkg crypto/tls, method (*Config) EncryptTicket(ConnectionState, *SessionState) ([]uint8, error) #60105
|
|
||||||
pkg crypto/tls, method (*QUICConn) Close() error #44886
|
|
||||||
pkg crypto/tls, method (*QUICConn) ConnectionState() ConnectionState #44886
|
|
||||||
pkg crypto/tls, method (*QUICConn) HandleData(QUICEncryptionLevel, []uint8) error #44886
|
|
||||||
pkg crypto/tls, method (*QUICConn) NextEvent() QUICEvent #44886
|
|
||||||
pkg crypto/tls, method (*QUICConn) SendSessionTicket(bool) error #60107
|
|
||||||
pkg crypto/tls, method (*QUICConn) SetTransportParameters([]uint8) #44886
|
|
||||||
pkg crypto/tls, method (*QUICConn) Start(context.Context) error #44886
|
|
||||||
pkg crypto/tls, method (QUICEncryptionLevel) String() string #44886
|
|
||||||
pkg crypto/tls, method (*SessionState) Bytes() ([]uint8, error) #60105
|
|
||||||
pkg crypto/tls, type AlertError uint8 #44886
|
|
||||||
pkg crypto/tls, type Config struct, UnwrapSession func([]uint8, ConnectionState) (*SessionState, error) #60105
|
|
||||||
pkg crypto/tls, type Config struct, WrapSession func(ConnectionState, *SessionState) ([]uint8, error) #60105
|
|
||||||
pkg crypto/tls, type QUICConfig struct #44886
|
|
||||||
pkg crypto/tls, type QUICConfig struct, TLSConfig *Config #44886
|
|
||||||
pkg crypto/tls, type QUICConn struct #44886
|
|
||||||
pkg crypto/tls, type QUICEncryptionLevel int #44886
|
|
||||||
pkg crypto/tls, type QUICEventKind int #44886
|
|
||||||
pkg crypto/tls, type QUICEvent struct #44886
|
|
||||||
pkg crypto/tls, type QUICEvent struct, Data []uint8 #44886
|
|
||||||
pkg crypto/tls, type QUICEvent struct, Kind QUICEventKind #44886
|
|
||||||
pkg crypto/tls, type QUICEvent struct, Level QUICEncryptionLevel #44886
|
|
||||||
pkg crypto/tls, type QUICEvent struct, Suite uint16 #44886
|
|
||||||
pkg crypto/tls, type SessionState struct #60105
|
|
||||||
pkg crypto/tls, type SessionState struct, EarlyData bool #60107
|
|
||||||
pkg crypto/tls, type SessionState struct, Extra [][]uint8 #60539
|
|
||||||
pkg crypto/x509, type RevocationListEntry struct #53573
|
|
||||||
pkg crypto/x509, type RevocationListEntry struct, Extensions []pkix.Extension #53573
|
|
||||||
pkg crypto/x509, type RevocationListEntry struct, ExtraExtensions []pkix.Extension #53573
|
|
||||||
pkg crypto/x509, type RevocationListEntry struct, Raw []uint8 #53573
|
|
||||||
pkg crypto/x509, type RevocationListEntry struct, ReasonCode int #53573
|
|
||||||
pkg crypto/x509, type RevocationListEntry struct, RevocationTime time.Time #53573
|
|
||||||
pkg crypto/x509, type RevocationListEntry struct, SerialNumber *big.Int #53573
|
|
||||||
pkg crypto/x509, type RevocationList struct, RevokedCertificateEntries []RevocationListEntry #53573
|
|
||||||
pkg crypto/x509, type RevocationList struct, RevokedCertificates //deprecated #53573
|
|
||||||
pkg debug/elf, const COMPRESS_ZSTD = 2 #55107
|
|
||||||
pkg debug/elf, const COMPRESS_ZSTD CompressionType #55107
|
|
||||||
pkg debug/elf, const DF_1_CONFALT = 8192 #56887
|
|
||||||
pkg debug/elf, const DF_1_CONFALT DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_DIRECT = 256 #56887
|
|
||||||
pkg debug/elf, const DF_1_DIRECT DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_DISPRELDNE = 32768 #56887
|
|
||||||
pkg debug/elf, const DF_1_DISPRELDNE DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_DISPRELPND = 65536 #56887
|
|
||||||
pkg debug/elf, const DF_1_DISPRELPND DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_EDITED = 2097152 #56887
|
|
||||||
pkg debug/elf, const DF_1_EDITED DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_ENDFILTEE = 16384 #56887
|
|
||||||
pkg debug/elf, const DF_1_ENDFILTEE DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_GLOBAL = 2 #56887
|
|
||||||
pkg debug/elf, const DF_1_GLOBAL DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_GLOBAUDIT = 16777216 #56887
|
|
||||||
pkg debug/elf, const DF_1_GLOBAUDIT DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_GROUP = 4 #56887
|
|
||||||
pkg debug/elf, const DF_1_GROUP DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_IGNMULDEF = 262144 #56887
|
|
||||||
pkg debug/elf, const DF_1_IGNMULDEF DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_INITFIRST = 32 #56887
|
|
||||||
pkg debug/elf, const DF_1_INITFIRST DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_INTERPOSE = 1024 #56887
|
|
||||||
pkg debug/elf, const DF_1_INTERPOSE DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_KMOD = 268435456 #56887
|
|
||||||
pkg debug/elf, const DF_1_KMOD DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_LOADFLTR = 16 #56887
|
|
||||||
pkg debug/elf, const DF_1_LOADFLTR DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOCOMMON = 1073741824 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOCOMMON DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODEFLIB = 2048 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODEFLIB DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODELETE = 8 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODELETE DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODIRECT = 131072 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODIRECT DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODUMP = 4096 #56887
|
|
||||||
pkg debug/elf, const DF_1_NODUMP DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOHDR = 1048576 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOHDR DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOKSYMS = 524288 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOKSYMS DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOOPEN = 64 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOOPEN DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NORELOC = 4194304 #56887
|
|
||||||
pkg debug/elf, const DF_1_NORELOC DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOW = 1 #56887
|
|
||||||
pkg debug/elf, const DF_1_NOW DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_ORIGIN = 128 #56887
|
|
||||||
pkg debug/elf, const DF_1_ORIGIN DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_PIE = 134217728 #56887
|
|
||||||
pkg debug/elf, const DF_1_PIE DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_SINGLETON = 33554432 #56887
|
|
||||||
pkg debug/elf, const DF_1_SINGLETON DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_STUB = 67108864 #56887
|
|
||||||
pkg debug/elf, const DF_1_STUB DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_SYMINTPOSE = 8388608 #56887
|
|
||||||
pkg debug/elf, const DF_1_SYMINTPOSE DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_TRANS = 512 #56887
|
|
||||||
pkg debug/elf, const DF_1_TRANS DynFlag1 #56887
|
|
||||||
pkg debug/elf, const DF_1_WEAKFILTER = 536870912 #56887
|
|
||||||
pkg debug/elf, const DF_1_WEAKFILTER DynFlag1 #56887
|
|
||||||
pkg debug/elf, const R_PPC64_REL24_P9NOTOC = 124 #60348
|
|
||||||
pkg debug/elf, const R_PPC64_REL24_P9NOTOC R_PPC64 #60348
|
|
||||||
pkg debug/elf, method (DynFlag1) GoString() string #56887
|
|
||||||
pkg debug/elf, method (DynFlag1) String() string #56887
|
|
||||||
pkg debug/elf, method (*File) DynValue(DynTag) ([]uint64, error) #56892
|
|
||||||
pkg debug/elf, type DynFlag1 uint32 #56887
|
|
||||||
pkg encoding/binary, var NativeEndian nativeEndian #57237
|
|
||||||
pkg errors, var ErrUnsupported error #41198
|
|
||||||
pkg flag, func BoolFunc(string, string, func(string) error) #53747
|
|
||||||
pkg flag, method (*FlagSet) BoolFunc(string, string, func(string) error) #53747
|
|
||||||
pkg go/ast, func IsGenerated(*File) bool #28089
|
|
||||||
pkg go/ast, type File struct, GoVersion string #59033
|
|
||||||
pkg go/build/constraint, func GoVersion(Expr) string #59033
|
|
||||||
pkg go/build, type Directive struct #56986
|
|
||||||
pkg go/build, type Directive struct, Pos token.Position #56986
|
|
||||||
pkg go/build, type Directive struct, Text string #56986
|
|
||||||
pkg go/build, type Package struct, Directives []Directive #56986
|
|
||||||
pkg go/build, type Package struct, TestDirectives []Directive #56986
|
|
||||||
pkg go/build, type Package struct, XTestDirectives []Directive #56986
|
|
||||||
pkg go/token, method (*File) Lines() []int #57708
|
|
||||||
pkg go/types, method (*Package) GoVersion() string #61175
|
|
||||||
pkg html/template, const ErrJSTemplate = 12 #59584
|
|
||||||
pkg html/template, const ErrJSTemplate ErrorCode #59584
|
|
||||||
pkg io/fs, func FormatDirEntry(DirEntry) string #54451
|
|
||||||
pkg io/fs, func FormatFileInfo(FileInfo) string #54451
|
|
||||||
pkg log/slog, const KindAny = 0 #56345
|
|
||||||
pkg log/slog, const KindAny Kind #56345
|
|
||||||
pkg log/slog, const KindBool = 1 #56345
|
|
||||||
pkg log/slog, const KindBool Kind #56345
|
|
||||||
pkg log/slog, const KindDuration = 2 #56345
|
|
||||||
pkg log/slog, const KindDuration Kind #56345
|
|
||||||
pkg log/slog, const KindFloat64 = 3 #56345
|
|
||||||
pkg log/slog, const KindFloat64 Kind #56345
|
|
||||||
pkg log/slog, const KindGroup = 8 #56345
|
|
||||||
pkg log/slog, const KindGroup Kind #56345
|
|
||||||
pkg log/slog, const KindInt64 = 4 #56345
|
|
||||||
pkg log/slog, const KindInt64 Kind #56345
|
|
||||||
pkg log/slog, const KindLogValuer = 9 #56345
|
|
||||||
pkg log/slog, const KindLogValuer Kind #56345
|
|
||||||
pkg log/slog, const KindString = 5 #56345
|
|
||||||
pkg log/slog, const KindString Kind #56345
|
|
||||||
pkg log/slog, const KindTime = 6 #56345
|
|
||||||
pkg log/slog, const KindTime Kind #56345
|
|
||||||
pkg log/slog, const KindUint64 = 7 #56345
|
|
||||||
pkg log/slog, const KindUint64 Kind #56345
|
|
||||||
pkg log/slog, const LevelDebug = -4 #56345
|
|
||||||
pkg log/slog, const LevelDebug Level #56345
|
|
||||||
pkg log/slog, const LevelError = 8 #56345
|
|
||||||
pkg log/slog, const LevelError Level #56345
|
|
||||||
pkg log/slog, const LevelInfo = 0 #56345
|
|
||||||
pkg log/slog, const LevelInfo Level #56345
|
|
||||||
pkg log/slog, const LevelKey ideal-string #56345
|
|
||||||
pkg log/slog, const LevelKey = "level" #56345
|
|
||||||
pkg log/slog, const LevelWarn = 4 #56345
|
|
||||||
pkg log/slog, const LevelWarn Level #56345
|
|
||||||
pkg log/slog, const MessageKey ideal-string #56345
|
|
||||||
pkg log/slog, const MessageKey = "msg" #56345
|
|
||||||
pkg log/slog, const SourceKey ideal-string #56345
|
|
||||||
pkg log/slog, const SourceKey = "source" #56345
|
|
||||||
pkg log/slog, const TimeKey ideal-string #56345
|
|
||||||
pkg log/slog, const TimeKey = "time" #56345
|
|
||||||
pkg log/slog, func Any(string, interface{}) Attr #56345
|
|
||||||
pkg log/slog, func AnyValue(interface{}) Value #56345
|
|
||||||
pkg log/slog, func Bool(string, bool) Attr #56345
|
|
||||||
pkg log/slog, func BoolValue(bool) Value #56345
|
|
||||||
pkg log/slog, func DebugCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func Debug(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func Default() *Logger #56345
|
|
||||||
pkg log/slog, func Duration(string, time.Duration) Attr #56345
|
|
||||||
pkg log/slog, func DurationValue(time.Duration) Value #56345
|
|
||||||
pkg log/slog, func ErrorCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func Error(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func Float64(string, float64) Attr #56345
|
|
||||||
pkg log/slog, func Float64Value(float64) Value #56345
|
|
||||||
pkg log/slog, func Group(string, ...interface{}) Attr #59204
|
|
||||||
pkg log/slog, func GroupValue(...Attr) Value #56345
|
|
||||||
pkg log/slog, func InfoCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func Info(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func Int64(string, int64) Attr #56345
|
|
||||||
pkg log/slog, func Int64Value(int64) Value #56345
|
|
||||||
pkg log/slog, func Int(string, int) Attr #56345
|
|
||||||
pkg log/slog, func IntValue(int) Value #56345
|
|
||||||
pkg log/slog, func LogAttrs(context.Context, Level, string, ...Attr) #56345
|
|
||||||
pkg log/slog, func Log(context.Context, Level, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func New(Handler) *Logger #56345
|
|
||||||
pkg log/slog, func NewJSONHandler(io.Writer, *HandlerOptions) *JSONHandler #59339
|
|
||||||
pkg log/slog, func NewLogLogger(Handler, Level) *log.Logger #56345
|
|
||||||
pkg log/slog, func NewRecord(time.Time, Level, string, uintptr) Record #56345
|
|
||||||
pkg log/slog, func NewTextHandler(io.Writer, *HandlerOptions) *TextHandler #59339
|
|
||||||
pkg log/slog, func SetDefault(*Logger) #56345
|
|
||||||
pkg log/slog, func String(string, string) Attr #56345
|
|
||||||
pkg log/slog, func StringValue(string) Value #56345
|
|
||||||
pkg log/slog, func Time(string, time.Time) Attr #56345
|
|
||||||
pkg log/slog, func TimeValue(time.Time) Value #56345
|
|
||||||
pkg log/slog, func Uint64(string, uint64) Attr #56345
|
|
||||||
pkg log/slog, func Uint64Value(uint64) Value #56345
|
|
||||||
pkg log/slog, func WarnCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func Warn(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, func With(...interface{}) *Logger #56345
|
|
||||||
pkg log/slog, method (Attr) Equal(Attr) bool #56345
|
|
||||||
pkg log/slog, method (Attr) String() string #56345
|
|
||||||
pkg log/slog, method (*JSONHandler) Enabled(context.Context, Level) bool #56345
|
|
||||||
pkg log/slog, method (*JSONHandler) Handle(context.Context, Record) error #56345
|
|
||||||
pkg log/slog, method (*JSONHandler) WithAttrs([]Attr) Handler #56345
|
|
||||||
pkg log/slog, method (*JSONHandler) WithGroup(string) Handler #56345
|
|
||||||
pkg log/slog, method (Kind) String() string #56345
|
|
||||||
pkg log/slog, method (Level) Level() Level #56345
|
|
||||||
pkg log/slog, method (Level) MarshalJSON() ([]uint8, error) #56345
|
|
||||||
pkg log/slog, method (Level) MarshalText() ([]uint8, error) #56345
|
|
||||||
pkg log/slog, method (Level) String() string #56345
|
|
||||||
pkg log/slog, method (*Level) UnmarshalJSON([]uint8) error #56345
|
|
||||||
pkg log/slog, method (*Level) UnmarshalText([]uint8) error #56345
|
|
||||||
pkg log/slog, method (*LevelVar) Level() Level #56345
|
|
||||||
pkg log/slog, method (*LevelVar) MarshalText() ([]uint8, error) #56345
|
|
||||||
pkg log/slog, method (*LevelVar) Set(Level) #56345
|
|
||||||
pkg log/slog, method (*LevelVar) String() string #56345
|
|
||||||
pkg log/slog, method (*LevelVar) UnmarshalText([]uint8) error #56345
|
|
||||||
pkg log/slog, method (*Logger) DebugCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) Debug(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) Enabled(context.Context, Level) bool #56345
|
|
||||||
pkg log/slog, method (*Logger) ErrorCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) Error(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) Handler() Handler #56345
|
|
||||||
pkg log/slog, method (*Logger) InfoCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) Info(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) LogAttrs(context.Context, Level, string, ...Attr) #56345
|
|
||||||
pkg log/slog, method (*Logger) Log(context.Context, Level, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) WarnCtx(context.Context, string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) Warn(string, ...interface{}) #56345
|
|
||||||
pkg log/slog, method (*Logger) WithGroup(string) *Logger #56345
|
|
||||||
pkg log/slog, method (*Logger) With(...interface{}) *Logger #56345
|
|
||||||
pkg log/slog, method (*Record) AddAttrs(...Attr) #56345
|
|
||||||
pkg log/slog, method (*Record) Add(...interface{}) #56345
|
|
||||||
pkg log/slog, method (Record) Attrs(func(Attr) bool) #59060
|
|
||||||
pkg log/slog, method (Record) Clone() Record #56345
|
|
||||||
pkg log/slog, method (Record) NumAttrs() int #56345
|
|
||||||
pkg log/slog, method (*TextHandler) Enabled(context.Context, Level) bool #56345
|
|
||||||
pkg log/slog, method (*TextHandler) Handle(context.Context, Record) error #56345
|
|
||||||
pkg log/slog, method (*TextHandler) WithAttrs([]Attr) Handler #56345
|
|
||||||
pkg log/slog, method (*TextHandler) WithGroup(string) Handler #56345
|
|
||||||
pkg log/slog, method (Value) Any() interface{} #56345
|
|
||||||
pkg log/slog, method (Value) Bool() bool #56345
|
|
||||||
pkg log/slog, method (Value) Duration() time.Duration #56345
|
|
||||||
pkg log/slog, method (Value) Equal(Value) bool #56345
|
|
||||||
pkg log/slog, method (Value) Float64() float64 #56345
|
|
||||||
pkg log/slog, method (Value) Group() []Attr #56345
|
|
||||||
pkg log/slog, method (Value) Int64() int64 #56345
|
|
||||||
pkg log/slog, method (Value) Kind() Kind #56345
|
|
||||||
pkg log/slog, method (Value) LogValuer() LogValuer #56345
|
|
||||||
pkg log/slog, method (Value) Resolve() Value #56345
|
|
||||||
pkg log/slog, method (Value) String() string #56345
|
|
||||||
pkg log/slog, method (Value) Time() time.Time #56345
|
|
||||||
pkg log/slog, method (Value) Uint64() uint64 #56345
|
|
||||||
pkg log/slog, type Attr struct #56345
|
|
||||||
pkg log/slog, type Attr struct, Key string #56345
|
|
||||||
pkg log/slog, type Attr struct, Value Value #56345
|
|
||||||
pkg log/slog, type Handler interface, Enabled(context.Context, Level) bool #56345
|
|
||||||
pkg log/slog, type Handler interface { Enabled, Handle, WithAttrs, WithGroup } #56345
|
|
||||||
pkg log/slog, type Handler interface, Handle(context.Context, Record) error #56345
|
|
||||||
pkg log/slog, type Handler interface, WithAttrs([]Attr) Handler #56345
|
|
||||||
pkg log/slog, type Handler interface, WithGroup(string) Handler #56345
|
|
||||||
pkg log/slog, type HandlerOptions struct #56345
|
|
||||||
pkg log/slog, type HandlerOptions struct, AddSource bool #56345
|
|
||||||
pkg log/slog, type HandlerOptions struct, Level Leveler #56345
|
|
||||||
pkg log/slog, type HandlerOptions struct, ReplaceAttr func([]string, Attr) Attr #56345
|
|
||||||
pkg log/slog, type JSONHandler struct #56345
|
|
||||||
pkg log/slog, type Kind int #56345
|
|
||||||
pkg log/slog, type Leveler interface { Level } #56345
|
|
||||||
pkg log/slog, type Leveler interface, Level() Level #56345
|
|
||||||
pkg log/slog, type Level int #56345
|
|
||||||
pkg log/slog, type LevelVar struct #56345
|
|
||||||
pkg log/slog, type Logger struct #56345
|
|
||||||
pkg log/slog, type LogValuer interface { LogValue } #56345
|
|
||||||
pkg log/slog, type LogValuer interface, LogValue() Value #56345
|
|
||||||
pkg log/slog, type Record struct #56345
|
|
||||||
pkg log/slog, type Record struct, Level Level #56345
|
|
||||||
pkg log/slog, type Record struct, Message string #56345
|
|
||||||
pkg log/slog, type Record struct, PC uintptr #56345
|
|
||||||
pkg log/slog, type Record struct, Time time.Time #56345
|
|
||||||
pkg log/slog, type Source struct #59280
|
|
||||||
pkg log/slog, type Source struct, File string #59280
|
|
||||||
pkg log/slog, type Source struct, Function string #59280
|
|
||||||
pkg log/slog, type Source struct, Line int #59280
|
|
||||||
pkg log/slog, type TextHandler struct #56345
|
|
||||||
pkg log/slog, type Value struct #56345
|
|
||||||
pkg maps, func Clone[$0 interface{ ~map[$1]$2 }, $1 comparable, $2 interface{}]($0) $0 #57436
|
|
||||||
pkg maps, func Copy[$0 interface{ ~map[$2]$3 }, $1 interface{ ~map[$2]$3 }, $2 comparable, $3 interface{}]($0, $1) #57436
|
|
||||||
pkg maps, func DeleteFunc[$0 interface{ ~map[$1]$2 }, $1 comparable, $2 interface{}]($0, func($1, $2) bool) #57436
|
|
||||||
pkg maps, func Equal[$0 interface{ ~map[$2]$3 }, $1 interface{ ~map[$2]$3 }, $2 comparable, $3 comparable]($0, $1) bool #57436
|
|
||||||
pkg maps, func EqualFunc[$0 interface{ ~map[$2]$3 }, $1 interface{ ~map[$2]$4 }, $2 comparable, $3 interface{}, $4 interface{}]($0, $1, func($3, $4) bool) bool #57436
|
|
||||||
pkg maps, func Keys[$0 interface{ ~map[$1]$2 }, $1 comparable, $2 interface{}]($0) []$1 #57436
|
|
||||||
pkg maps, func Values[$0 interface{ ~map[$1]$2 }, $1 comparable, $2 interface{}]($0) []$2 #57436
|
|
||||||
pkg math/big, method (*Int) Float64() (float64, Accuracy) #56984
|
|
||||||
pkg net/http, method (*ProtocolError) Is(error) bool #41198
|
|
||||||
pkg net/http, method (*ResponseController) EnableFullDuplex() error #57786
|
|
||||||
pkg net/http, var ErrSchemeMismatch error #44855
|
|
||||||
pkg net, method (*Dialer) MultipathTCP() bool #56539
|
|
||||||
pkg net, method (*Dialer) SetMultipathTCP(bool) #56539
|
|
||||||
pkg net, method (*ListenConfig) MultipathTCP() bool #56539
|
|
||||||
pkg net, method (*ListenConfig) SetMultipathTCP(bool) #56539
|
|
||||||
pkg net, method (*TCPConn) MultipathTCP() (bool, error) #59166
|
|
||||||
pkg reflect, method (Value) Clear() #55002
|
|
||||||
pkg reflect, type SliceHeader //deprecated #56906
|
|
||||||
pkg reflect, type StringHeader //deprecated #56906
|
|
||||||
pkg regexp, method (*Regexp) MarshalText() ([]uint8, error) #46159
|
|
||||||
pkg regexp, method (*Regexp) UnmarshalText([]uint8) error #46159
|
|
||||||
pkg runtime, method (*PanicNilError) Error() string #25448
|
|
||||||
pkg runtime, method (*PanicNilError) RuntimeError() #25448
|
|
||||||
pkg runtime, method (*Pinner) Pin(interface{}) #46787
|
|
||||||
pkg runtime, method (*Pinner) Unpin() #46787
|
|
||||||
pkg runtime, type PanicNilError struct #25448
|
|
||||||
pkg runtime, type Pinner struct #46787
|
|
||||||
pkg slices, func BinarySearch[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0, $1) (int, bool) #60091
|
|
||||||
pkg slices, func BinarySearchFunc[$0 interface{ ~[]$1 }, $1 interface{}, $2 interface{}]($0, $2, func($1, $2) int) (int, bool) #60091
|
|
||||||
pkg slices, func Clip[$0 interface{ ~[]$1 }, $1 interface{}]($0) $0 #57433
|
|
||||||
pkg slices, func Clone[$0 interface{ ~[]$1 }, $1 interface{}]($0) $0 #57433
|
|
||||||
pkg slices, func Compact[$0 interface{ ~[]$1 }, $1 comparable]($0) $0 #57433
|
|
||||||
pkg slices, func CompactFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) bool) $0 #57433
|
|
||||||
pkg slices, func Compare[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0, $0) int #60091
|
|
||||||
pkg slices, func CompareFunc[$0 interface{ ~[]$2 }, $1 interface{ ~[]$3 }, $2 interface{}, $3 interface{}]($0, $1, func($2, $3) int) int #60091
|
|
||||||
pkg slices, func Contains[$0 interface{ ~[]$1 }, $1 comparable]($0, $1) bool #57433
|
|
||||||
pkg slices, func ContainsFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1) bool) bool #57433
|
|
||||||
pkg slices, func Delete[$0 interface{ ~[]$1 }, $1 interface{}]($0, int, int) $0 #57433
|
|
||||||
pkg slices, func DeleteFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1) bool) $0 #54768
|
|
||||||
pkg slices, func Equal[$0 interface{ ~[]$1 }, $1 comparable]($0, $0) bool #57433
|
|
||||||
pkg slices, func EqualFunc[$0 interface{ ~[]$2 }, $1 interface{ ~[]$3 }, $2 interface{}, $3 interface{}]($0, $1, func($2, $3) bool) bool #57433
|
|
||||||
pkg slices, func Grow[$0 interface{ ~[]$1 }, $1 interface{}]($0, int) $0 #57433
|
|
||||||
pkg slices, func Index[$0 interface{ ~[]$1 }, $1 comparable]($0, $1) int #57433
|
|
||||||
pkg slices, func IndexFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1) bool) int #57433
|
|
||||||
pkg slices, func Insert[$0 interface{ ~[]$1 }, $1 interface{}]($0, int, ...$1) $0 #57433
|
|
||||||
pkg slices, func IsSorted[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) bool #60091
|
|
||||||
pkg slices, func IsSortedFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) bool #60091
|
|
||||||
pkg slices, func Max[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) $1 #60091
|
|
||||||
pkg slices, func MaxFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) $1 #60091
|
|
||||||
pkg slices, func Min[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) $1 #60091
|
|
||||||
pkg slices, func MinFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) $1 #60091
|
|
||||||
pkg slices, func Replace[$0 interface{ ~[]$1 }, $1 interface{}]($0, int, int, ...$1) $0 #57433
|
|
||||||
pkg slices, func Reverse[$0 interface{ ~[]$1 }, $1 interface{}]($0) #58565
|
|
||||||
pkg slices, func Sort[$0 interface{ ~[]$1 }, $1 cmp.Ordered]($0) #60091
|
|
||||||
pkg slices, func SortFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) #60091
|
|
||||||
pkg slices, func SortStableFunc[$0 interface{ ~[]$1 }, $1 interface{}]($0, func($1, $1) int) #60091
|
|
||||||
pkg strings, func ContainsFunc(string, func(int32) bool) bool #54386
|
|
||||||
pkg sync, func OnceFunc(func()) func() #56102
|
|
||||||
pkg sync, func OnceValue[$0 interface{}](func() $0) func() $0 #56102
|
|
||||||
pkg sync, func OnceValues[$0 interface{}, $1 interface{}](func() ($0, $1)) func() ($0, $1) #56102
|
|
||||||
pkg syscall (freebsd-386-cgo), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-386), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-amd64), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-arm64-cgo), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-arm64), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-arm), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-riscv64-cgo), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg syscall (freebsd-riscv64), type SysProcAttr struct, Jail int #46259
|
|
||||||
pkg testing, func Testing() bool #52600
|
|
||||||
pkg testing/slogtest, func TestHandler(slog.Handler, func() []map[string]interface{}) error #56345
|
|
||||||
pkg unicode, const Version = "15.0.0" #55079
|
|
||||||
pkg unicode, var Cypro_Minoan *RangeTable #55079
|
|
||||||
pkg unicode, var Kawi *RangeTable #55079
|
|
||||||
pkg unicode, var Nag_Mundari *RangeTable #55079
|
|
||||||
pkg unicode, var Old_Uyghur *RangeTable #55079
|
|
||||||
pkg unicode, var Tangsa *RangeTable #55079
|
|
||||||
pkg unicode, var Toto *RangeTable #55079
|
|
||||||
pkg unicode, var Vithkuqi *RangeTable #55079
|
|
||||||
3
api/next/30715.txt
Normal file
3
api/next/30715.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
pkg net/http, type MaxBytesError struct #30715
|
||||||
|
pkg net/http, type MaxBytesError struct, Limit int64 #30715
|
||||||
|
pkg net/http, method (*MaxBytesError) Error() string #30715
|
||||||
1
api/next/35044.txt
Normal file
1
api/next/35044.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pkg crypto/x509, method (*CertPool) Clone() *CertPool #35044
|
||||||
2
api/next/42710.txt
Normal file
2
api/next/42710.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pkg hash/maphash, func Bytes(Seed, []uint8) uint64 #42710
|
||||||
|
pkg hash/maphash, func String(Seed, string) uint64 #42710
|
||||||
1
api/next/45628.txt
Normal file
1
api/next/45628.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pkg encoding/xml, method (*Decoder) InputPos() (int, int) #45628
|
||||||
2
api/next/45754.txt
Normal file
2
api/next/45754.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pkg flag, func TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
|
||||||
|
pkg flag, method (*FlagSet) TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
|
||||||
1
api/next/46057.txt
Normal file
1
api/next/46057.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pkg crypto/x509, method (*CertPool) Equal(*CertPool) bool #46057
|
||||||
2
api/next/46059.txt
Normal file
2
api/next/46059.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pkg net/url, type URL struct, OmitHost bool #46059
|
||||||
|
|
||||||
2
api/next/46121.txt
Normal file
2
api/next/46121.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pkg html/template, method (*Template) Funcs(template.FuncMap) *Template #46121
|
||||||
|
pkg html/template, type FuncMap = template.FuncMap #46121
|
||||||
105
api/next/46229.txt
Normal file
105
api/next/46229.txt
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
pkg debug/elf, const EM_LOONGARCH = 258 #46229
|
||||||
|
pkg debug/elf, const EM_LOONGARCH Machine #46229
|
||||||
|
pkg debug/elf, const R_LARCH_32 = 1 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_32 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_64 = 2 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_64 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD16 = 48 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD16 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD24 = 49 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD24 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD32 = 50 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD32 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD64 = 51 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD64 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD8 = 47 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_ADD8 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_COPY = 4 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_COPY R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_IRELATIVE = 12 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_IRELATIVE R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_JUMP_SLOT = 5 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_JUMP_SLOT R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_MARK_LA = 20 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_MARK_LA R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_MARK_PCREL = 21 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_MARK_PCREL R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_NONE = 0 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_NONE R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_RELATIVE = 3 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_RELATIVE R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_ADD = 35 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_ADD R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_AND = 36 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_AND R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_ASSERT = 30 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_ASSERT R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_IF_ELSE = 37 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_IF_ELSE R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_NOT = 31 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_NOT R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 = 45 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 = 44 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 = 40 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 = 41 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 = 42 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 = 38 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 = 43 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_U = 46 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_U R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 = 39 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE = 23 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_DUP = 24 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_DUP R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL = 25 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL = 22 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL = 29 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD = 28 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT = 27 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL = 26 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_SL = 33 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_SL R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_SR = 34 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_SR R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_SUB = 32 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SOP_SUB R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB16 = 53 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB16 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB24 = 54 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB24 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB32 = 55 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB32 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB64 = 56 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB64 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB8 = 52 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_SUB8 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPMOD32 = 6 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPMOD32 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPMOD64 = 7 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPMOD64 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPREL32 = 8 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPREL32 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPREL64 = 9 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_DTPREL64 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_TPREL32 = 10 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_TPREL32 R_LARCH #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_TPREL64 = 11 #46229
|
||||||
|
pkg debug/elf, const R_LARCH_TLS_TPREL64 R_LARCH #46229
|
||||||
|
pkg debug/elf, method (R_LARCH) GoString() string #46229
|
||||||
|
pkg debug/elf, method (R_LARCH) String() string #46229
|
||||||
|
pkg debug/elf, type R_LARCH int #46229
|
||||||
2
api/next/47005.txt
Normal file
2
api/next/47005.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pkg net/url, func JoinPath(string, ...string) (string, error) #47005
|
||||||
|
pkg net/url, method (*URL) JoinPath(...string) *URL #47005
|
||||||
1
api/next/50340.txt
Normal file
1
api/next/50340.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pkg sort, func Find(int, func(int) int) (int, bool) #50340
|
||||||
1
api/next/50599.txt
Normal file
1
api/next/50599.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pkg os/exec, method (*Cmd) Environ() []string #50599
|
||||||
5
api/next/50601.txt
Normal file
5
api/next/50601.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
pkg encoding/binary, type AppendByteOrder interface { AppendUint16, AppendUint32, AppendUint64, String } #50601
|
||||||
|
pkg encoding/binary, type AppendByteOrder interface, AppendUint16([]uint8, uint16) []uint8 #50601
|
||||||
|
pkg encoding/binary, type AppendByteOrder interface, AppendUint32([]uint8, uint32) []uint8 #50601
|
||||||
|
pkg encoding/binary, type AppendByteOrder interface, AppendUint64([]uint8, uint64) []uint8 #50601
|
||||||
|
pkg encoding/binary, type AppendByteOrder interface, String() string #50601
|
||||||
9
api/next/50674.txt
Normal file
9
api/next/50674.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
pkg crypto/x509, func ParseRevocationList([]uint8) (*RevocationList, error) #50674
|
||||||
|
pkg crypto/x509, method (*RevocationList) CheckSignatureFrom(*Certificate) error #50674
|
||||||
|
pkg crypto/x509, type RevocationList struct, AuthorityKeyId []uint8 #50674
|
||||||
|
pkg crypto/x509, type RevocationList struct, Extensions []pkix.Extension #50674
|
||||||
|
pkg crypto/x509, type RevocationList struct, Issuer pkix.Name #50674
|
||||||
|
pkg crypto/x509, type RevocationList struct, Raw []uint8 #50674
|
||||||
|
pkg crypto/x509, type RevocationList struct, RawIssuer []uint8 #50674
|
||||||
|
pkg crypto/x509, type RevocationList struct, RawTBSRevocationList []uint8 #50674
|
||||||
|
pkg crypto/x509, type RevocationList struct, Signature []uint8 #50674
|
||||||
61
api/next/51082.txt
Normal file
61
api/next/51082.txt
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
pkg go/doc, method (*Package) HTML(string) []uint8 #51082
|
||||||
|
pkg go/doc, method (*Package) Markdown(string) []uint8 #51082
|
||||||
|
pkg go/doc, method (*Package) Parser() *comment.Parser #51082
|
||||||
|
pkg go/doc, method (*Package) Printer() *comment.Printer #51082
|
||||||
|
pkg go/doc, method (*Package) Synopsis(string) string #51082
|
||||||
|
pkg go/doc, method (*Package) Text(string) []uint8 #51082
|
||||||
|
pkg go/doc/comment, func DefaultLookupPackage(string) (string, bool) #51082
|
||||||
|
pkg go/doc/comment, method (*DocLink) DefaultURL(string) string #51082
|
||||||
|
pkg go/doc/comment, method (*Heading) DefaultID() string #51082
|
||||||
|
pkg go/doc/comment, method (*List) BlankBefore() bool #51082
|
||||||
|
pkg go/doc/comment, method (*List) BlankBetween() bool #51082
|
||||||
|
pkg go/doc/comment, method (*Parser) Parse(string) *Doc #51082
|
||||||
|
pkg go/doc/comment, method (*Printer) Comment(*Doc) []uint8 #51082
|
||||||
|
pkg go/doc/comment, method (*Printer) HTML(*Doc) []uint8 #51082
|
||||||
|
pkg go/doc/comment, method (*Printer) Markdown(*Doc) []uint8 #51082
|
||||||
|
pkg go/doc/comment, method (*Printer) Text(*Doc) []uint8 #51082
|
||||||
|
pkg go/doc/comment, type Block interface, unexported methods #51082
|
||||||
|
pkg go/doc/comment, type Code struct #51082
|
||||||
|
pkg go/doc/comment, type Code struct, Text string #51082
|
||||||
|
pkg go/doc/comment, type Doc struct #51082
|
||||||
|
pkg go/doc/comment, type Doc struct, Content []Block #51082
|
||||||
|
pkg go/doc/comment, type Doc struct, Links []*LinkDef #51082
|
||||||
|
pkg go/doc/comment, type DocLink struct #51082
|
||||||
|
pkg go/doc/comment, type DocLink struct, ImportPath string #51082
|
||||||
|
pkg go/doc/comment, type DocLink struct, Name string #51082
|
||||||
|
pkg go/doc/comment, type DocLink struct, Recv string #51082
|
||||||
|
pkg go/doc/comment, type DocLink struct, Text []Text #51082
|
||||||
|
pkg go/doc/comment, type Heading struct #51082
|
||||||
|
pkg go/doc/comment, type Heading struct, Text []Text #51082
|
||||||
|
pkg go/doc/comment, type Italic string #51082
|
||||||
|
pkg go/doc/comment, type Link struct #51082
|
||||||
|
pkg go/doc/comment, type Link struct, Auto bool #51082
|
||||||
|
pkg go/doc/comment, type Link struct, Text []Text #51082
|
||||||
|
pkg go/doc/comment, type Link struct, URL string #51082
|
||||||
|
pkg go/doc/comment, type LinkDef struct #51082
|
||||||
|
pkg go/doc/comment, type LinkDef struct, Text string #51082
|
||||||
|
pkg go/doc/comment, type LinkDef struct, URL string #51082
|
||||||
|
pkg go/doc/comment, type LinkDef struct, Used bool #51082
|
||||||
|
pkg go/doc/comment, type List struct #51082
|
||||||
|
pkg go/doc/comment, type List struct, ForceBlankBefore bool #51082
|
||||||
|
pkg go/doc/comment, type List struct, ForceBlankBetween bool #51082
|
||||||
|
pkg go/doc/comment, type List struct, Items []*ListItem #51082
|
||||||
|
pkg go/doc/comment, type ListItem struct #51082
|
||||||
|
pkg go/doc/comment, type ListItem struct, Content []Block #51082
|
||||||
|
pkg go/doc/comment, type ListItem struct, Number string #51082
|
||||||
|
pkg go/doc/comment, type Paragraph struct #51082
|
||||||
|
pkg go/doc/comment, type Paragraph struct, Text []Text #51082
|
||||||
|
pkg go/doc/comment, type Parser struct #51082
|
||||||
|
pkg go/doc/comment, type Parser struct, LookupPackage func(string) (string, bool) #51082
|
||||||
|
pkg go/doc/comment, type Parser struct, LookupSym func(string, string) bool #51082
|
||||||
|
pkg go/doc/comment, type Parser struct, Words map[string]string #51082
|
||||||
|
pkg go/doc/comment, type Plain string #51082
|
||||||
|
pkg go/doc/comment, type Printer struct #51082
|
||||||
|
pkg go/doc/comment, type Printer struct, DocLinkBaseURL string #51082
|
||||||
|
pkg go/doc/comment, type Printer struct, DocLinkURL func(*DocLink) string #51082
|
||||||
|
pkg go/doc/comment, type Printer struct, HeadingID func(*Heading) string #51082
|
||||||
|
pkg go/doc/comment, type Printer struct, HeadingLevel int #51082
|
||||||
|
pkg go/doc/comment, type Printer struct, TextCodePrefix string #51082
|
||||||
|
pkg go/doc/comment, type Printer struct, TextPrefix string #51082
|
||||||
|
pkg go/doc/comment, type Printer struct, TextWidth int #51082
|
||||||
|
pkg go/doc/comment, type Text interface, unexported methods #51082
|
||||||
1
api/next/51414.txt
Normal file
1
api/next/51414.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pkg time, method (Duration) Abs() Duration #51414
|
||||||
2
api/next/51644.txt
Normal file
2
api/next/51644.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pkg encoding/binary, func AppendUvarint([]uint8, uint64) []uint8 #51644
|
||||||
|
pkg encoding/binary, func AppendVarint([]uint8, int64) []uint8 #51644
|
||||||
2
api/next/51684.txt
Normal file
2
api/next/51684.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pkg regexp/syntax, const ErrNestingDepth = "expression nests too deeply" #51684
|
||||||
|
pkg regexp/syntax, const ErrNestingDepth ErrorCode #51684
|
||||||
36
api/next/51868.txt
Normal file
36
api/next/51868.txt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY = 2 #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5 #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH = 4 #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST = 6 #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES = 1 #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE = 3 #51686
|
||||||
|
pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_CNT_CODE = 32 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_CNT_CODE ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA = 64 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA = 128 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_LNK_COMDAT = 4096 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_LNK_COMDAT ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE = 33554432 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE = 536870912 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_READ = 1073741824 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_READ ideal-int #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_WRITE = 2147483648 #51686
|
||||||
|
pkg debug/pe, const IMAGE_SCN_MEM_WRITE ideal-int #51686
|
||||||
|
pkg debug/pe, method (*File) COFFSymbolReadSectionDefAux(int) (*COFFSymbolAuxFormat5, error) #51686
|
||||||
|
pkg debug/pe, type COFFSymbolAuxFormat5 struct #51686
|
||||||
|
pkg debug/pe, type COFFSymbolAuxFormat5 struct, Checksum uint32 #51686
|
||||||
|
pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumLineNumbers uint16 #51686
|
||||||
|
pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumRelocs uint16 #51686
|
||||||
|
pkg debug/pe, type COFFSymbolAuxFormat5 struct, SecNum uint16 #51686
|
||||||
|
pkg debug/pe, type COFFSymbolAuxFormat5 struct, Selection uint8 #51686
|
||||||
|
pkg debug/pe, type COFFSymbolAuxFormat5 struct, Size uint32 #51686
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
branch: dev.inline
|
branch: dev.boringcrypto
|
||||||
parent-branch: master
|
parent-branch: master
|
||||||
|
|||||||
179
doc/go1.19.html
Normal file
179
doc/go1.19.html
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
<!--{
|
||||||
|
"Title": "Go 1.19 Release Notes",
|
||||||
|
"Path": "/doc/go1.19"
|
||||||
|
}-->
|
||||||
|
<!--
|
||||||
|
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.19</h2>
|
||||||
|
<p>
|
||||||
|
<strong>
|
||||||
|
Go 1.19 is not yet released. These are work-in-progress
|
||||||
|
release notes. Go 1.19 is expected to be released in August 2022.
|
||||||
|
</strong>
|
||||||
|
</p>
|
||||||
|
<h2 id="language">Changes to the language</h2>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section
|
||||||
|
</p>
|
||||||
|
<h2 id="ports">Ports</h2>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section, or delete if not needed
|
||||||
|
</p>
|
||||||
|
<h2 id="tools">Tools</h2>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section, or delete if not needed
|
||||||
|
</p>
|
||||||
|
<h3 id="go-command">Go command</h3>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<!-- https://go.dev/issue/51461 -->
|
||||||
|
<p>
|
||||||
|
The <code>-trimpath</code> flag, if set, is now included in the build settings
|
||||||
|
stamped into Go binaries by <code>go</code> <code>build</code>, and can be
|
||||||
|
examined using
|
||||||
|
<a href="https://pkg.go.dev/cmd/go#hdr-Print_Go_version"><code>go</code> <code>version</code> <code>-m</code></a>
|
||||||
|
or <a href="https://pkg.go.dev/runtime/debug#ReadBuildInfo"><code>debug.ReadBuildInfo</code></a>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<code>go</code> <code>generate</code> now sets the <code>GOROOT</code>
|
||||||
|
environment variable explicitly in the generator's environment, so that
|
||||||
|
generators can locate the correct <code>GOROOT</code> even if built
|
||||||
|
with <code>-trimpath</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h4 id="go-unix">New <code>unix</code> build constraint</h4>
|
||||||
|
|
||||||
|
<p><!-- CL 389934 -->
|
||||||
|
The build constraint <code>unix</code> is now recognized
|
||||||
|
in <code>//go:build</code> lines. The constraint is satisfied
|
||||||
|
if the target operating system, also known as <code>GOOS</code>, is
|
||||||
|
a Unix or Unix-like system. For the 1.19 release it is satisfied
|
||||||
|
if <code>GOOS</code> is one of
|
||||||
|
<code>aix</code>, <code>android</code>, <code>darwin</code>,
|
||||||
|
<code>dragonfly</code>, <code>freebsd</code>, <code>hurd</code>,
|
||||||
|
<code>illumos</code>, <code>ios</code>, <code>linux</code>,
|
||||||
|
<code>netbsd</code>, <code>openbsd</code>, or <code>solaris</code>.
|
||||||
|
In future releases the <code>unix</code> constraint may match
|
||||||
|
additional newly supported operating systems.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 id="runtime">Runtime</h2>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section, or delete if not needed
|
||||||
|
</p>
|
||||||
|
<h2 id="compiler">Compiler</h2>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section, or delete if not needed
|
||||||
|
</p>
|
||||||
|
<h2 id="linker">Linker</h2>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section, or delete if not needed
|
||||||
|
</p>
|
||||||
|
<h2 id="library">Core library</h2>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section
|
||||||
|
</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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
TODO: complete this section
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 400974 -->
|
||||||
|
The <code>tls10default</code> <code>GODEBUG</code> option has been
|
||||||
|
removed. It is still possible to enable TLS 1.0 client-side by setting
|
||||||
|
<code>Config.MinVersion</code>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- crypto/tls -->
|
||||||
|
|
||||||
|
<dl id="image/draw"><dt><a href="/pkg/image/draw/">image/draw</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 396795 -->
|
||||||
|
<code>Draw</code> with the <code>Src</code> operator preserves
|
||||||
|
non-premultiplied-alpha colors when destination and source images are
|
||||||
|
both <code>*image.NRGBA</code> (or both <code>*image.NRGBA64</code>).
|
||||||
|
This reverts a behavior change accidentally introduced by a Go 1.18
|
||||||
|
library optimization, to match the behavior in Go 1.17 and earlier.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- image/draw -->
|
||||||
|
|
||||||
|
<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 386016 -->
|
||||||
|
The pure Go resolver will now use EDNS(0) to include a suggested
|
||||||
|
maximum reply packet length, permitting reply packets to contain
|
||||||
|
up to 1232 bytes (the previous maximum was 512).
|
||||||
|
In the unlikely event that this causes problems with a local DNS
|
||||||
|
resolver, setting the environment variable
|
||||||
|
<code>GODEBUG=netdns=cgo</code> to use the cgo-based resolver
|
||||||
|
should work.
|
||||||
|
Please report any such problems on <a href="/issue/new">the
|
||||||
|
issue tracker</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 396877 -->
|
||||||
|
When a net package function or method returns an "I/O timeout"
|
||||||
|
error, the error will now satisfy <code>errors.Is(err,
|
||||||
|
context.DeadlineExceeded)</code>. When a net package function
|
||||||
|
returns an "operation was canceled" error, the error will now
|
||||||
|
satisfy <code>errors.Is(err, context.Canceled)</code>.
|
||||||
|
These changes are intended to make it easier for code to test
|
||||||
|
for cases in which a context cancelation or timeout causes a net
|
||||||
|
package function or method to return an error, while preserving
|
||||||
|
backward compatibility for error messages.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- net -->
|
||||||
|
|
||||||
|
<dl id="os/exec"><dt><a href="/pkg/os/exec/">os/exec</a></dt>
|
||||||
|
<dd><!-- https://go.dev/issue/50599 -->
|
||||||
|
<p>
|
||||||
|
An <code>exec.Cmd</code> with a non-empty <code>Dir</code> and a
|
||||||
|
nil <code>Env</code> now implicitly sets the <code>PWD</code> environment
|
||||||
|
variable for the subprocess to match <code>Dir</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The new method <code>(*exec.Cmd).Environ</code> reports the
|
||||||
|
environment that would be used to run the command, including the
|
||||||
|
aforementioned <code>PWD</code> variable.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl> <!-- os/exec -->
|
||||||
|
|
||||||
|
<dl id="runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- https://go.dev/issue/51461 -->
|
||||||
|
The <code>GOROOT</code> function now returns the empty string
|
||||||
|
(instead of <code>"go"</code>) when the binary was built with
|
||||||
|
the <code>-trimpath</code> flag set and the <code>GOROOT</code>
|
||||||
|
variable is not set in the process environment.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- runtime -->
|
||||||
|
|
||||||
|
<dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 397255 -->
|
||||||
|
<a href="/pkg/strconv/#strconv.Quote"><code>strconv.Quote</code></a>
|
||||||
|
and related functions now quote the rune 007F as <code>\x7f</code>,
|
||||||
|
not <code>\u007f</code>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- strconv -->
|
||||||
1246
doc/go1.21.html
1246
doc/go1.21.html
File diff suppressed because it is too large
Load Diff
589
doc/go_mem.html
589
doc/go_mem.html
@@ -1,6 +1,6 @@
|
|||||||
<!--{
|
<!--{
|
||||||
"Title": "The Go Memory Model",
|
"Title": "The Go Memory Model",
|
||||||
"Subtitle": "Version of June 6, 2022",
|
"Subtitle": "Version of May 31, 2014",
|
||||||
"Path": "/ref/mem"
|
"Path": "/ref/mem"
|
||||||
}-->
|
}-->
|
||||||
|
|
||||||
@@ -8,9 +8,12 @@
|
|||||||
p.rule {
|
p.rule {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
span.event {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<h2 id="introduction">Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The Go memory model specifies the conditions under which
|
The Go memory model specifies the conditions under which
|
||||||
@@ -19,7 +22,7 @@ observe values produced by writes to the same variable in a different goroutine.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3 id="advice">Advice</h3>
|
<h2>Advice</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Programs that modify data being simultaneously accessed by multiple goroutines
|
Programs that modify data being simultaneously accessed by multiple goroutines
|
||||||
@@ -41,237 +44,90 @@ you are being too clever.
|
|||||||
Don't be clever.
|
Don't be clever.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3 id="overview">Informal Overview</h3>
|
<h2>Happens Before</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Go approaches its memory model in much the same way as the rest of the language,
|
Within a single goroutine, reads and writes must behave
|
||||||
aiming to keep the semantics simple, understandable, and useful.
|
as if they executed in the order specified by the program.
|
||||||
This section gives a general overview of the approach and should suffice for most programmers.
|
That is, compilers and processors may reorder the reads and writes
|
||||||
The memory model is specified more formally in the next section.
|
executed within a single goroutine only when the reordering
|
||||||
|
does not change the behavior within that goroutine
|
||||||
|
as defined by the language specification.
|
||||||
|
Because of this reordering, the execution order observed
|
||||||
|
by one goroutine may differ from the order perceived
|
||||||
|
by another. For example, if one goroutine
|
||||||
|
executes <code>a = 1; b = 2;</code>, another might observe
|
||||||
|
the updated value of <code>b</code> before the updated value of <code>a</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A <em>data race</em> is defined as
|
To specify the requirements of reads and writes, we define
|
||||||
a write to a memory location happening concurrently with another read or write to that same location,
|
<i>happens before</i>, a partial order on the execution
|
||||||
unless all the accesses involved are atomic data accesses as provided by the <code>sync/atomic</code> package.
|
of memory operations in a Go program. If event <span class="event">e<sub>1</sub></span> happens
|
||||||
As noted already, programmers are strongly encouraged to use appropriate synchronization
|
before event <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>2</sub></span> happens after <span class="event">e<sub>1</sub></span>.
|
||||||
to avoid data races.
|
Also, if <span class="event">e<sub>1</sub></span> does not happen before <span class="event">e<sub>2</sub></span> and does not happen
|
||||||
In the absence of data races, Go programs behave as if all the goroutines
|
after <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>1</sub></span> and <span class="event">e<sub>2</sub></span> happen concurrently.
|
||||||
were multiplexed onto a single processor.
|
</p>
|
||||||
This property is sometimes referred to as DRF-SC: data-race-free programs
|
|
||||||
execute in a sequentially consistent manner.
|
<p class="rule">
|
||||||
|
Within a single goroutine, the happens-before order is the
|
||||||
|
order expressed by the program.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
While programmers should write Go programs without data races,
|
A read <span class="event">r</span> of a variable <code>v</code> is <i>allowed</i> to observe a write <span class="event">w</span> to <code>v</code>
|
||||||
there are limitations to what a Go implementation can do in response to a data race.
|
if both of the following hold:
|
||||||
An implementation may always react to a data race by reporting the race and terminating the program.
|
|
||||||
Otherwise, each read of a single-word-sized or sub-word-sized memory location
|
|
||||||
must observe a value actually written to that location (perhaps by a concurrent executing goroutine)
|
|
||||||
and not yet overwritten.
|
|
||||||
These implementation constraints make Go more like Java or JavaScript,
|
|
||||||
in that most races have a limited number of outcomes,
|
|
||||||
and less like C and C++, where the meaning of any program with a race
|
|
||||||
is entirely undefined, and the compiler may do anything at all.
|
|
||||||
Go's approach aims to make errant programs more reliable and easier to debug,
|
|
||||||
while still insisting that races are errors and that tools can diagnose and report them.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="model">Memory Model</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The following formal definition of Go's memory model closely follows
|
|
||||||
the approach presented by Hans-J. Boehm and Sarita V. Adve in
|
|
||||||
“<a href="https://www.hpl.hp.com/techreports/2008/HPL-2008-56.pdf">Foundations of the C++ Concurrency Memory Model</a>”,
|
|
||||||
published in PLDI 2008.
|
|
||||||
The definition of data-race-free programs and the guarantee of sequential consistency
|
|
||||||
for race-free programs are equivalent to the ones in that work.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The memory model describes the requirements on program executions,
|
|
||||||
which are made up of goroutine executions,
|
|
||||||
which in turn are made up of memory operations.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
A <i>memory operation</i> is modeled by four details:
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>its kind, indicating whether it is an ordinary data read, an ordinary data write,
|
|
||||||
or a <i>synchronizing operation</i> such as an atomic data access,
|
|
||||||
a mutex operation, or a channel operation,
|
|
||||||
<li>its location in the program,
|
|
||||||
<li>the memory location or variable being accessed, and
|
|
||||||
<li>the values read or written by the operation.
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
Some memory operations are <i>read-like</i>, including read, atomic read, mutex lock, and channel receive.
|
|
||||||
Other memory operations are <i>write-like</i>, including write, atomic write, mutex unlock, channel send, and channel close.
|
|
||||||
Some, such as atomic compare-and-swap, are both read-like and write-like.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
A <i>goroutine execution</i> is modeled as a set of memory operations executed by a single goroutine.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<b>Requirement 1</b>:
|
|
||||||
The memory operations in each goroutine must correspond to a correct sequential execution of that goroutine,
|
|
||||||
given the values read from and written to memory.
|
|
||||||
That execution must be consistent with the <i>sequenced before</i> relation,
|
|
||||||
defined as the partial order requirements set out by the <a href="/ref/spec">Go language specification</a>
|
|
||||||
for Go's control flow constructs as well as the <a href="/ref/spec#Order_of_evaluation">order of evaluation for expressions</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
A Go <i>program execution</i> is modeled as a set of goroutine executions,
|
|
||||||
together with a mapping <i>W</i> that specifies the write-like operation that each read-like operation reads from.
|
|
||||||
(Multiple executions of the same program can have different program executions.)
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<b>Requirement 2</b>:
|
|
||||||
For a given program execution, the mapping <i>W</i>, when limited to synchronizing operations,
|
|
||||||
must be explainable by some implicit total order of the synchronizing operations
|
|
||||||
that is consistent with sequencing and the values read and written by those operations.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <i>synchronized before</i> relation is a partial order on synchronizing memory operations,
|
|
||||||
derived from <i>W</i>.
|
|
||||||
If a synchronizing read-like memory operation <i>r</i>
|
|
||||||
observes a synchronizing write-like memory operation <i>w</i>
|
|
||||||
(that is, if <i>W</i>(<i>r</i>) = <i>w</i>),
|
|
||||||
then <i>w</i> is synchronized before <i>r</i>.
|
|
||||||
Informally, the synchronized before relation is a subset of the implied total order
|
|
||||||
mentioned in the previous paragraph,
|
|
||||||
limited to the information that <i>W</i> directly observes.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <i>happens before</i> relation is defined as the transitive closure of the
|
|
||||||
union of the sequenced before and synchronized before relations.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<b>Requirement 3</b>:
|
|
||||||
For an ordinary (non-synchronizing) data read <i>r</i> on a memory location <i>x</i>,
|
|
||||||
<i>W</i>(<i>r</i>) must be a write <i>w</i> that is <i>visible</i> to <i>r</i>,
|
|
||||||
where visible means that both of the following hold:
|
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li><i>w</i> happens before <i>r</i>.
|
<li><span class="event">r</span> does not happen before <span class="event">w</span>.</li>
|
||||||
<li><i>w</i> does not happen before any other write <i>w'</i> (to <i>x</i>) that happens before <i>r</i>.
|
<li>There is no other write <span class="event">w'</span> to <code>v</code> that happens
|
||||||
|
after <span class="event">w</span> but before <span class="event">r</span>.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A <i>read-write data race</i> on memory location <i>x</i>
|
To guarantee that a read <span class="event">r</span> of a variable <code>v</code> observes a
|
||||||
consists of a read-like memory operation <i>r</i> on <i>x</i>
|
particular write <span class="event">w</span> to <code>v</code>, ensure that <span class="event">w</span> is the only
|
||||||
and a write-like memory operation <i>w</i> on <i>x</i>,
|
write <span class="event">r</span> is allowed to observe.
|
||||||
at least one of which is non-synchronizing,
|
That is, <span class="event">r</span> is <i>guaranteed</i> to observe <span class="event">w</span> if both of the following hold:
|
||||||
which are unordered by happens before
|
</p>
|
||||||
(that is, neither <i>r</i> happens before <i>w</i>
|
|
||||||
nor <i>w</i> happens before <i>r</i>).
|
<ol>
|
||||||
|
<li><span class="event">w</span> happens before <span class="event">r</span>.</li>
|
||||||
|
<li>Any other write to the shared variable <code>v</code>
|
||||||
|
either happens before <span class="event">w</span> or after <span class="event">r</span>.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This pair of conditions is stronger than the first pair;
|
||||||
|
it requires that there are no other writes happening
|
||||||
|
concurrently with <span class="event">w</span> or <span class="event">r</span>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A <i>write-write data race</i> on memory location <i>x</i>
|
Within a single goroutine,
|
||||||
consists of two write-like memory operations <i>w</i> and <i>w'</i> on <i>x</i>,
|
there is no concurrency, so the two definitions are equivalent:
|
||||||
at least one of which is non-synchronizing,
|
a read <span class="event">r</span> observes the value written by the most recent write <span class="event">w</span> to <code>v</code>.
|
||||||
which are unordered by happens before.
|
When multiple goroutines access a shared variable <code>v</code>,
|
||||||
|
they must use synchronization events to establish
|
||||||
|
happens-before conditions that ensure reads observe the
|
||||||
|
desired writes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Note that if there are no read-write or write-write data races on memory location <i>x</i>,
|
The initialization of variable <code>v</code> with the zero value
|
||||||
then any read <i>r</i> on <i>x</i> has only one possible <i>W</i>(<i>r</i>):
|
for <code>v</code>'s type behaves as a write in the memory model.
|
||||||
the single <i>w</i> that immediately precedes it in the happens before order.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
More generally, it can be shown that any Go program that is data-race-free,
|
Reads and writes of values larger than a single machine word
|
||||||
meaning it has no program executions with read-write or write-write data races,
|
behave as multiple machine-word-sized operations in an
|
||||||
can only have outcomes explained by some sequentially consistent interleaving
|
unspecified order.
|
||||||
of the goroutine executions.
|
|
||||||
(The proof is the same as Section 7 of Boehm and Adve's paper cited above.)
|
|
||||||
This property is called DRF-SC.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<h2>Synchronization</h2>
|
||||||
The intent of the formal definition is to match
|
|
||||||
the DRF-SC guarantee provided to race-free programs
|
|
||||||
by other languages, including C, C++, Java, JavaScript, Rust, and Swift.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
<h3>Initialization</h3>
|
||||||
Certain Go language operations such as goroutine creation and memory allocation
|
|
||||||
act as synchronization operations.
|
|
||||||
The effect of these operations on the synchronized-before partial order
|
|
||||||
is documented in the “Synchronization” section below.
|
|
||||||
Individual packages are responsible for providing similar documentation
|
|
||||||
for their own operations.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="restrictions">Implementation Restrictions for Programs Containing Data Races</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The preceding section gave a formal definition of data-race-free program execution.
|
|
||||||
This section informally describes the semantics that implementations must provide
|
|
||||||
for programs that do contain races.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
First, any implementation can, upon detecting a data race,
|
|
||||||
report the race and halt execution of the program.
|
|
||||||
Implementations using ThreadSanitizer
|
|
||||||
(accessed with “<code>go</code> <code>build</code> <code>-race</code>”)
|
|
||||||
do exactly this.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Otherwise, a read <i>r</i> of a memory location <i>x</i>
|
|
||||||
that is not larger than a machine word must observe
|
|
||||||
some write <i>w</i> such that <i>r</i> does not happen before <i>w</i>
|
|
||||||
and there is no write <i>w'</i> such that <i>w</i> happens before <i>w'</i>
|
|
||||||
and <i>w'</i> happens before <i>r</i>.
|
|
||||||
That is, each read must observe a value written by a preceding or concurrent write.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Additionally, observation of acausal and “out of thin air” writes is disallowed.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Reads of memory locations larger than a single machine word
|
|
||||||
are encouraged but not required to meet the same semantics
|
|
||||||
as word-sized memory locations,
|
|
||||||
observing a single allowed write <i>w</i>.
|
|
||||||
For performance reasons,
|
|
||||||
implementations may instead treat larger operations
|
|
||||||
as a set of individual machine-word-sized operations
|
|
||||||
in an unspecified order.
|
|
||||||
This means that races on multiword data structures
|
|
||||||
can lead to inconsistent values not corresponding to a single write.
|
|
||||||
When the values depend on the consistency
|
|
||||||
of internal (pointer, length) or (pointer, type) pairs,
|
|
||||||
as can be the case for interface values, maps,
|
|
||||||
slices, and strings in most Go implementations,
|
|
||||||
such races can in turn lead to arbitrary memory corruption.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Examples of incorrect synchronization are given in the
|
|
||||||
“Incorrect synchronization” section below.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Examples of the limitations on implementations are given in the
|
|
||||||
“Incorrect compilation” section below.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="synchronization">Synchronization</h2>
|
|
||||||
|
|
||||||
<h3 id="init">Initialization</h3>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Program initialization runs in a single goroutine,
|
Program initialization runs in a single goroutine,
|
||||||
@@ -285,15 +141,15 @@ If a package <code>p</code> imports package <code>q</code>, the completion of
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
The completion of all <code>init</code> functions is synchronized before
|
The start of the function <code>main.main</code> happens after
|
||||||
the start of the function <code>main.main</code>.
|
all <code>init</code> functions have finished.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3 id="go">Goroutine creation</h3>
|
<h3>Goroutine creation</h3>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
The <code>go</code> statement that starts a new goroutine
|
The <code>go</code> statement that starts a new goroutine
|
||||||
is synchronized before the start of the goroutine's execution.
|
happens before the goroutine's execution begins.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -318,12 +174,11 @@ calling <code>hello</code> will print <code>"hello, world"</code>
|
|||||||
at some point in the future (perhaps after <code>hello</code> has returned).
|
at some point in the future (perhaps after <code>hello</code> has returned).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3 id="goexit">Goroutine destruction</h3>
|
<h3>Goroutine destruction</h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The exit of a goroutine is not guaranteed to be synchronized before
|
The exit of a goroutine is not guaranteed to happen before
|
||||||
any event in the program.
|
any event in the program. For example, in this program:
|
||||||
For example, in this program:
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@@ -348,7 +203,7 @@ use a synchronization mechanism such as a lock or channel
|
|||||||
communication to establish a relative ordering.
|
communication to establish a relative ordering.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3 id="chan">Channel communication</h3>
|
<h3>Channel communication</h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Channel communication is the main method of synchronization
|
Channel communication is the main method of synchronization
|
||||||
@@ -358,8 +213,8 @@ usually in a different goroutine.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
A send on a channel is synchronized before the completion of the
|
A send on a channel happens before the corresponding
|
||||||
corresponding receive from that channel.
|
receive from that channel completes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -384,13 +239,13 @@ func main() {
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
is guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
|
is guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
|
||||||
is sequenced before the send on <code>c</code>, which is synchronized before
|
happens before the send on <code>c</code>, which happens before
|
||||||
the corresponding receive on <code>c</code> completes, which is sequenced before
|
the corresponding receive on <code>c</code> completes, which happens before
|
||||||
the <code>print</code>.
|
the <code>print</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
The closing of a channel is synchronized before a receive that returns a zero value
|
The closing of a channel happens before a receive that returns a zero value
|
||||||
because the channel is closed.
|
because the channel is closed.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -401,8 +256,8 @@ yields a program with the same guaranteed behavior.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
A receive from an unbuffered channel is synchronized before the completion of
|
A receive from an unbuffered channel happens before
|
||||||
the corresponding send on that channel.
|
the send on that channel completes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -428,8 +283,8 @@ func main() {
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
is also guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
|
is also guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
|
||||||
is sequenced before the receive on <code>c</code>, which is synchronized before
|
happens before the receive on <code>c</code>, which happens before
|
||||||
the corresponding send on <code>c</code> completes, which is sequenced
|
the corresponding send on <code>c</code> completes, which happens
|
||||||
before the <code>print</code>.
|
before the <code>print</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -441,7 +296,7 @@ crash, or do something else.)
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
The <i>k</i>th receive on a channel with capacity <i>C</i> is synchronized before the completion of the <i>k</i>+<i>C</i>th send from that channel completes.
|
The <i>k</i>th receive on a channel with capacity <i>C</i> happens before the <i>k</i>+<i>C</i>th send from that channel completes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -475,7 +330,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3 id="locks">Locks</h3>
|
<h3>Locks</h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>sync</code> package implements two lock data types,
|
The <code>sync</code> package implements two lock data types,
|
||||||
@@ -484,7 +339,7 @@ The <code>sync</code> package implements two lock data types,
|
|||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
For any <code>sync.Mutex</code> or <code>sync.RWMutex</code> variable <code>l</code> and <i>n</i> < <i>m</i>,
|
For any <code>sync.Mutex</code> or <code>sync.RWMutex</code> variable <code>l</code> and <i>n</i> < <i>m</i>,
|
||||||
call <i>n</i> of <code>l.Unlock()</code> is synchronized before call <i>m</i> of <code>l.Lock()</code> returns.
|
call <i>n</i> of <code>l.Unlock()</code> happens before call <i>m</i> of <code>l.Lock()</code> returns.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -510,29 +365,19 @@ func main() {
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
is guaranteed to print <code>"hello, world"</code>.
|
is guaranteed to print <code>"hello, world"</code>.
|
||||||
The first call to <code>l.Unlock()</code> (in <code>f</code>) is synchronized
|
The first call to <code>l.Unlock()</code> (in <code>f</code>) happens
|
||||||
before the second call to <code>l.Lock()</code> (in <code>main</code>) returns,
|
before the second call to <code>l.Lock()</code> (in <code>main</code>) returns,
|
||||||
which is sequenced before the <code>print</code>.
|
which happens before the <code>print</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
For any call to <code>l.RLock</code> on a <code>sync.RWMutex</code> variable <code>l</code>,
|
For any call to <code>l.RLock</code> on a <code>sync.RWMutex</code> variable <code>l</code>,
|
||||||
there is an <i>n</i> such that the <i>n</i>th call to <code>l.Unlock</code>
|
there is an <i>n</i> such that the <code>l.RLock</code> happens (returns) after call <i>n</i> to
|
||||||
is synchronized before the return from <code>l.RLock</code>,
|
<code>l.Unlock</code> and the matching <code>l.RUnlock</code> happens
|
||||||
and the matching call to <code>l.RUnlock</code> is synchronized before the return from call <i>n</i>+1 to <code>l.Lock</code>.
|
before call <i>n</i>+1 to <code>l.Lock</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<h3>Once</h3>
|
||||||
A successful call to <code>l.TryLock</code> (or <code>l.TryRLock</code>)
|
|
||||||
is equivalent to a call to <code>l.Lock</code> (or <code>l.RLock</code>).
|
|
||||||
An unsuccessful call has no synchronizing effect at all.
|
|
||||||
As far as the memory model is concerned,
|
|
||||||
<code>l.TryLock</code> (or <code>l.TryRLock</code>)
|
|
||||||
may be considered to be able to return false
|
|
||||||
even when the mutex <i>l</i> is unlocked.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="once">Once</h3>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>sync</code> package provides a safe mechanism for
|
The <code>sync</code> package provides a safe mechanism for
|
||||||
@@ -544,8 +389,7 @@ until <code>f()</code> has returned.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="rule">
|
<p class="rule">
|
||||||
The completion of a single call of <code>f()</code> from <code>once.Do(f)</code>
|
A single call of <code>f()</code> from <code>once.Do(f)</code> happens (returns) before any call of <code>once.Do(f)</code> returns.
|
||||||
is synchronized before the return of any call of <code>once.Do(f)</code>.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -580,60 +424,13 @@ The result will be that <code>"hello, world"</code> will be printed
|
|||||||
twice.
|
twice.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3 id="atomic">Atomic Values</h3>
|
<h2>Incorrect synchronization</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The APIs in the <a href="/pkg/sync/atomic/"><code>sync/atomic</code></a>
|
Note that a read <span class="event">r</span> may observe the value written by a write <span class="event">w</span>
|
||||||
package are collectively “atomic operations”
|
that happens concurrently with <span class="event">r</span>.
|
||||||
that can be used to synchronize the execution of different goroutines.
|
Even if this occurs, it does not imply that reads happening after <span class="event">r</span>
|
||||||
If the effect of an atomic operation <i>A</i> is observed by atomic operation <i>B</i>,
|
will observe writes that happened before <span class="event">w</span>.
|
||||||
then <i>A</i> is synchronized before <i>B</i>.
|
|
||||||
All the atomic operations executed in a program behave as though executed
|
|
||||||
in some sequentially consistent order.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The preceding definition has the same semantics as C++’s sequentially consistent atomics
|
|
||||||
and Java’s <code>volatile</code> variables.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="finalizer">Finalizers</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <a href="/pkg/runtime/"><code>runtime</code></a> package provides
|
|
||||||
a <code>SetFinalizer</code> function that adds a finalizer to be called when
|
|
||||||
a particular object is no longer reachable by the program.
|
|
||||||
A call to <code>SetFinalizer(x, f)</code> is synchronized before the finalization call <code>f(x)</code>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="more">Additional Mechanisms</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <code>sync</code> package provides additional synchronization abstractions,
|
|
||||||
including <a href="/pkg/sync/#Cond">condition variables</a>,
|
|
||||||
<a href="/pkg/sync/#Map">lock-free maps</a>,
|
|
||||||
<a href="/pkg/sync/#Pool">allocation pools</a>,
|
|
||||||
and
|
|
||||||
<a href="/pkg/sync/#WaitGroup">wait groups</a>.
|
|
||||||
The documentation for each of these specifies the guarantees it
|
|
||||||
makes concerning synchronization.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Other packages that provide synchronization abstractions
|
|
||||||
should document the guarantees they make too.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2 id="badsync">Incorrect synchronization</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Programs with races are incorrect and
|
|
||||||
can exhibit non-sequentially consistent executions.
|
|
||||||
In particular, note that a read <i>r</i> may observe the value written by any write <i>w</i>
|
|
||||||
that executes concurrently with <i>r</i>.
|
|
||||||
Even if this occurs, it does not imply that reads happening after <i>r</i>
|
|
||||||
will observe writes that happened before <i>w</i>.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -769,197 +566,3 @@ value for <code>g.msg</code>.
|
|||||||
In all these examples, the solution is the same:
|
In all these examples, the solution is the same:
|
||||||
use explicit synchronization.
|
use explicit synchronization.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="badcompiler">Incorrect compilation</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The Go memory model restricts compiler optimizations as much as it does Go programs.
|
|
||||||
Some compiler optimizations that would be valid in single-threaded programs are not valid in all Go programs.
|
|
||||||
In particular, a compiler must not introduce writes that do not exist in the original program,
|
|
||||||
it must not allow a single read to observe multiple values,
|
|
||||||
and it must not allow a single write to write multiple values.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
All the following examples assume that `*p` and `*q` refer to
|
|
||||||
memory locations accessible to multiple goroutines.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Not introducing data races into race-free programs means not moving
|
|
||||||
writes out of conditional statements in which they appear.
|
|
||||||
For example, a compiler must not invert the conditional in this program:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
*p = 1
|
|
||||||
if cond {
|
|
||||||
*p = 2
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
That is, the compiler must not rewrite the program into this one:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
*p = 2
|
|
||||||
if !cond {
|
|
||||||
*p = 1
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If <code>cond</code> is false and another goroutine is reading <code>*p</code>,
|
|
||||||
then in the original program, the other goroutine can only observe any prior value of <code>*p</code> and <code>1</code>.
|
|
||||||
In the rewritten program, the other goroutine can observe <code>2</code>, which was previously impossible.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Not introducing data races also means not assuming that loops terminate.
|
|
||||||
For example, a compiler must in general not move the accesses to <code>*p</code> or <code>*q</code>
|
|
||||||
ahead of the loop in this program:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
n := 0
|
|
||||||
for e := list; e != nil; e = e.next {
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
i := *p
|
|
||||||
*q = 1
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If <code>list</code> pointed to a cyclic list,
|
|
||||||
then the original program would never access <code>*p</code> or <code>*q</code>,
|
|
||||||
but the rewritten program would.
|
|
||||||
(Moving `*p` ahead would be safe if the compiler can prove `*p` will not panic;
|
|
||||||
moving `*q` ahead would also require the compiler proving that no other
|
|
||||||
goroutine can access `*q`.)
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Not introducing data races also means not assuming that called functions
|
|
||||||
always return or are free of synchronization operations.
|
|
||||||
For example, a compiler must not move the accesses to <code>*p</code> or <code>*q</code>
|
|
||||||
ahead of the function call in this program
|
|
||||||
(at least not without direct knowledge of the precise behavior of <code>f</code>):
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
f()
|
|
||||||
i := *p
|
|
||||||
*q = 1
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If the call never returned, then once again the original program
|
|
||||||
would never access <code>*p</code> or <code>*q</code>, but the rewritten program would.
|
|
||||||
And if the call contained synchronizing operations, then the original program
|
|
||||||
could establish happens before edges preceding the accesses
|
|
||||||
to <code>*p</code> and <code>*q</code>, but the rewritten program would not.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Not allowing a single read to observe multiple values means
|
|
||||||
not reloading local variables from shared memory.
|
|
||||||
For example, a compiler must not discard <code>i</code> and reload it
|
|
||||||
a second time from <code>*p</code> in this program:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
i := *p
|
|
||||||
if i < 0 || i >= len(funcs) {
|
|
||||||
panic("invalid function index")
|
|
||||||
}
|
|
||||||
... complex code ...
|
|
||||||
// compiler must NOT reload i = *p here
|
|
||||||
funcs[i]()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If the complex code needs many registers, a compiler for single-threaded programs
|
|
||||||
could discard <code>i</code> without saving a copy and then reload
|
|
||||||
<code>i = *p</code> just before
|
|
||||||
<code>funcs[i]()</code>.
|
|
||||||
A Go compiler must not, because the value of <code>*p</code> may have changed.
|
|
||||||
(Instead, the compiler could spill <code>i</code> to the stack.)
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Not allowing a single write to write multiple values also means not using
|
|
||||||
the memory where a local variable will be written as temporary storage before the write.
|
|
||||||
For example, a compiler must not use <code>*p</code> as temporary storage in this program:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
*p = i + *p/2
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
That is, it must not rewrite the program into this one:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
*p /= 2
|
|
||||||
*p += i
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If <code>i</code> and <code>*p</code> start equal to 2,
|
|
||||||
the original code does <code>*p = 3</code>,
|
|
||||||
so a racing thread can read only 2 or 3 from <code>*p</code>.
|
|
||||||
The rewritten code does <code>*p = 1</code> and then <code>*p = 3</code>,
|
|
||||||
allowing a racing thread to read 1 as well.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note that all these optimizations are permitted in C/C++ compilers:
|
|
||||||
a Go compiler sharing a back end with a C/C++ compiler must take care
|
|
||||||
to disable optimizations that are invalid for Go.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note that the prohibition on introducing data races
|
|
||||||
does not apply if the compiler can prove that the races
|
|
||||||
do not affect correct execution on the target platform.
|
|
||||||
For example, on essentially all CPUs, it is valid to rewrite
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
n := 0
|
|
||||||
for i := 0; i < m; i++ {
|
|
||||||
n += *shared
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
into:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
n := 0
|
|
||||||
local := *shared
|
|
||||||
for i := 0; i < m; i++ {
|
|
||||||
n += local
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
provided it can be proved that <code>*shared</code> will not fault on access,
|
|
||||||
because the potential added read will not affect any existing concurrent reads or writes.
|
|
||||||
On the other hand, the rewrite would not be valid in a source-to-source translator.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="conclusion">Conclusion</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go programmers writing data-race-free programs can rely on
|
|
||||||
sequentially consistent execution of those programs,
|
|
||||||
just as in essentially all other modern programming languages.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
When it comes to programs with races,
|
|
||||||
both programmers and compilers should remember the advice:
|
|
||||||
don't be clever.
|
|
||||||
</p>
|
|
||||||
|
|||||||
1185
doc/go_spec.html
1185
doc/go_spec.html
File diff suppressed because it is too large
Load Diff
201
doc/godebug.md
201
doc/godebug.md
@@ -1,201 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Go, Backwards Compatibility, and GODEBUG"
|
|
||||||
layout: article
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This document is kept in the Go repo, not x/website,
|
|
||||||
because it documents the full list of known GODEBUG settings,
|
|
||||||
which are tied to a specific release.
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Introduction {#intro}
|
|
||||||
|
|
||||||
Go's emphasis on backwards compatibility is one of its key strengths.
|
|
||||||
There are, however, times when we cannot maintain complete compatibility.
|
|
||||||
If code depends on buggy (including insecure) behavior,
|
|
||||||
then fixing the bug will break that code.
|
|
||||||
New features can also have similar impacts:
|
|
||||||
enabling the HTTP/2 use by the HTTP client broke programs
|
|
||||||
connecting to servers with buggy HTTP/2 implementations.
|
|
||||||
These kinds of changes are unavoidable and
|
|
||||||
[permitted by the Go 1 compatibility rules](/doc/go1compat).
|
|
||||||
Even so, Go provides a mechanism called GODEBUG to
|
|
||||||
reduce the impact such changes have on Go developers
|
|
||||||
using newer toolchains to compile old code.
|
|
||||||
|
|
||||||
A GODEBUG setting is a `key=value` pair
|
|
||||||
that controls the execution of certain parts of a Go program.
|
|
||||||
The environment variable `GODEBUG`
|
|
||||||
can hold a comma-separated list of these settings.
|
|
||||||
For example, if a Go program is running in an environment that contains
|
|
||||||
|
|
||||||
GODEBUG=http2client=0,http2server=0
|
|
||||||
|
|
||||||
then that Go program will disable the use of HTTP/2 by default in both
|
|
||||||
the HTTP client and the HTTP server.
|
|
||||||
It is also possible to set the default `GODEBUG` for a given program
|
|
||||||
(discussed below).
|
|
||||||
|
|
||||||
When preparing any change that is permitted by Go 1 compatibility
|
|
||||||
but may nonetheless break some existing programs,
|
|
||||||
we first engineer the change to keep as many existing programs working as possible.
|
|
||||||
For the remaining programs,
|
|
||||||
we define a new GODEBUG setting that
|
|
||||||
allows individual programs to opt back in to the old behavior.
|
|
||||||
A GODEBUG setting may not be added if doing so is infeasible,
|
|
||||||
but that should be extremely rare.
|
|
||||||
|
|
||||||
GODEBUG settings added for compatibility will be maintained
|
|
||||||
for a minimum of two years (four Go releases).
|
|
||||||
Some, such as `http2client` and `http2server`,
|
|
||||||
will be maintained much longer, even indefinitely.
|
|
||||||
|
|
||||||
When possible, each GODEBUG setting has an associated
|
|
||||||
[runtime/metrics](/pkg/runtime/metrics/) counter
|
|
||||||
named `/godebug/non-default-behavior/<name>:events`
|
|
||||||
that counts the number of times a particular program's
|
|
||||||
behavior has changed based on a non-default value
|
|
||||||
for that setting.
|
|
||||||
For example, when `GODEBUG=http2client=0` is set,
|
|
||||||
`/godebug/non-default-behavior/http2client:events`
|
|
||||||
counts the number of HTTP transports that the program
|
|
||||||
has configured without HTTP/2 support.
|
|
||||||
|
|
||||||
## Default GODEBUG Values {#default}
|
|
||||||
|
|
||||||
When a GODEBUG setting is not listed in the environment variable,
|
|
||||||
its value is derived from three sources:
|
|
||||||
the defaults for the Go toolchain used to build the program,
|
|
||||||
amended to match the Go version listed in `go.mod`,
|
|
||||||
and then overridden by explicit `//go:debug` lines in the program.
|
|
||||||
|
|
||||||
The [GODEBUG History](#history) gives the exact defaults for each Go toolchain version.
|
|
||||||
For example, Go 1.21 introduces the `panicnil` setting,
|
|
||||||
controlling whether `panic(nil)` is allowed;
|
|
||||||
it defaults to `panicnil=0`, making `panic(nil)` a run-time error.
|
|
||||||
Using `panicnil=1` restores the behavior of Go 1.20 and earlier.
|
|
||||||
|
|
||||||
When compiling a work module or workspace that declares
|
|
||||||
an older Go version, the Go toolchain amends its defaults
|
|
||||||
to match that older Go version as closely as possible.
|
|
||||||
For example, when a Go 1.21 toolchain compiles a program,
|
|
||||||
if the work module's `go.mod` or the workspace's `go.work`
|
|
||||||
says `go` `1.20`, then the program defaults to `panicnil=1`,
|
|
||||||
matching Go 1.20 instead of Go 1.21.
|
|
||||||
|
|
||||||
Because this method of setting GODEBUG defaults was introduced only in Go 1.21,
|
|
||||||
programs listing versions of Go earlier than Go 1.20 are configured to match Go 1.20,
|
|
||||||
not the older version.
|
|
||||||
|
|
||||||
To override these defaults, a main package's source files
|
|
||||||
can include one or more `//go:debug` directives at the top of the file
|
|
||||||
(preceding the `package` statement).
|
|
||||||
Continuing the `panicnil` example, if the module or workspace is updated
|
|
||||||
to say `go` `1.21`, the program can opt back into the old `panic(nil)`
|
|
||||||
behavior by including this directive:
|
|
||||||
|
|
||||||
//go:debug panicnil=1
|
|
||||||
|
|
||||||
Starting in Go 1.21, the Go toolchain treats a `//go:debug` directive
|
|
||||||
with an unrecognized GODEBUG setting as an invalid program.
|
|
||||||
Programs with more than one `//go:debug` line for a given setting
|
|
||||||
are also treated as invalid.
|
|
||||||
(Older toolchains ignore `//go:debug` directives entirely.)
|
|
||||||
|
|
||||||
The defaults that will be compiled into a main package
|
|
||||||
are reported by the command:
|
|
||||||
|
|
||||||
{{raw `
|
|
||||||
go list -f '{{.DefaultGODEBUG}}' my/main/package
|
|
||||||
`}}
|
|
||||||
|
|
||||||
Only differences from the base Go toolchain defaults are reported.
|
|
||||||
|
|
||||||
When testing a package, `//go:debug` lines in the `*_test.go`
|
|
||||||
files are treated as directives for the test's main package.
|
|
||||||
In any other context, `//go:debug` lines are ignored by the toolchain;
|
|
||||||
`go` `vet` reports such lines as misplaced.
|
|
||||||
|
|
||||||
## GODEBUG History {#history}
|
|
||||||
|
|
||||||
This section documents the GODEBUG settings introduced and removed in each major Go release
|
|
||||||
for compatibility reasons.
|
|
||||||
Packages or programs may define additional settings for internal debugging purposes;
|
|
||||||
for example,
|
|
||||||
see the [runtime documentation](/pkg/runtime#hdr-Environment_Variables)
|
|
||||||
and the [go command documentation](/cmd/go#hdr-Build_and_test_caching).
|
|
||||||
|
|
||||||
### Go 1.21
|
|
||||||
|
|
||||||
Go 1.21 made it a run-time error to call `panic` with a nil interface value,
|
|
||||||
controlled by the [`panicnil` setting](/pkg/builtin/#panic).
|
|
||||||
|
|
||||||
Go 1.21 made it an error for html/template actions to appear inside of an ECMAScript 6
|
|
||||||
template literal, controlled by the
|
|
||||||
[`jstmpllitinterp` setting](/pkg/html/template#hdr-Security_Model).
|
|
||||||
This behavior was backported to Go 1.19.8+ and Go 1.20.3+.
|
|
||||||
|
|
||||||
Go 1.21 introduced a limit on the maximum number of MIME headers and multipart
|
|
||||||
forms, controlled by the
|
|
||||||
[`multipartmaxheaders` and `multipartmaxparts` settings](/pkg/mime/multipart#hdr-Limits)
|
|
||||||
respectively.
|
|
||||||
This behavior was backported to Go 1.19.8+ and Go 1.20.3+.
|
|
||||||
|
|
||||||
There is no plan to remove any of these settings.
|
|
||||||
|
|
||||||
### Go 1.20
|
|
||||||
|
|
||||||
Go 1.20 introduced support for rejecting insecure paths in tar and zip archives,
|
|
||||||
controlled by the [`tarinsecurepath` setting](/pkg/archive/tar/#Reader.Next)
|
|
||||||
and the [`zipinsecurepath` setting](/pkg/archive/zip/#NewReader).
|
|
||||||
These default to `tarinsecurepath=1` and `zipinsecurepath=1`,
|
|
||||||
preserving the behavior of earlier versions of Go.
|
|
||||||
A future version of Go may change the defaults to
|
|
||||||
`tarinsecurepath=0` and `zipinsecurepath=0`.
|
|
||||||
|
|
||||||
Go 1.20 introduced automatic seeding of the
|
|
||||||
[`math/rand`](/pkg/math/rand) global random number generator,
|
|
||||||
controlled by the [`randautoseed` setting](/pkg/math/rand/#Seed).
|
|
||||||
|
|
||||||
Go 1.20 introduced the concept of fallback roots for use during certificate verification,
|
|
||||||
controlled by the [`x509usefallbackroots` setting](/pkg/crypto/x509/#SetFallbackRoots).
|
|
||||||
|
|
||||||
Go 1.20 removed the preinstalled `.a` files for the standard library
|
|
||||||
from the Go distribution.
|
|
||||||
Installations now build and cache the standard library like
|
|
||||||
packages in other modules.
|
|
||||||
The [`installgoroot` setting](/cmd/go#hdr-Compile_and_install_packages_and_dependencies)
|
|
||||||
restores the installation and use of preinstalled `.a` files.
|
|
||||||
|
|
||||||
There is no plan to remove any of these settings.
|
|
||||||
|
|
||||||
### Go 1.19
|
|
||||||
|
|
||||||
Go 1.19 made it an error for path lookups to resolve to binaries in the current directory,
|
|
||||||
controlled by the [`execerrdot` setting](/pkg/os/exec#hdr-Executables_in_the_current_directory).
|
|
||||||
There is no plan to remove this setting.
|
|
||||||
|
|
||||||
### Go 1.18
|
|
||||||
|
|
||||||
Go 1.18 removed support for SHA1 in most X.509 certificates,
|
|
||||||
controlled by the [`x509sha1` setting](/crypto/x509#InsecureAlgorithmError).
|
|
||||||
This setting will be removed in a future release, Go 1.22 at the earliest.
|
|
||||||
|
|
||||||
### Go 1.10
|
|
||||||
|
|
||||||
Go 1.10 changed how build caching worked and added test caching, along
|
|
||||||
with the [`gocacheverify`, `gocachehash`, and `gocachetest` settings](/cmd/go/#hdr-Build_and_test_caching).
|
|
||||||
There is no plan to remove these settings.
|
|
||||||
|
|
||||||
### Go 1.6
|
|
||||||
|
|
||||||
Go 1.6 introduced transparent support for HTTP/2,
|
|
||||||
controlled by the [`http2client`, `http2server`, and `http2debug` settings](/pkg/net/http/#hdr-HTTP_2).
|
|
||||||
There is no plan to remove these settings.
|
|
||||||
|
|
||||||
### Go 1.5
|
|
||||||
|
|
||||||
Go 1.5 introduced a pure Go DNS resolver,
|
|
||||||
controlled by the [`netdns` setting](/pkg/net/#hdr-Name_Resolution).
|
|
||||||
There is no plan to remove this setting.
|
|
||||||
12
go.env
12
go.env
@@ -1,12 +0,0 @@
|
|||||||
# This file contains the initial defaults for go command configuration.
|
|
||||||
# Values set by 'go env -w' and written to the user's go/env file override these.
|
|
||||||
# The environment overrides everything else.
|
|
||||||
|
|
||||||
# Use the Go module mirror and checksum database by default.
|
|
||||||
# See https://proxy.golang.org for details.
|
|
||||||
GOPROXY=https://proxy.golang.org,direct
|
|
||||||
GOSUMDB=sum.golang.org
|
|
||||||
|
|
||||||
# Automatically download newer toolchains as directed by go.mod files.
|
|
||||||
# See https://go.dev/doc/toolchain for details.
|
|
||||||
GOTOOLCHAIN=auto
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
// Copyright 2022 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build ignore
|
|
||||||
|
|
||||||
// Mkzip writes a zoneinfo.zip with the content of the current directory
|
|
||||||
// and its subdirectories, with no compression, suitable for package time.
|
|
||||||
//
|
|
||||||
// Usage:
|
|
||||||
//
|
|
||||||
// go run ../../mkzip.go ../../zoneinfo.zip
|
|
||||||
//
|
|
||||||
// We use this program instead of 'zip -0 -r ../../zoneinfo.zip *' to get
|
|
||||||
// a reproducible generator that does not depend on which version of the
|
|
||||||
// external zip tool is used or the ordering of file names in a directory
|
|
||||||
// or the current time.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"archive/zip"
|
|
||||||
"bytes"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"hash/crc32"
|
|
||||||
"io/fs"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func usage() {
|
|
||||||
fmt.Fprintf(os.Stderr, "usage: go run mkzip.go ../../zoneinfo.zip\n")
|
|
||||||
os.Exit(2)
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
log.SetPrefix("mkzip: ")
|
|
||||||
log.SetFlags(0)
|
|
||||||
flag.Usage = usage
|
|
||||||
flag.Parse()
|
|
||||||
args := flag.Args()
|
|
||||||
if len(args) != 1 || !strings.HasSuffix(args[0], ".zip") {
|
|
||||||
usage()
|
|
||||||
}
|
|
||||||
|
|
||||||
var zb bytes.Buffer
|
|
||||||
zw := zip.NewWriter(&zb)
|
|
||||||
seen := make(map[string]bool)
|
|
||||||
err := filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error {
|
|
||||||
if d.IsDir() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
data, err := os.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if strings.HasSuffix(path, ".zip") {
|
|
||||||
log.Fatalf("unexpected file during walk: %s", path)
|
|
||||||
}
|
|
||||||
name := filepath.ToSlash(path)
|
|
||||||
w, err := zw.CreateRaw(&zip.FileHeader{
|
|
||||||
Name: name,
|
|
||||||
Method: zip.Store,
|
|
||||||
CompressedSize64: uint64(len(data)),
|
|
||||||
UncompressedSize64: uint64(len(data)),
|
|
||||||
CRC32: crc32.ChecksumIEEE(data),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if _, err := w.Write(data); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
seen[name] = true
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if err := zw.Close(); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if len(seen) == 0 {
|
|
||||||
log.Fatalf("did not find any files to add")
|
|
||||||
}
|
|
||||||
if !seen["US/Eastern"] {
|
|
||||||
log.Fatalf("did not find US/Eastern to add")
|
|
||||||
}
|
|
||||||
if err := os.WriteFile(args[0], zb.Bytes(), 0666); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,82 +5,35 @@
|
|||||||
|
|
||||||
# This script rebuilds the time zone files using files
|
# This script rebuilds the time zone files using files
|
||||||
# downloaded from the ICANN/IANA distribution.
|
# downloaded from the ICANN/IANA distribution.
|
||||||
#
|
# Consult https://www.iana.org/time-zones for the latest versions.
|
||||||
# To prepare an update for a new Go release,
|
|
||||||
# consult https://www.iana.org/time-zones for the latest versions,
|
|
||||||
# update CODE and DATA below, and then run
|
|
||||||
#
|
|
||||||
# ./update.bash -commit
|
|
||||||
#
|
|
||||||
# That will prepare the files and create the commit.
|
|
||||||
#
|
|
||||||
# To review such a commit (as the reviewer), use:
|
|
||||||
#
|
|
||||||
# git codereview change NNNNNN # CL number
|
|
||||||
# cd lib/time
|
|
||||||
# ./update.bash
|
|
||||||
#
|
|
||||||
# If it prints "No updates needed.", then the generated files
|
|
||||||
# in the CL match the update.bash in the CL.
|
|
||||||
|
|
||||||
# Versions to use.
|
# Versions to use.
|
||||||
CODE=2023c
|
CODE=2021e
|
||||||
DATA=2023c
|
DATA=2021e
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
cd $(dirname $0)
|
|
||||||
rm -rf work
|
rm -rf work
|
||||||
mkdir work
|
mkdir work
|
||||||
go build -o work/mkzip mkzip.go # build now for correct paths in build errors
|
|
||||||
cd work
|
cd work
|
||||||
mkdir zoneinfo
|
mkdir zoneinfo
|
||||||
curl -sS -L -O https://www.iana.org/time-zones/repository/releases/tzcode$CODE.tar.gz
|
curl -L -O https://www.iana.org/time-zones/repository/releases/tzcode$CODE.tar.gz
|
||||||
curl -sS -L -O https://www.iana.org/time-zones/repository/releases/tzdata$DATA.tar.gz
|
curl -L -O https://www.iana.org/time-zones/repository/releases/tzdata$DATA.tar.gz
|
||||||
tar xzf tzcode$CODE.tar.gz
|
tar xzf tzcode$CODE.tar.gz
|
||||||
tar xzf tzdata$DATA.tar.gz
|
tar xzf tzdata$DATA.tar.gz
|
||||||
|
|
||||||
if ! make CFLAGS=-DSTD_INSPIRED AWK=awk TZDIR=zoneinfo posix_only >make.out 2>&1; then
|
make CFLAGS=-DSTD_INSPIRED AWK=awk TZDIR=zoneinfo posix_only
|
||||||
cat make.out
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd zoneinfo
|
cd zoneinfo
|
||||||
../mkzip ../../zoneinfo.zip
|
rm -f ../../zoneinfo.zip
|
||||||
|
zip -0 -r ../../zoneinfo.zip *
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
files="update.bash zoneinfo.zip"
|
go generate time/tzdata
|
||||||
modified=true
|
|
||||||
if git diff --quiet $files; then
|
|
||||||
modified=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
echo
|
||||||
if [ "$1" = "-work" ]; then
|
if [ "$1" = "-work" ]; then
|
||||||
echo Left workspace behind in work/.
|
echo Left workspace behind in work/.
|
||||||
shift
|
|
||||||
else
|
else
|
||||||
rm -rf work
|
rm -rf work
|
||||||
fi
|
fi
|
||||||
|
echo New time zone files in zoneinfo.zip.
|
||||||
if ! $modified; then
|
|
||||||
echo No updates needed.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo Updated for $CODE/$DATA: $files
|
|
||||||
|
|
||||||
commitmsg="lib/time: update to $CODE/$DATA
|
|
||||||
|
|
||||||
Commit generated by update.bash.
|
|
||||||
|
|
||||||
For #22487.
|
|
||||||
"
|
|
||||||
|
|
||||||
if [ "$1" = "-commit" ]; then
|
|
||||||
echo "Creating commit. Run 'git reset HEAD^' to undo commit."
|
|
||||||
echo
|
|
||||||
git commit -m "$commitmsg" $files
|
|
||||||
echo
|
|
||||||
git log -n1 --stat
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|||||||
Binary file not shown.
341
misc/android/go_android_exec.go
Normal file
341
misc/android/go_android_exec.go
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build ignore
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
// This program can be used as go_android_GOARCH_exec by the Go tool.
|
||||||
|
// It executes binaries on an android device using adb.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"go/build"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"os/signal"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func run(args ...string) (string, error) {
|
||||||
|
cmd := adbCmd(args...)
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
cmd.Stdout = io.MultiWriter(os.Stdout, buf)
|
||||||
|
// If the adb subprocess somehow hangs, go test will kill this wrapper
|
||||||
|
// and wait for our os.Stderr (and os.Stdout) to close as a result.
|
||||||
|
// However, if the os.Stderr (or os.Stdout) file descriptors are
|
||||||
|
// passed on, the hanging adb subprocess will hold them open and
|
||||||
|
// go test will hang forever.
|
||||||
|
//
|
||||||
|
// Avoid that by wrapping stderr, breaking the short circuit and
|
||||||
|
// forcing cmd.Run to use another pipe and goroutine to pass
|
||||||
|
// along stderr from adb.
|
||||||
|
cmd.Stderr = struct{ io.Writer }{os.Stderr}
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("adb %s: %v", strings.Join(args, " "), err)
|
||||||
|
}
|
||||||
|
return buf.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func adb(args ...string) error {
|
||||||
|
if out, err := adbCmd(args...).CombinedOutput(); err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "adb %s\n%s", strings.Join(args, " "), out)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func adbCmd(args ...string) *exec.Cmd {
|
||||||
|
if flags := os.Getenv("GOANDROID_ADB_FLAGS"); flags != "" {
|
||||||
|
args = append(strings.Split(flags, " "), args...)
|
||||||
|
}
|
||||||
|
return exec.Command("adb", args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
deviceRoot = "/data/local/tmp/go_android_exec"
|
||||||
|
deviceGoroot = deviceRoot + "/goroot"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.SetFlags(0)
|
||||||
|
log.SetPrefix("go_android_exec: ")
|
||||||
|
exitCode, err := runMain()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
os.Exit(exitCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
func runMain() (int, error) {
|
||||||
|
// Concurrent use of adb is flaky, so serialize adb commands.
|
||||||
|
// See https://github.com/golang/go/issues/23795 or
|
||||||
|
// https://issuetracker.google.com/issues/73230216.
|
||||||
|
lockPath := filepath.Join(os.TempDir(), "go_android_exec-adb-lock")
|
||||||
|
lock, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0666)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer lock.Close()
|
||||||
|
if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// In case we're booting a device or emulator alongside all.bash, wait for
|
||||||
|
// it to be ready. adb wait-for-device is not enough, we have to
|
||||||
|
// wait for sys.boot_completed.
|
||||||
|
if err := adb("wait-for-device", "exec-out", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;"); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done once per make.bash.
|
||||||
|
if err := adbCopyGoroot(); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare a temporary directory that will be cleaned up at the end.
|
||||||
|
// Binary names can conflict.
|
||||||
|
// E.g. template.test from the {html,text}/template packages.
|
||||||
|
binName := filepath.Base(os.Args[1])
|
||||||
|
deviceGotmp := fmt.Sprintf(deviceRoot+"/%s-%d", binName, os.Getpid())
|
||||||
|
deviceGopath := deviceGotmp + "/gopath"
|
||||||
|
defer adb("exec-out", "rm", "-rf", deviceGotmp) // Clean up.
|
||||||
|
|
||||||
|
// Determine the package by examining the current working
|
||||||
|
// directory, which will look something like
|
||||||
|
// "$GOROOT/src/mime/multipart" or "$GOPATH/src/golang.org/x/mobile".
|
||||||
|
// We extract everything after the $GOROOT or $GOPATH to run on the
|
||||||
|
// same relative directory on the target device.
|
||||||
|
subdir, inGoRoot, err := subdir()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
deviceCwd := filepath.Join(deviceGopath, subdir)
|
||||||
|
if inGoRoot {
|
||||||
|
deviceCwd = filepath.Join(deviceGoroot, subdir)
|
||||||
|
} else {
|
||||||
|
if err := adb("exec-out", "mkdir", "-p", deviceCwd); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if err := adbCopyTree(deviceCwd, subdir); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy .go files from the package.
|
||||||
|
goFiles, err := filepath.Glob("*.go")
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if len(goFiles) > 0 {
|
||||||
|
args := append(append([]string{"push"}, goFiles...), deviceCwd)
|
||||||
|
if err := adb(args...); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName)
|
||||||
|
if err := adb("push", os.Args[1], deviceBin); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forward SIGQUIT from the go command to show backtraces from
|
||||||
|
// the binary instead of from this wrapper.
|
||||||
|
quit := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(quit, syscall.SIGQUIT)
|
||||||
|
go func() {
|
||||||
|
for range quit {
|
||||||
|
// We don't have the PID of the running process; use the
|
||||||
|
// binary name instead.
|
||||||
|
adb("exec-out", "killall -QUIT "+binName)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
// In light of
|
||||||
|
// https://code.google.com/p/android/issues/detail?id=3254
|
||||||
|
// dont trust the exitcode of adb. Instead, append the exitcode to
|
||||||
|
// the output and parse it from there.
|
||||||
|
const exitstr = "exitcode="
|
||||||
|
cmd := `export TMPDIR="` + deviceGotmp + `"` +
|
||||||
|
`; export GOROOT="` + deviceGoroot + `"` +
|
||||||
|
`; export GOPATH="` + deviceGopath + `"` +
|
||||||
|
`; export CGO_ENABLED=0` +
|
||||||
|
`; export GOPROXY=` + os.Getenv("GOPROXY") +
|
||||||
|
`; export GOCACHE="` + deviceRoot + `/gocache"` +
|
||||||
|
`; export PATH=$PATH:"` + deviceGoroot + `/bin"` +
|
||||||
|
`; cd "` + deviceCwd + `"` +
|
||||||
|
"; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ") +
|
||||||
|
"; echo -n " + exitstr + "$?"
|
||||||
|
output, err := run("exec-out", cmd)
|
||||||
|
signal.Reset(syscall.SIGQUIT)
|
||||||
|
close(quit)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
exitIdx := strings.LastIndex(output, exitstr)
|
||||||
|
if exitIdx == -1 {
|
||||||
|
return 0, fmt.Errorf("no exit code: %q", output)
|
||||||
|
}
|
||||||
|
code, err := strconv.Atoi(output[exitIdx+len(exitstr):])
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("bad exit code: %v", err)
|
||||||
|
}
|
||||||
|
return code, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// subdir determines the package based on the current working directory,
|
||||||
|
// and returns the path to the package source relative to $GOROOT (or $GOPATH).
|
||||||
|
func subdir() (pkgpath string, underGoRoot bool, err error) {
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
cwd, err = filepath.EvalSymlinks(cwd)
|
||||||
|
if err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
goroot, err := filepath.EvalSymlinks(runtime.GOROOT())
|
||||||
|
if err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
if subdir, err := filepath.Rel(goroot, cwd); err == nil {
|
||||||
|
if !strings.Contains(subdir, "..") {
|
||||||
|
return subdir, true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range filepath.SplitList(build.Default.GOPATH) {
|
||||||
|
pabs, err := filepath.EvalSymlinks(p)
|
||||||
|
if err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
if subdir, err := filepath.Rel(pabs, cwd); err == nil {
|
||||||
|
if !strings.Contains(subdir, "..") {
|
||||||
|
return subdir, false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", false, fmt.Errorf("the current path %q is not in either GOROOT(%q) or GOPATH(%q)",
|
||||||
|
cwd, runtime.GOROOT(), build.Default.GOPATH)
|
||||||
|
}
|
||||||
|
|
||||||
|
// adbCopyTree copies testdata, go.mod, go.sum files from subdir
|
||||||
|
// and from parent directories all the way up to the root of subdir.
|
||||||
|
// go.mod and go.sum files are needed for the go tool modules queries,
|
||||||
|
// and the testdata directories for tests. It is common for tests to
|
||||||
|
// reach out into testdata from parent packages.
|
||||||
|
func adbCopyTree(deviceCwd, subdir string) error {
|
||||||
|
dir := ""
|
||||||
|
for {
|
||||||
|
for _, path := range []string{"testdata", "go.mod", "go.sum"} {
|
||||||
|
path := filepath.Join(dir, path)
|
||||||
|
if _, err := os.Stat(path); err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
devicePath := filepath.Join(deviceCwd, dir)
|
||||||
|
if err := adb("exec-out", "mkdir", "-p", devicePath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := adb("push", path, devicePath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if subdir == "." {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
subdir = filepath.Dir(subdir)
|
||||||
|
dir = filepath.Join(dir, "..")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// adbCopyGoroot clears deviceRoot for previous versions of GOROOT, GOPATH
|
||||||
|
// and temporary data. Then, it copies relevant parts of GOROOT to the device,
|
||||||
|
// including the go tool built for android.
|
||||||
|
// A lock file ensures this only happens once, even with concurrent exec
|
||||||
|
// wrappers.
|
||||||
|
func adbCopyGoroot() error {
|
||||||
|
// Also known by cmd/dist. The bootstrap command deletes the file.
|
||||||
|
statPath := filepath.Join(os.TempDir(), "go_android_exec-adb-sync-status")
|
||||||
|
stat, err := os.OpenFile(statPath, os.O_CREATE|os.O_RDWR, 0666)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer stat.Close()
|
||||||
|
// Serialize check and copying.
|
||||||
|
if err := syscall.Flock(int(stat.Fd()), syscall.LOCK_EX); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s, err := io.ReadAll(stat)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if string(s) == "done" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Delete GOROOT, GOPATH and any leftover test data.
|
||||||
|
if err := adb("exec-out", "rm", "-rf", deviceRoot); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
deviceBin := filepath.Join(deviceGoroot, "bin")
|
||||||
|
if err := adb("exec-out", "mkdir", "-p", deviceBin); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
goroot := runtime.GOROOT()
|
||||||
|
// Build go for android.
|
||||||
|
goCmd := filepath.Join(goroot, "bin", "go")
|
||||||
|
tmpGo, err := os.CreateTemp("", "go_android_exec-cmd-go-*")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
tmpGo.Close()
|
||||||
|
defer os.Remove(tmpGo.Name())
|
||||||
|
|
||||||
|
if out, err := exec.Command(goCmd, "build", "-o", tmpGo.Name(), "cmd/go").CombinedOutput(); err != nil {
|
||||||
|
return fmt.Errorf("failed to build go tool for device: %s\n%v", out, err)
|
||||||
|
}
|
||||||
|
deviceGo := filepath.Join(deviceBin, "go")
|
||||||
|
if err := adb("push", tmpGo.Name(), deviceGo); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, dir := range []string{"src", "test", "lib", "api"} {
|
||||||
|
if err := adb("push", filepath.Join(goroot, dir), filepath.Join(deviceGoroot)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy only the relevant from pkg.
|
||||||
|
if err := adb("exec-out", "mkdir", "-p", filepath.Join(deviceGoroot, "pkg", "tool")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := adb("push", filepath.Join(goroot, "pkg", "include"), filepath.Join(deviceGoroot, "pkg")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
runtimea, err := exec.Command(goCmd, "list", "-f", "{{.Target}}", "runtime").Output()
|
||||||
|
pkgdir := filepath.Dir(string(runtimea))
|
||||||
|
if pkgdir == "" {
|
||||||
|
return errors.New("could not find android pkg dir")
|
||||||
|
}
|
||||||
|
if err := adb("push", pkgdir, filepath.Join(deviceGoroot, "pkg")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
tooldir := filepath.Join(goroot, "pkg", "tool", filepath.Base(pkgdir))
|
||||||
|
if err := adb("push", tooldir, filepath.Join(deviceGoroot, "pkg", "tool")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := stat.Write([]byte("done")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
58
misc/arm/a
Executable file
58
misc/arm/a
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
# Use of this source code is governed by a BSD-style
|
||||||
|
# license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
# This is a small script for executing go binaries on the android platform.
|
||||||
|
#
|
||||||
|
# example:
|
||||||
|
# ./a 5.out foo bar baz
|
||||||
|
#
|
||||||
|
# The script exports the local values of GOARCH, GOTRACEBACK and GOGC
|
||||||
|
# to the android environment.
|
||||||
|
#
|
||||||
|
# Known issues:
|
||||||
|
# The script fails unless the last character output by the program is "\n"
|
||||||
|
#
|
||||||
|
# TODO(kaib): add gdb bridge support
|
||||||
|
|
||||||
|
exp ()
|
||||||
|
{
|
||||||
|
if [ ${!1} ]; then
|
||||||
|
echo "export $1=\"${!1}\"; "
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# adb does not correctly return the exit value of the executed program. use this
|
||||||
|
# wrapper to manually extract the exit value
|
||||||
|
rloc=/data/local/tmp/retval
|
||||||
|
rsize=$(adb shell "ls -l $rloc"|tr -s ' '|cut -d' ' -f4)
|
||||||
|
rcheck=38
|
||||||
|
if [ "$rsize" != "$rcheck" ]; then
|
||||||
|
# echo "debug: retval size incorrect want $rcheck, got $rsize. uploading"
|
||||||
|
echo >/tmp/adb.retval '#!/system/bin/sh
|
||||||
|
"$@"
|
||||||
|
echo RETVAL: $?'
|
||||||
|
adb push /tmp/adb.retval $rloc >/dev/null 2>&1
|
||||||
|
adb shell chmod 755 $rloc
|
||||||
|
fi
|
||||||
|
|
||||||
|
# run the main binary
|
||||||
|
if [ "-g" == "$1" ]; then
|
||||||
|
adb forward tcp:$2 tcp:$2
|
||||||
|
args=$(echo $*| cut -d' ' -f4-)
|
||||||
|
adb push $3 /data/local/tmp/$3 >/dev/null 2>&1
|
||||||
|
adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \
|
||||||
|
gdbserver :$2 /data/local/tmp/retval /data/local/tmp/$3 $args" \
|
||||||
|
2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL
|
||||||
|
else
|
||||||
|
if [ "$*" != "$1" ]; then
|
||||||
|
args=$(echo $*| cut -d' ' -f2-)
|
||||||
|
fi
|
||||||
|
adb push $1 /data/local/tmp/$1 >/dev/null 2>&1
|
||||||
|
adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \
|
||||||
|
/data/local/tmp/retval /data/local/tmp/$1 $args" \
|
||||||
|
2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL
|
||||||
|
fi
|
||||||
|
exit $(grep RETVAL /tmp/adb.out|tr -d '\n\r'| cut -d' ' -f2)
|
||||||
108
misc/boring/README.md
Normal file
108
misc/boring/README.md
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
# README.md
|
||||||
|
|
||||||
|
This directory holds build scripts for unofficial, unsupported
|
||||||
|
distributions of Go+BoringCrypto.
|
||||||
|
|
||||||
|
## Version strings
|
||||||
|
|
||||||
|
The distribution name for a Go+BoringCrypto release has the form `<GoVersion>b<BoringCryptoVersion>`,
|
||||||
|
where `<GoVersion>` is the Go version the release is based on, and `<BoringCryptoVersion>` is
|
||||||
|
an integer that increments each time there is a new release with different BoringCrypto bits.
|
||||||
|
The `<BoringCryptoVersion>` is stored in the `VERSION` file in this directory.
|
||||||
|
|
||||||
|
For example, the first release is based on Go 1.8.3 is `go1.8.3b1`.
|
||||||
|
If the BoringCrypto bits are updated, the next would be `go1.8.3b2`.
|
||||||
|
If, after that, Go 1.9 is released and the same BoringCrypto code added to it,
|
||||||
|
that would result in `go1.9b2`. There would likely not be a `go1.9b1`,
|
||||||
|
since that would indicate Go 1.9 with the older BoringCrypto code.
|
||||||
|
|
||||||
|
## Releases
|
||||||
|
|
||||||
|
The `build.release` script prepares a binary release and publishes it in Google Cloud Storage
|
||||||
|
at `gs://go-boringcrypto/`, making it available for download at
|
||||||
|
`https://go-boringcrypto.storage.googleapis.com/<FILE>`.
|
||||||
|
The script records each published release in the `RELEASES` file in this directory.
|
||||||
|
|
||||||
|
The `build.docker` script, which must be run after `build.release`, prepares a Docker image
|
||||||
|
and publishes it on Google Artifact Registry.
|
||||||
|
`go1.17.2b7` is published as `us-docker.pkg.dev/google.com/api-project-999119582588/go-boringcrypto/golang:1.17.2b7`.
|
||||||
|
|
||||||
|
## Release process
|
||||||
|
|
||||||
|
Development is done on the dev.boringcrypto branch, which tracks
|
||||||
|
master. Releases are cut from dev.boringcrypto.go1.X branches,
|
||||||
|
which are BoringCrypto backported to the Go 1.X release branches.
|
||||||
|
To issue new BoringCrypto releases based on Go 1.X:
|
||||||
|
|
||||||
|
1. If the BoringCrypto bits have been updated, increment the
|
||||||
|
number in `VERSION`, send that change out as a CL for review,
|
||||||
|
get it committed to dev.boringcrypto, and run `git sync`.
|
||||||
|
|
||||||
|
2. Change to the dev.boringcrypto.go1.X branch and cherry-pick
|
||||||
|
all BoringCrypto updates, including the update of the
|
||||||
|
`VERSION` file. If desired, merge release-branch.go1.X into
|
||||||
|
dev.boringcrypto.go1.X. Mail them out and get them committed.
|
||||||
|
|
||||||
|
3. **Back on the dev.boringcrypto branch**, run `git fetch`,
|
||||||
|
`make.bash` and then `build.release dev.boringcrypto.go1.X`.
|
||||||
|
The script will determine the base Go version and the
|
||||||
|
BoringCrypto version, build a release, and upload it.
|
||||||
|
|
||||||
|
4. Run `build.docker`, which will build and upload a Docker image
|
||||||
|
from the latest release.
|
||||||
|
|
||||||
|
5. Send out a CL with the updated `RELEASES` file and get it
|
||||||
|
committed to dev.boringcrypto.
|
||||||
|
|
||||||
|
## Building from Docker
|
||||||
|
|
||||||
|
A Dockerfile that starts with `FROM golang:1.17.2` can switch
|
||||||
|
to `FROM us-docker.pkg.dev/google.com/api-project-999119582588/go-boringcrypto/golang:1.17.2b7`
|
||||||
|
and should need no other modifications.
|
||||||
|
|
||||||
|
## Building from Bazel
|
||||||
|
|
||||||
|
Starting from [bazelbuild/rules_go](https://github.com/bazelbuild/rules_go)
|
||||||
|
tag 0.7.1, simply download the BoringCrypto-enabled Go SDK using
|
||||||
|
`go_download_sdk()` before calling `go_register_toolchains()`.
|
||||||
|
|
||||||
|
For example, to use Go 1.9.3 with BoringCrypto on Linux, use the following lines
|
||||||
|
in `WORKSPACE`:
|
||||||
|
```python
|
||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_download_sdk", "go_register_toolchains")
|
||||||
|
|
||||||
|
go_rules_dependencies()
|
||||||
|
|
||||||
|
go_download_sdk(
|
||||||
|
name = "go_sdk",
|
||||||
|
sdks = {
|
||||||
|
"linux_amd64": ("go1.9.3b4.linux-amd64.tar.gz", "db1997b2454a2f27669b849d2d2cafb247a55128d53da678f06cb409310d6660"),
|
||||||
|
},
|
||||||
|
urls = ["https://storage.googleapis.com/go-boringcrypto/{}"],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_register_toolchains()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note**: you must *not* enable `pure` mode, since cgo must be enabled. To
|
||||||
|
ensure that binaries are linked with BoringCrypto, you can set `pure = "off"` on
|
||||||
|
all relevant `go_binary` rules.
|
||||||
|
|
||||||
|
## Caveat
|
||||||
|
|
||||||
|
BoringCrypto is used for a given build only in limited circumstances:
|
||||||
|
|
||||||
|
- The build must be GOOS=linux, GOARCH=amd64.
|
||||||
|
- The build must have cgo enabled.
|
||||||
|
- The android build tag must not be specified.
|
||||||
|
- The cmd_go_bootstrap build tag must not be specified.
|
||||||
|
|
||||||
|
The version string reported by `runtime.Version` does not indicate that BoringCrypto
|
||||||
|
was actually used for the build. For example, linux/386 and non-cgo linux/amd64 binaries
|
||||||
|
will report a version of `go1.8.3b2` but not be using BoringCrypto.
|
||||||
|
|
||||||
|
To check whether a given binary is using BoringCrypto, run `go tool nm` on it and check
|
||||||
|
that it has symbols named `*_Cfunc__goboringcrypto_*`.
|
||||||
|
|
||||||
|
The program [rsc.io/goversion](https://godoc.org/rsc.io/goversion) will report the
|
||||||
|
crypto implementation used by a given binary when invoked with the `-crypto` flag.
|
||||||
213
misc/boring/RELEASES
Normal file
213
misc/boring/RELEASES
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
# This file lists published Go+BoringCrypto releases.
|
||||||
|
# Each line describes a single release: <version> <git commit> <target> <URL> <sha256sum>
|
||||||
|
go1.9rc2b2 91753387bdf7 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.9rc2b2.linux-amd64.tar.gz 59355a45e6970e8013060851ddb3f079afe8db52e90db520a0826a13f1b5ae5b
|
||||||
|
go1.8.3b3 f6ff81bac156 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.8.3b3.linux-amd64.tar.gz 6287ad971cd268bb2684fb8b1275dea928ad527823062bc057e73036c419e7af
|
||||||
|
go1.9rc2b4 c339bc4e07a6 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.9rc2b4.linux-amd64.tar.gz a8f677d48dc93920065fca4dca1a55bf7110aba132489c47e25d26d55c67eb32
|
||||||
|
go1.9b4 e6ad24cde71e linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.9b4.linux-amd64.tar.gz 6592e36a05df8e7c59812328a3a4bfa6c4eed72132fc31245951c3ade3ef2a8a
|
||||||
|
go1.9b4 e6ad24cde71e src https://go-boringcrypto.storage.googleapis.com/go1.9b4.src.tar.gz c85f31dc743fee0e8ce0c6ffc286e27c1f51b66c9b923afafb43cdc378a41091
|
||||||
|
go1.8.3b4 42cb4dcdb59a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.8.3b4.linux-amd64.tar.gz 4011c86e6175925e1c63dc7c19a51f825be53bbe7b08260918e5107b0fbd4f85
|
||||||
|
go1.8.3b4 42cb4dcdb59a src https://go-boringcrypto.storage.googleapis.com/go1.8.3b4.src.tar.gz 2531ca8918aa024aed8f4a6c9e5c3b25bc8777623f1efa66aec7214601d474e4
|
||||||
|
go1.9.2b4 cda3c6f91d7c linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.9.2b4.linux-amd64.tar.gz 7c5e9a033ddc3ab36646e3bac7fd16962742710c70c18122e44a9ab56cdd3cf7
|
||||||
|
go1.9.2b4 cda3c6f91d7c src https://go-boringcrypto.storage.googleapis.com/go1.9.2b4.src.tar.gz 38a2260b64a6a5ab20f8972d08b4765bad116721356433f39aebd29c7598218c
|
||||||
|
go1.9.3b4 f4e5ebdf35c8 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.9.3b4.linux-amd64.tar.gz db1997b2454a2f27669b849d2d2cafb247a55128d53da678f06cb409310d6660
|
||||||
|
go1.9.3b4 f4e5ebdf35c8 src https://go-boringcrypto.storage.googleapis.com/go1.9.3b4.src.tar.gz 7485e1fc53a9fab9cf34f71de74d69f4c50f9d11a449647de40ee04b59bf8a5b
|
||||||
|
go1.9.7b4 0bad1bef406e linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.9.7b4.linux-amd64.tar.gz 9e33a0deb8fed3bd7fa3d122bb5143be9e0a974a422ab4ddac5e765fa1310a6f
|
||||||
|
go1.9.7b4 0bad1bef406e src https://go-boringcrypto.storage.googleapis.com/go1.9.7b4.src.tar.gz ad9fb6e22a27382c468467ecade4937f725b33818852f1c1da0d09b471e7486c
|
||||||
|
go1.10.3b4 35ba5284935c linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.10.3b4.linux-amd64.tar.gz 6754729d78a375bd1debd980b1e3e7fd49198a980d0bbd8f39e89569aa001942
|
||||||
|
go1.10.3b4 35ba5284935c src https://go-boringcrypto.storage.googleapis.com/go1.10.3b4.src.tar.gz f3e75c60a835c11b97e30429b63917ceb31f799b2ba7e2001d99db908fb8e28f
|
||||||
|
go1.10.4b4 2e2a04a605b6 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.10.4b4.linux-amd64.tar.gz 17c275ff448686fe1908ecbea5d11ad6f4f7caa288d1786b756439703b12b8b2
|
||||||
|
go1.10.4b4 2e2a04a605b6 src https://go-boringcrypto.storage.googleapis.com/go1.10.4b4.src.tar.gz f9cc38e194edabebf338fb74c22f597dc847560618d5d7d4d6cdc28139efa772
|
||||||
|
go1.11b4 685dc1638240 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11b4.linux-amd64.tar.gz d53417b2071af0104fbc15a957000bccdcb5bbc094df0401f67d51968f7f2e4e
|
||||||
|
go1.11b4 685dc1638240 src https://go-boringcrypto.storage.googleapis.com/go1.11b4.src.tar.gz 39896f0decd6721e81324cb2bb19540706ca97152c6800a6c8ad15a4e4162184
|
||||||
|
go1.11.2b4 35cf0d9f6bbd linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11.2b4.linux-amd64.tar.gz a9ceb6d0b4413d81ccc94c6460f60ca0c4f36b5dcbf659e1be582cd40c0edfbd
|
||||||
|
go1.11.2b4 35cf0d9f6bbd src https://go-boringcrypto.storage.googleapis.com/go1.11.2b4.src.tar.gz 8e12a8df1428f00239dc67dd438a81f72c9925982e90b6899f66270971bddc1c
|
||||||
|
go1.10.7b4 8b246fe0f595 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.10.7b4.linux-amd64.tar.gz 31917ab96004b9b482399b46928f5c10cdadefed5fda6f4de262efe2c3c7533e
|
||||||
|
go1.10.7b4 8b246fe0f595 src https://go-boringcrypto.storage.googleapis.com/go1.10.7b4.src.tar.gz 323a184c77e3a377f5ed993b04946ee7b1a8e3350aba2894c0944f1e313636f1
|
||||||
|
go1.11.4b4 572c4bce6792 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11.4b4.linux-amd64.tar.gz e708ef7ecaf17a3e8e6deceadfa167cc1162f710f97ea4bc124d3837d6e2eaa1
|
||||||
|
go1.11.4b4 572c4bce6792 src https://go-boringcrypto.storage.googleapis.com/go1.11.4b4.src.tar.gz ea963b80e218a34470e14e6e997fe06b8c5bf3f9c9bb0c801f7d8ef63b9bcb73
|
||||||
|
go1.10.8b4 4b76b996cb0a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.10.8b4.linux-amd64.tar.gz 6d7d3323030851b595ba7ed66931c352b63de6dfe1ab3e6d6243987765d09819
|
||||||
|
go1.10.8b4 4b76b996cb0a src https://go-boringcrypto.storage.googleapis.com/go1.10.8b4.src.tar.gz c1f5df50a4be3d0cb3aed7b80728f2b23c18deff0383636274742a38c145f939
|
||||||
|
go1.11.5b4 3fb9dafacc45 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11.5b4.linux-amd64.tar.gz 9b5b2972b452da9ba6bba65bab18fb9e8fbda31b5c489275710e5429d76f568c
|
||||||
|
go1.11.5b4 3fb9dafacc45 src https://go-boringcrypto.storage.googleapis.com/go1.11.5b4.src.tar.gz 1c5801e2af25c9299d9fd94c64f9ec11fd35777c45d5d0f398c0a9884b1cfbbf
|
||||||
|
go1.12.1b4 88e20e81a61f linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.1b4.linux-amd64.tar.gz b71886e0d65e5efea2e0a3cbd0c3cd0daf84c437078e755ecde25f4ac0bbed2f
|
||||||
|
go1.12.1b4 88e20e81a61f src https://go-boringcrypto.storage.googleapis.com/go1.12.1b4.src.tar.gz d44be1396eb2854b5d9c4d8e8ed0cf9fea1e9dc5a02d8f53b41ba571951a329f
|
||||||
|
go1.11.6b4 7be8a5843a9b linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11.6b4.linux-amd64.tar.gz b704f61b8979e64a46da8884c90cd2b0e2d54e802d55e5f56d7c93752334c197
|
||||||
|
go1.11.6b4 7be8a5843a9b src https://go-boringcrypto.storage.googleapis.com/go1.11.6b4.src.tar.gz a56b45e24b61ad7b3c90dfd906cd22426a4de9e2e697b4c9ef07a2af047bcb0d
|
||||||
|
go1.12.5b4 ad495d31d908 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.5b4.linux-amd64.tar.gz df0e64958cf90f27a65b2175eb80bc34a601136eed8e5559bed2a9e349e33707
|
||||||
|
go1.12.5b4 ad495d31d908 src https://go-boringcrypto.storage.googleapis.com/go1.12.5b4.src.tar.gz 054d482896a77ae2d7d24c7adf08da5a4401b938871e61a5cdabc735c54cea9f
|
||||||
|
go1.11.11b4 346babe6a67f linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11.11b4.linux-amd64.tar.gz c4dd44fa00f491b3d2ea808af8a6c234f915adb27c014512d725bafc4784d75f
|
||||||
|
go1.11.11b4 346babe6a67f src https://go-boringcrypto.storage.googleapis.com/go1.11.11b4.src.tar.gz 57a724a72f0ba8620cbb48288f39c86ed513c241509ddf73231f4c8cd2a983ac
|
||||||
|
go1.12.6b4 6b86b09ad4d3 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.6b4.linux-amd64.tar.gz eebc2e7f37555760adb361985b861d0cd34f9401cf7456d8d2f2f3082a60eee1
|
||||||
|
go1.12.6b4 6b86b09ad4d3 src https://go-boringcrypto.storage.googleapis.com/go1.12.6b4.src.tar.gz 0e6e9aaf2c72a7e61280ce1e77b2ea24f01a59f4c1e6f0aa72b753206724fd3a
|
||||||
|
go1.11.12b4 845e947ae34f linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11.12b4.linux-amd64.tar.gz 91808261fc357855fba920df01a933d6104e907793014317de00b92802d494d9
|
||||||
|
go1.11.12b4 845e947ae34f src https://go-boringcrypto.storage.googleapis.com/go1.11.12b4.src.tar.gz 7b64d9e56ea627138d87c7533df8f9932a79ff900f150a8d8e6a3edc2d0066ec
|
||||||
|
go1.12.7b4 bd126d0ad256 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.7b4.linux-amd64.tar.gz 7f0c73cd397bccad48ab4df4188d3651c25bf33102275848c6e67b882e11f680
|
||||||
|
go1.12.7b4 bd126d0ad256 src https://go-boringcrypto.storage.googleapis.com/go1.12.7b4.src.tar.gz 0c48d7b81ef2b948980011fad1d176d6b10636a4016e3aed7438d86e046d816b
|
||||||
|
go1.11.13b4 4f8e7223f936 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.11.13b4.linux-amd64.tar.gz eeb232577065732f5d57a4c77b7d73aa60231ee6fd6496daf7558993e92e403f
|
||||||
|
go1.11.13b4 4f8e7223f936 src https://go-boringcrypto.storage.googleapis.com/go1.11.13b4.src.tar.gz 107da8846803a0a735766ca0947de6cd15cd23d8c584002f06e7ac5f81ecb114
|
||||||
|
go1.12.8b4 55186ba70c1a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.8b4.linux-amd64.tar.gz 63f278abfc1e98546bc0ffc87f000d9aae2b06c0700212cb55ffd17d059fb8e1
|
||||||
|
go1.12.8b4 55186ba70c1a src https://go-boringcrypto.storage.googleapis.com/go1.12.8b4.src.tar.gz c12b1d56ba4e0572f85a08681e05c66293ad53f04b11ce74c688d78fcb882061
|
||||||
|
go1.12.9b4 ee88e5b118b5 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.9b4.linux-amd64.tar.gz d90989cba1db647b795400a9520eab2fa30f8dea50f4189b18d53f757a4bac44
|
||||||
|
go1.12.9b4 ee88e5b118b5 src https://go-boringcrypto.storage.googleapis.com/go1.12.9b4.src.tar.gz 9d4efed8e13fa5ebdadd4fc22f9e35e67bfb34322570c83a15a0879472412e13
|
||||||
|
go1.13b4 28e8a0c21e00 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13b4.linux-amd64.tar.gz 4a909f34bc487badb5ec11646c471ae690393d3f7835b8fbef8466d04ee23cba
|
||||||
|
go1.13b4 28e8a0c21e00 src https://go-boringcrypto.storage.googleapis.com/go1.13b4.src.tar.gz 3c2dbe1bfcd7299b5be4b75529425c0a67b8d6b76f81f993b84ae0d173934257
|
||||||
|
go1.12.10b4 5827153a1db7 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.10b4.linux-amd64.tar.gz 20963fde89fd20eebee9d89003e52702f0379fdb04a68754f9fadf2c302166e3
|
||||||
|
go1.12.10b4 5827153a1db7 src https://go-boringcrypto.storage.googleapis.com/go1.12.10b4.src.tar.gz f5cfe73cfeaaa67619ff4a4bbc587e622d63a6aaa7145253e6583bd59072b323
|
||||||
|
go1.13.1b4 2da1832ad494 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.1b4.linux-amd64.tar.gz 70be1bae05feb67d0560f39767e80707343d96554c5a611fbb93b04ce5913693
|
||||||
|
go1.13.1b4 2da1832ad494 src https://go-boringcrypto.storage.googleapis.com/go1.13.1b4.src.tar.gz cf94520325f376ecaf420b7d25756cdecbed52510a1a079eca67c2c86c3cf39b
|
||||||
|
go1.12.11b4 c5a4ae8c8c1b linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.11b4.linux-amd64.tar.gz a2d90aa130d45b36dd94a7e70accc94e2585eb45823fb7b07ae182ac8bc4a8ca
|
||||||
|
go1.12.11b4 c5a4ae8c8c1b src https://go-boringcrypto.storage.googleapis.com/go1.12.11b4.src.tar.gz c334b70c9af0380fb9d397e89af1e2e2ac03380b5cc7c3327f56536c2f68bf8d
|
||||||
|
go1.13.2b4 6a1c22797f9c linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.2b4.linux-amd64.tar.gz 888c1f6331862af388e730fab4926aa1cb2d4ffc5417e32f9e6d2af7953f0e29
|
||||||
|
go1.13.2b4 6a1c22797f9c src https://go-boringcrypto.storage.googleapis.com/go1.13.2b4.src.tar.gz fc44c7713fcd84fe0587594ae5ee1a1d318a0da18b1156e1f9645c6ffa0335bc
|
||||||
|
go1.12.12b4 cab2e4707a42 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.12b4.linux-amd64.tar.gz 983e996e8f60c78a400fed0edfd16c1718d704e15389c48b4a8b2d835c0d00f2
|
||||||
|
go1.12.12b4 cab2e4707a42 src https://go-boringcrypto.storage.googleapis.com/go1.12.12b4.src.tar.gz 2d653a74c14cde1e414ac558e0bdd182ccbe1198bbff8cd22c8e423552d5e24d
|
||||||
|
go1.13.3b4 cba6efa89376 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.3b4.linux-amd64.tar.gz 9ba0b7696f14dc7ecc912aae6587491853637fab30c4c005339fe36751bfd185
|
||||||
|
go1.13.3b4 cba6efa89376 src https://go-boringcrypto.storage.googleapis.com/go1.13.3b4.src.tar.gz ba83d7e18fa49dc6e4319806e7b5cdee5eb046eb8e9fb38f3034378c4f80944a
|
||||||
|
go1.12.13b4 5d9d84d037da linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.13b4.linux-amd64.tar.gz af3e0d2b9996c632b010da6700b7b8ec52bd3065b3facc478709209a854664eb
|
||||||
|
go1.12.13b4 5d9d84d037da src https://go-boringcrypto.storage.googleapis.com/go1.12.13b4.src.tar.gz d1bae336ea076a0b2bfc984477f4a216a475e134068227e6d9b44faf239bcfb8
|
||||||
|
go1.13.4b4 fa3f24e5c294 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.4b4.linux-amd64.tar.gz 23579d1bea65b2510e507bb0698ec66777bd34674c91dfe617ed130728791dc7
|
||||||
|
go1.13.4b4 fa3f24e5c294 src https://go-boringcrypto.storage.googleapis.com/go1.13.4b4.src.tar.gz 8d82df5b4332acd5a274ac029ee5b5ff073b2a4247e2325610986221858b819d
|
||||||
|
go1.12.16b4 f74e68136cf1 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.16b4.linux-amd64.tar.gz fd70cee8ca9438f99cc71b3586b11a03a36239a5bccbf1c4d06e7206b88bd77d
|
||||||
|
go1.12.16b4 f74e68136cf1 src https://go-boringcrypto.storage.googleapis.com/go1.12.16b4.src.tar.gz 2ae0823cefc34f280d4f4ba0d665ff247ba1429cb43198d10e3bc316d3f29a8d
|
||||||
|
go1.13.7b4 71468339f763 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.7b4.linux-amd64.tar.gz 85945502ad43f506902927f69b514b34a85a20e2bd1020cce87c551645194aa3
|
||||||
|
go1.13.7b4 71468339f763 src https://go-boringcrypto.storage.googleapis.com/go1.13.7b4.src.tar.gz d30fa252de75763adb5886125e19e8bab68dbe8dbad33b0faf09a6be98b12d96
|
||||||
|
go1.12.17b4 9e5b1367cb45 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.12.17b4.linux-amd64.tar.gz ee3a72dc1cfd8a34f32aaa5ddb05076fcb39434fd1bd25aa318234f72b462e31
|
||||||
|
go1.12.17b4 9e5b1367cb45 src https://go-boringcrypto.storage.googleapis.com/go1.12.17b4.src.tar.gz ffb653ec8f4cc33e1e7c308d89c695f322a76f3107e0fc8c639affc6148261bf
|
||||||
|
go1.13.8b4 fdf5e5b5905f linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.8b4.linux-amd64.tar.gz eac505df92aa6d6b76041f4b485d230f839159b8567c96d7980a06ef476ab3df
|
||||||
|
go1.13.8b4 fdf5e5b5905f src https://go-boringcrypto.storage.googleapis.com/go1.13.8b4.src.tar.gz 1aa28fe37a704e94bb34e23578fd07ebbc6a025e9be9b45a898967b84405c41b
|
||||||
|
go1.14b4 99da8fa53467 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14b4.linux-amd64.tar.gz a617e03a6c8813c53b813b865a2e185e12dbfaa76c703c1c48e57ad89651556b
|
||||||
|
go1.14b4 99da8fa53467 src https://go-boringcrypto.storage.googleapis.com/go1.14b4.src.tar.gz ee292639b24923f519f1f0fe1ceaeca8d46feb8c15cf88e228346398c5848380
|
||||||
|
go1.13.9b4 bb8a1014a32c linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.9b4.linux-amd64.tar.gz 565e1a3c62dfc2586471b6ae189ada053a86fc51d88d2eac883a03731071bf77
|
||||||
|
go1.13.9b4 bb8a1014a32c src https://go-boringcrypto.storage.googleapis.com/go1.13.9b4.src.tar.gz 536f0549e7bbdad32270a17d8a282667560b6da2d27a5e3580714338e70185ad
|
||||||
|
go1.14.1b4 e784c3f4d925 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.1b4.linux-amd64.tar.gz 6570991396d531fb628e4c01d697eeee395104147d406aec5a8ba00a213ef63f
|
||||||
|
go1.14.1b4 e784c3f4d925 src https://go-boringcrypto.storage.googleapis.com/go1.14.1b4.src.tar.gz 2c267c3114fa4683f51c281d216d3754b38d5d08144c3acc318cf37165b1b2da
|
||||||
|
go1.13.10b4 b129f40bb33f linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.10b4.linux-amd64.tar.gz a511b2e6ee7b71ca1411d6e4bb07ec33bb5b6974fd1dded77e00520d24d9d000
|
||||||
|
go1.13.10b4 b129f40bb33f src https://go-boringcrypto.storage.googleapis.com/go1.13.10b4.src.tar.gz 5dfa44eea19b0be0c9c394fbbf89b2a14f84380a9d7b87e21eacba3ba030c44b
|
||||||
|
go1.14.2b4 2b0d842f4b24 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.2b4.linux-amd64.tar.gz 82449a7ce57733c0cd3fa7feac89214706ff2b04e387b62619b8e2b8b388ffd9
|
||||||
|
go1.14.2b4 2b0d842f4b24 src https://go-boringcrypto.storage.googleapis.com/go1.14.2b4.src.tar.gz bfcb44fa329d6a2eb5c4ef58bfa114d65b078bf69a361bb77e3ea52ec8975d14
|
||||||
|
go1.13.12b4 488ca930b24a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.12b4.linux-amd64.tar.gz 63193aa2290af5d65d2d6bbddcd11d835d437a4e835954d605863f5b27a7661d
|
||||||
|
go1.13.12b4 488ca930b24a src https://go-boringcrypto.storage.googleapis.com/go1.13.12b4.src.tar.gz 5b0aefb44ba2a08fedb5be0144810bc47559d7d8a6e61638c09dd261706d650e
|
||||||
|
go1.14.4b4 fcdb6aa6ee5d linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.4b4.linux-amd64.tar.gz 682f2167b3d619690b1385196776822b1d2c497607f67e2d19d92faf2bea0b4a
|
||||||
|
go1.14.4b4 fcdb6aa6ee5d src https://go-boringcrypto.storage.googleapis.com/go1.14.4b4.src.tar.gz 2fb759023360f0d42ba434f0409da2460ff4386cab062557f97fe15122b4b4cd
|
||||||
|
go1.13.14b4 852ccd9de7d1 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.14b4.linux-amd64.tar.gz 49c67d3a67fac60e18a264555392aa5925126a75ef0ba152ec315cc874eccb43
|
||||||
|
go1.13.14b4 852ccd9de7d1 src https://go-boringcrypto.storage.googleapis.com/go1.13.14b4.src.tar.gz 7b7dfc62286a07d438370b09f38845acae99c592c6e147722b8f3c098ab8756a
|
||||||
|
go1.14.6b4 8f53ffb15fd5 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.6b4.linux-amd64.tar.gz 953322287806a42d4a73e096aea45511a51a0a323086e98119edcb0dae866c9d
|
||||||
|
go1.14.6b4 8f53ffb15fd5 src https://go-boringcrypto.storage.googleapis.com/go1.14.6b4.src.tar.gz 75fea7a60da4ca225473b500b2d5ce7c302ca7d22eedfdbd3444cd01e6b9f392
|
||||||
|
go1.15b5 a15df605fc4a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15b5.linux-amd64.tar.gz ebcb2212bdb645a16ffc05a1d9b77c94553ed19a6ccbbc73e4868c64777eb70a
|
||||||
|
go1.15b5 a15df605fc4a src https://go-boringcrypto.storage.googleapis.com/go1.15b5.src.tar.gz 7107665853228b2c18f56fec73e217fa3494ccf52c609be839cf6945d501c0f0
|
||||||
|
go1.13.15b4 5622128a77b4 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.13.15b4.linux-amd64.tar.gz 8b45ec0e578dc0a0bc483c2d12c08fee5adbfb39f0854fbe9d45f7d628ed1697
|
||||||
|
go1.13.15b4 5622128a77b4 src https://go-boringcrypto.storage.googleapis.com/go1.13.15b4.src.tar.gz 21eab29a61a43078cd8bcdbbbb4c82ca049a7e2e211aca0c95f6a306e288db4f
|
||||||
|
go1.14.9b4 62cd3338eed7 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.9b4.linux-amd64.tar.gz c81946294cbefa7a3abdf47733c720c3454418d6881c137a2e28f18ea40977aa
|
||||||
|
go1.14.9b4 62cd3338eed7 src https://go-boringcrypto.storage.googleapis.com/go1.14.9b4.src.tar.gz e9c13c4daa10f6aac80b703f61f7e931af92e92146c8b140ae79e20e4af6bccd
|
||||||
|
go1.15.2b5 dbc5602d1839 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.2b5.linux-amd64.tar.gz 30c04d854fc8990017ee8c180c1407a4f26c016e3a4134161bbf41c9d16452e3
|
||||||
|
go1.15.2b5 dbc5602d1839 src https://go-boringcrypto.storage.googleapis.com/go1.15.2b5.src.tar.gz 67432c0b0a02aa6cc0c49ab285f1c6935a16dadfebd77dfabca7e31907240bc9
|
||||||
|
go1.14.10b4 b5fc12785be4 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.10b4.linux-amd64.tar.gz d3aa38fb5108b43b155c21529190e73789df6ca0b37feafd43438aefe42f936e
|
||||||
|
go1.14.10b4 b5fc12785be4 src https://go-boringcrypto.storage.googleapis.com/go1.14.10b4.src.tar.gz daf7603babc49935efdea5befb2ecad823771523a84d1ba6c0e8c10fac982d59
|
||||||
|
go1.15.3b5 ed9dc25d693c linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.3b5.linux-amd64.tar.gz 34ec7ec094f5e9349f1612b5f6d8f014b3a7b37b6986aeedcd0fe7cf2dc76a62
|
||||||
|
go1.15.3b5 ed9dc25d693c src https://go-boringcrypto.storage.googleapis.com/go1.15.3b5.src.tar.gz bc37727287366aabb47594717cebd0a759147d8b2eb4cd3a45a19317af199fe9
|
||||||
|
go1.14.12b4 21ba30ad409a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.12b4.linux-amd64.tar.gz 7f9fb67a3c59fff24e3c51fa2a7435f4195cfb33844c9c2def27c162cc23604b
|
||||||
|
go1.14.12b4 21ba30ad409a src https://go-boringcrypto.storage.googleapis.com/go1.14.12b4.src.tar.gz 948d7a77a4a890a7258102bcc7b63890f238061dfb6a4c06033660e727e87fcf
|
||||||
|
go1.15.5b5 11087322f85d linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.5b5.linux-amd64.tar.gz 9c97488137f1f560b3fff0d8a2a9c45d2de8790fb8952a42b46cc4633528fc48
|
||||||
|
go1.15.5b5 11087322f85d src https://go-boringcrypto.storage.googleapis.com/go1.15.5b5.src.tar.gz ee933cb1a4b591794dbcce99740032506af25ee202765dcc6979feb5abc114fc
|
||||||
|
go1.14.13b4 2bb8e5a94e8a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.13b4.linux-amd64.tar.gz 8fb6e1cefe5535ab704e1b4e26725095dcca0060490842a54dd93e7cd8b206cd
|
||||||
|
go1.14.13b4 2bb8e5a94e8a src https://go-boringcrypto.storage.googleapis.com/go1.14.13b4.src.tar.gz 02e0c4871d12813aee1019bf189b77ccec99dab3a1d5b95ce6abdf85b1810703
|
||||||
|
go1.15.6b5 f78276931172 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.6b5.linux-amd64.tar.gz 245c500f7da70fb2abd1a6021436ed48e2b97dbbdb394a759b0601dc69cf4e77
|
||||||
|
go1.15.6b5 f78276931172 src https://go-boringcrypto.storage.googleapis.com/go1.15.6b5.src.tar.gz 6576a29d019405b14fdc98883fed33c766de2028fbbd3a743a241275275cc7e5
|
||||||
|
go1.14.14b4 9cf003256bc3 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.14b4.linux-amd64.tar.gz 7df65366d26a13c5be16f87f64e832e86db3b8b9ca1b5c6385e0e20bf79dc82f
|
||||||
|
go1.14.14b4 9cf003256bc3 src https://go-boringcrypto.storage.googleapis.com/go1.14.14b4.src.tar.gz aaeda57e2b68ac72783c7aacded814ec660a91c1010c3139156c8e7def86f145
|
||||||
|
go1.15.7b5 79ea7a16d7e3 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.7b5.linux-amd64.tar.gz cb08962897e3802cda96f4ee915ed20fbde7d5d85e688759ef523d2e6ae44851
|
||||||
|
go1.15.7b5 79ea7a16d7e3 src https://go-boringcrypto.storage.googleapis.com/go1.15.7b5.src.tar.gz aa7cb4beff82881cbff4a66e9e07a4004e49384a8fcc95204db9b2f48c12a235
|
||||||
|
go1.15.8b5 2a0dd053ecfa linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.8b5.linux-amd64.tar.gz 9d897bf42a962b064cfc9bed182c18ade0a3f5857d6a075d93b73ca8fe3b1f3a
|
||||||
|
go1.15.8b5 2a0dd053ecfa src https://go-boringcrypto.storage.googleapis.com/go1.15.8b5.src.tar.gz 57964e7762ab03f0ad17bc787585b1709decccf095b7f7d2e9fca61a71e09010
|
||||||
|
go1.14.15b4 47419f9cac61 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.14.15b4.linux-amd64.tar.gz 82ba7297d26afcdade439de5621bdcb16e5261877f204aa60d03b5e07223a5c8
|
||||||
|
go1.14.15b4 47419f9cac61 src https://go-boringcrypto.storage.googleapis.com/go1.14.15b4.src.tar.gz bf77b15f1d905753648db2d91e39c3a740b67b03dfff511aa25a360a78f9742a
|
||||||
|
go1.16b7 67a0be0b437e linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16b7.linux-amd64.tar.gz 56d4e41d55baece6b98bc66bdf772b0eb17518dd287f27c533225cd154ee0a38
|
||||||
|
go1.16b7 67a0be0b437e src https://go-boringcrypto.storage.googleapis.com/go1.16b7.src.tar.gz 7d063cf1cbd252da8b2db54947e5f2f1402ac792e1ea6de76e05ab233f5badbd
|
||||||
|
go1.15.9b5 055f1da6e6b9 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.9b5.linux-amd64.tar.gz 8e44de7d9d36d68e01c0454841f1becb93d4932bb16a623ed6d4de15ecba1239
|
||||||
|
go1.15.9b5 055f1da6e6b9 src https://go-boringcrypto.storage.googleapis.com/go1.15.9b5.src.tar.gz dba0290da6ae46df8d68c6d027b7d6b4775d6dcf8ff9f3cb8a26dbd5b757e696
|
||||||
|
go1.16.1b7 b9bd851b1452 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.1b7.linux-amd64.tar.gz 963f6a4fb8c5ff7668fb17ba52c3d905466058266556844aee79139f7e3c9521
|
||||||
|
go1.16.1b7 b9bd851b1452 src https://go-boringcrypto.storage.googleapis.com/go1.16.1b7.src.tar.gz 8e6849010ae5f3280fea0f6fa6e5b07831ac6e6524a636fab41c0e4f77b529ba
|
||||||
|
go1.15.10b5 229a39e34717 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.10b5.linux-amd64.tar.gz 7533b0307fd995deb9ef68d67899582c336a3c62387d19d03d10202129e9fad3
|
||||||
|
go1.15.10b5 229a39e34717 src https://go-boringcrypto.storage.googleapis.com/go1.15.10b5.src.tar.gz adbaff96b2392a9ab5a20d15fec959983861ec6e554c3c9cd14aec586a0928b3
|
||||||
|
go1.16.2b7 6d5f0ffc93e5 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.2b7.linux-amd64.tar.gz 2871d90630706eba9d3bd2838ec1c0a367c78c2c4f40e74ed75c294e2c5aa358
|
||||||
|
go1.16.2b7 6d5f0ffc93e5 src https://go-boringcrypto.storage.googleapis.com/go1.16.2b7.src.tar.gz 8991c28e30bdd9b34076c2871ab69aac7f306dba08d202aa7301f3adb54ad9f3
|
||||||
|
go1.15.11b5 be25192f119e linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.11b5.linux-amd64.tar.gz c5aa34a83631b3736bc1ab37027bc4fc22eca2353035586a6255be7e29251f43
|
||||||
|
go1.15.11b5 be25192f119e src https://go-boringcrypto.storage.googleapis.com/go1.15.11b5.src.tar.gz 05408824d64ac8ebb6c1d895017e605d45a2c4ebee28995136fe12f4833652d2
|
||||||
|
go1.16.3b7 fcee6b930a01 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.3b7.linux-amd64.tar.gz afe15efce3c1fecc60994d7ba0d41daaa029fa5810c98737121dde7b38a5e2ac
|
||||||
|
go1.16.3b7 fcee6b930a01 src https://go-boringcrypto.storage.googleapis.com/go1.16.3b7.src.tar.gz 5c86175ed86e6ae3826eb827cc51bdda770f22ffaf3258b11135a268153b5057
|
||||||
|
go1.16.4b7 25aff96f4b49 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.4b7.linux-amd64.tar.gz de60f0620f46b1872813f72646fdece76be94f43c1abe84b69033c26f823a31f
|
||||||
|
go1.16.4b7 25aff96f4b49 src https://go-boringcrypto.storage.googleapis.com/go1.16.4b7.src.tar.gz 5b537cf5598bc968764885f4d1f9820578d05d104a6cd7107bb3e443217f4983
|
||||||
|
go1.15.12b5 03a15201e7e0 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.12b5.linux-amd64.tar.gz 9fadc65da7df036bfe702b3f9980e2ca2b184f13d09e8094244f58a866a2f6ee
|
||||||
|
go1.15.12b5 03a15201e7e0 src https://go-boringcrypto.storage.googleapis.com/go1.15.12b5.src.tar.gz 81ec958d893f4ecf90111d09ceb79b36492266a39d1918a22e80443e1d399561
|
||||||
|
go1.16.5b7 e4feea2ce841 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.5b7.linux-amd64.tar.gz 2085b246d7d6908f504d0f33c655c31c3ec6e1ae3d13a020ba58abcf1b6ea7a4
|
||||||
|
go1.16.5b7 e4feea2ce841 src https://go-boringcrypto.storage.googleapis.com/go1.16.5b7.src.tar.gz cfe6cc16eb205d61414338c2b42fa2c4278831785b29e6b79712669418852ef4
|
||||||
|
go1.15.13b5 9647f89f2ac2 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.13b5.linux-amd64.tar.gz 1ad1edeaf3b6bc7696978d4137f55c0b38b8d796a607b89f7f010004aaef60a6
|
||||||
|
go1.15.13b5 9647f89f2ac2 src https://go-boringcrypto.storage.googleapis.com/go1.15.13b5.src.tar.gz 6cc9c5d23947a9dccc0e1afdff5d433398b09df1c5170596a826aac326ece457
|
||||||
|
go1.15.14b5 ddf078e08dc6 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.14b5.linux-amd64.tar.gz 8c4dbdc91e36f3d1db7f14b234973bfcb3b685fe4a6cb2e326ba9cf73a4260c2
|
||||||
|
go1.15.14b5 ddf078e08dc6 src https://go-boringcrypto.storage.googleapis.com/go1.15.14b5.src.tar.gz 0022b68f04a5d8553cfd838d3fe226f18e7095194300b2be4fc49a689daf0e1b
|
||||||
|
go1.16.6b7 6a6b41a8441e linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.6b7.linux-amd64.tar.gz f7f33064643ce0ab8ac1cede100e7eee8509a970178f5be961d9fba331226067
|
||||||
|
go1.16.6b7 6a6b41a8441e src https://go-boringcrypto.storage.googleapis.com/go1.16.6b7.src.tar.gz a1079dd2df6aad3bad584c4187dab98a264075b56b1d257ba27d956340ff7bbf
|
||||||
|
go1.15.15b5 dd96ded6c86b linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.15.15b5.linux-amd64.tar.gz 719d818f70c6eb1e753910fe21624832cf3f719540f22f89863e959ff68c0001
|
||||||
|
go1.15.15b5 dd96ded6c86b src https://go-boringcrypto.storage.googleapis.com/go1.15.15b5.src.tar.gz af2d44c8eef02e093c077c085fbe6964af0ca715f95f4bcea0809fa211cc4ded
|
||||||
|
go1.16.7b7 0d02a0d966b6 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.7b7.linux-amd64.tar.gz d4ca2906640edd9299d12d8204aae0d848b497b79b92424d8705ae748e16f3c5
|
||||||
|
go1.16.7b7 0d02a0d966b6 src https://go-boringcrypto.storage.googleapis.com/go1.16.7b7.src.tar.gz f65503abf459ba1d2f77d4d023fcebd19c62e7c34d3ffd0f1aebb598ffa153d9
|
||||||
|
go1.16.9b7 35d5cd0dcfb9 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.9b7.linux-amd64.tar.gz 6659e3ea17474000d2ac2f4a887a4bac26ab8cf6a0b0779cbd41464a7de23645
|
||||||
|
go1.16.9b7 35d5cd0dcfb9 src https://go-boringcrypto.storage.googleapis.com/go1.16.9b7.src.tar.gz 81a40da773e33230276446955f9ddc85c8ca121432d56842edad49212975a9bc
|
||||||
|
go1.17.2b7 5f1867dc1e67 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.2b7.linux-amd64.tar.gz 60fd88def54b81e489ba2d2d80e5df32150ef1a62c0ece3ff869862141824c81
|
||||||
|
go1.17.2b7 5f1867dc1e67 src https://go-boringcrypto.storage.googleapis.com/go1.17.2b7.src.tar.gz b00e746a053d5e70e27151b9461e5e3413c53bb88bc60e0db107a99284614d17
|
||||||
|
go1.16.10b7 06a4b2790c5b linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.10b7.linux-amd64.tar.gz 9720316c7d91fa0b6a31678745ad68c52c92e4027751602449fb2309c0c3f1de
|
||||||
|
go1.16.10b7 06a4b2790c5b src https://go-boringcrypto.storage.googleapis.com/go1.16.10b7.src.tar.gz 742e1e904d82cd7a17fade53ab9001f5f88b7a3ee9358c587811762fc07cdaa3
|
||||||
|
go1.17.3b7 5a371e30afcb linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.3b7.linux-amd64.tar.gz a5216d1e7401c734b3e29e8aad3c8608f094ae7d37b55e8815211e25922e4d19
|
||||||
|
go1.17.3b7 5a371e30afcb src https://go-boringcrypto.storage.googleapis.com/go1.17.3b7.src.tar.gz 858595a95faf4c730ebe3d40ecba1705b79f7bc2a996fd044cb30da8d9c57534
|
||||||
|
go1.17.4b7 95e6359f6a5d linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.4b7.linux-amd64.tar.gz aa4a69709a08c7d83a6417f978a9e5f32207c0e9da82d39cceff7d9cdf657e59
|
||||||
|
go1.17.4b7 95e6359f6a5d src https://go-boringcrypto.storage.googleapis.com/go1.17.4b7.src.tar.gz 0151f947e1da7a9cec63b06276b9ed4b92d2e5113ae254ebbdb9191b65c711f6
|
||||||
|
go1.16.11b7 c884bd9ef2f1 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.11b7.linux-amd64.tar.gz 8edd1e42a88df0dbb99f1e1487149a856155f24711e19c17ba0f08d76254e2ca
|
||||||
|
go1.16.11b7 c884bd9ef2f1 src https://go-boringcrypto.storage.googleapis.com/go1.16.11b7.src.tar.gz a50f8362af1e44011b342657cac80d817868c6d0f40a6d235c45abc81c16fb92
|
||||||
|
go1.16.12b7 adecd3ffbec7 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.12b7.linux-amd64.tar.gz fd43c36e9bc926634c13e0dc3547046c55f3b5a2448473d8fb51c344ea726542
|
||||||
|
go1.16.12b7 adecd3ffbec7 src https://go-boringcrypto.storage.googleapis.com/go1.16.12b7.src.tar.gz 891e21c67738b63b645ace56fbd3874ff9e8583865ee7907543ae43373411d64
|
||||||
|
go1.17.5b7 dc52cfcd39cd linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.5b7.linux-amd64.tar.gz 92407bbc855fd05c5252a2ee2d4fcb6eb077cf64fd0d70da53ba7914c22ec1d7
|
||||||
|
go1.17.5b7 dc52cfcd39cd src https://go-boringcrypto.storage.googleapis.com/go1.17.5b7.src.tar.gz 4c508aecce1b56e34a4e32605086994606c72010b7caedce7681c1019781c93e
|
||||||
|
go1.16.13b7 bb93480d0093 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.13b7.linux-amd64.tar.gz cd98a2ea753edc9d0206b14b2d40d269ddaee1dea7bc59b91cb8a11fc575f738
|
||||||
|
go1.16.13b7 bb93480d0093 src https://go-boringcrypto.storage.googleapis.com/go1.16.13b7.src.tar.gz e9f8f5f6769fed35924b364f2e1df8ad2fc491569189761047cec14ca5922ee1
|
||||||
|
go1.17.6b7 cfad1ff84c45 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.6b7.linux-amd64.tar.gz 5b55a001fb80f9baaed621c2469977b9c9afe13b9afc6fd5712057856ab86f5d
|
||||||
|
go1.17.6b7 cfad1ff84c45 src https://go-boringcrypto.storage.googleapis.com/go1.17.6b7.src.tar.gz 5178f595dea6d618f7cdf6b9e2346a1a28430b4d547996b766fcd5b34379ca2f
|
||||||
|
go1.17.7b7 172559d22b5d linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.7b7.linux-amd64.tar.gz a69bf0516affb8678873ba40c4ddbc8e3b01bfa8460f5c5f356dd53049d54322
|
||||||
|
go1.17.7b7 172559d22b5d src https://go-boringcrypto.storage.googleapis.com/go1.17.7b7.src.tar.gz eff84edf4f676c691ac21747277e15777789be32dcaa53a0779737b280351453
|
||||||
|
go1.16.14b7 e90b835f3071 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.14b7.linux-amd64.tar.gz 5024e1231d33b9dfffdd7821132dd32eccd42e7415f25618dc8c7304b335edd9
|
||||||
|
go1.16.14b7 e90b835f3071 src https://go-boringcrypto.storage.googleapis.com/go1.16.14b7.src.tar.gz caef2ef601bcc588e6bcb511087c9620200723a4c74191b725fbda94c3be884b
|
||||||
|
go1.17.8b7 4ea866a9969f linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.8b7.linux-amd64.tar.gz 4a1fa2c8d77309e1ef5bafe7e80e75c06e70c0ae1212d9f3d95485017155491d
|
||||||
|
go1.17.8b7 4ea866a9969f src https://go-boringcrypto.storage.googleapis.com/go1.17.8b7.src.tar.gz e42ac342c315d33c47434299a24f33137e7099f278ee6669404c4d7e49e17bcf
|
||||||
|
go1.16.15b7 649671b08fbd linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.16.15b7.linux-amd64.tar.gz 4d62f517786266019c721c35330e23da123eb184eadb5a79379fe81d31d856db
|
||||||
|
go1.16.15b7 649671b08fbd src https://go-boringcrypto.storage.googleapis.com/go1.16.15b7.src.tar.gz 54fc7f2ec0b72b0aaf7726eb5f7f57885252ef46c2c1ca238090cc57850e3ef7
|
||||||
|
go1.18b7 0622ea4d9068 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18b7.linux-amd64.tar.gz baa33bc66b8df97a3c5a328637b85f04d5629f139dc2df946c09ab7214510c61
|
||||||
|
go1.18b7 0622ea4d9068 src https://go-boringcrypto.storage.googleapis.com/go1.18b7.src.tar.gz 6028ffee59903934a3182d45ee3e0c1c9f47fb98f05d9bbb2fabb4771db60792
|
||||||
|
go1.18.1b7 d003f0850a7d linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.1b7.linux-amd64.tar.gz a5b3985341de6ca54f6a8e13e9ae695f0ee202207e25f082c3895a8fc6f89f64
|
||||||
|
go1.18.1b7 d003f0850a7d src https://go-boringcrypto.storage.googleapis.com/go1.18.1b7.src.tar.gz c7f91549b3a197e4a08f64e07546855ca8f82d597f60fd23c7ad2f082640a9fe
|
||||||
|
go1.17.9b7 ed86dfc4e441 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.9b7.linux-amd64.tar.gz 9469d1b4c10f59c921c4666c52baba5f6ca63b1cce0eca95e03b5713ef27577c
|
||||||
|
go1.17.9b7 ed86dfc4e441 src https://go-boringcrypto.storage.googleapis.com/go1.17.9b7.src.tar.gz 5d6bfe543a9a2bf6d8749973c771e40127b8020a769ecc5fb41d0dbd7deae9a6
|
||||||
|
go1.18.2b7 dcdb19874ff3 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.2b7.linux-amd64.tar.gz a53566eebe8e128695ddbd52c080502a0daca1c9f1b893cada9349259ed27e99
|
||||||
|
go1.18.2b7 dcdb19874ff3 src https://go-boringcrypto.storage.googleapis.com/go1.18.2b7.src.tar.gz 3c3ce00cd39cdd2ae9afddd7581c6f8b14f8e96e2bb56b9cb4fec8ff02db63b0
|
||||||
|
go1.17.10b7 6b07de790c08 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.10b7.linux-amd64.tar.gz 3c506a86b1e3e4fcffd6a875e5d47ca23f0a346c1bd6e6163e67dbb96eeec1d5
|
||||||
|
go1.17.10b7 6b07de790c08 src https://go-boringcrypto.storage.googleapis.com/go1.17.10b7.src.tar.gz 9d5914842ea1b36edc2ceb6cfa7d3a79bea450c8b397e86bfae7c73944208f03
|
||||||
|
go1.18.3b7 a69db81af596 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.3b7.linux-amd64.tar.gz 1c13ddfb539141298ee32d26b95345cacdcd245c29fb6bc63acb59f9ba41f519
|
||||||
|
go1.18.3b7 a69db81af596 src https://go-boringcrypto.storage.googleapis.com/go1.18.3b7.src.tar.gz d8123121c491569c698ef713001a2193f13d9a8111a1ba7b2b0d4a2e9bf863db
|
||||||
|
go1.17.11b7 4658e6e324a8 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.11b7.linux-amd64.tar.gz 104a5b10037e7a2646b0458519bf6efe85c6d203ae9f32ede7ed24d4e87f7b2d
|
||||||
|
go1.17.11b7 4658e6e324a8 src https://go-boringcrypto.storage.googleapis.com/go1.17.11b7.src.tar.gz 85a6d4249e38decdaad0cffe784cbe249199e38a18db1c247097a5f91f5d9c10
|
||||||
|
go1.18.4b7 913e3713bed3 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.4b7.linux-amd64.tar.gz 24be93f9718bfb4b7703fe959a69c61e103a0149dda693406cd681f7e00cf6fb
|
||||||
|
go1.18.4b7 913e3713bed3 src https://go-boringcrypto.storage.googleapis.com/go1.18.4b7.src.tar.gz 572ce2d917c06ca87ccd3e51e02e0ad4a09eb0ad283cc762176d11d7cd4777af
|
||||||
|
go1.17.12b7 7d5078e3bf2d linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.12b7.linux-amd64.tar.gz f1a075501f89d1b726a0a71611019679c77944e6ab253991aad79df73859d20a
|
||||||
|
go1.17.12b7 7d5078e3bf2d src https://go-boringcrypto.storage.googleapis.com/go1.17.12b7.src.tar.gz aa7e6eccf8d8ee1fd270eb5acba58b6416ad97decae32ca7eee03193a70defa6
|
||||||
|
go1.18.5b7 270c7b73de4a linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.5b7.linux-amd64.tar.gz 104479cff67e4c749304d95dd5b5e0d065a65780ec03b6378a28432c01504e88
|
||||||
|
go1.18.5b7 270c7b73de4a src https://go-boringcrypto.storage.googleapis.com/go1.18.5b7.src.tar.gz 75f5021bd9b61f837fdd516cc4ec51556c519c7155a2e99ecfb4efeca8655aa7
|
||||||
|
go1.17.13b7 349da2d42d31 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.17.13b7.linux-amd64.tar.gz 489151867b1454ea17d8a02bebb443121623c63585a15c2640e043c432c2d1ef
|
||||||
|
go1.17.13b7 349da2d42d31 src https://go-boringcrypto.storage.googleapis.com/go1.17.13b7.src.tar.gz 8c86eede1718d45a8f934df2b158eb30b5d323255e5ff8885c81319f973f464e
|
||||||
|
go1.18.6b7 5fe109f32326 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.6b7.linux-amd64.tar.gz a81c54b6dfd0750998be758a54ae46ecd5f1442c303c5146e844568c02acb47f
|
||||||
|
go1.18.6b7 5fe109f32326 src https://go-boringcrypto.storage.googleapis.com/go1.18.6b7.src.tar.gz 0afc7b1edb8b7570ba05bc30b112804280b1cc5750e1a3dc8500be5c8b8ba06f
|
||||||
|
go1.18.7b7 e3d1f0e7da63 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.7b7.linux-amd64.tar.gz 96694715f7d8122670a5e919b122470817041077e0f98ffd2c2643df5824ee82
|
||||||
|
go1.18.7b7 e3d1f0e7da63 src https://go-boringcrypto.storage.googleapis.com/go1.18.7b7.src.tar.gz c62ba13f792f64f31381d34a7d6b14aec0b04363eb67085b999d1d6e51a94136
|
||||||
|
go1.18.8b7 94108e21ab6f linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.8b7.linux-amd64.tar.gz 9df1f697273b29a5f8b23e5ed2bfd187237d886c2ebac360f457537c7b17dcd8
|
||||||
|
go1.18.8b7 94108e21ab6f src https://go-boringcrypto.storage.googleapis.com/go1.18.8b7.src.tar.gz c3028846650b42cf77c1c0d540791eaa1283c8e60e2a87e28ae43658ffdc262a
|
||||||
|
go1.18.9b7 fc1ed37e824b linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.9b7.linux-amd64.tar.gz 65f15218ed55697de24d4f58f43ed3c1ff35eb59462aab8002554cc479bf573c
|
||||||
|
go1.18.9b7 fc1ed37e824b src https://go-boringcrypto.storage.googleapis.com/go1.18.9b7.src.tar.gz 45b1ed1d3f63d1fa86c6f26329f11912c1dbfb1fa4fd39cf0eabc84e29f86cd7
|
||||||
|
go1.18.10b7 7058c2cb4132 linux-amd64 https://go-boringcrypto.storage.googleapis.com/go1.18.10b7.linux-amd64.tar.gz 17897c0f3716c8bc8ad3db9a41b7b35820b9d43cff3982193808f9af13e7dae5
|
||||||
|
go1.18.10b7 7058c2cb4132 src https://go-boringcrypto.storage.googleapis.com/go1.18.10b7.src.tar.gz 4ced930d738cb30f4c4b28b7281d1e2e397eda2353b4c8f7c6de82ef589acc0b
|
||||||
1
misc/boring/VERSION
Normal file
1
misc/boring/VERSION
Normal file
@@ -0,0 +1 @@
|
|||||||
|
8
|
||||||
58
misc/boring/build.docker
Executable file
58
misc/boring/build.docker
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
# Use of this source code is governed by a BSD-style
|
||||||
|
# license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
# build.docker builds and publishes a Docker image for
|
||||||
|
# a given Go+BoringCrypto release.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# With no arguments, use the most recent linux-amd64 release in the RELEASES file.
|
||||||
|
case "$#" in
|
||||||
|
0)
|
||||||
|
version=$(grep linux-amd64 RELEASES | tail -1 | awk '{print $1}');;
|
||||||
|
1)
|
||||||
|
version="$1";;
|
||||||
|
*)
|
||||||
|
echo 'usage: build.docker [version]' >&2
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
|
||||||
|
url="$(grep "^$version .* linux-amd64 " RELEASES | awk '{print $4}')"
|
||||||
|
sha256="$(grep "^$version .* linux-amd64 " RELEASES | awk '{print $5}')"
|
||||||
|
if [ "$sha256" = "" ]; then
|
||||||
|
echo "cannot find $version in RELEASES file" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build a temporary directory with a Dockerfile.
|
||||||
|
dir=$(mktemp -d)
|
||||||
|
trap "rm -rf $dir" EXIT
|
||||||
|
|
||||||
|
if echo "$url" | grep '!' >/dev/null; then
|
||||||
|
# ! is sed delimiter below. Should never happen.
|
||||||
|
echo "URL contains an exclamation mark!" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
dversion=$(echo "$version" | sed 's/^go//')
|
||||||
|
sed "s!UUU!$url!; s/SSS/$sha256/; s/VVV/$dversion/" dockerfile.in >$dir/Dockerfile
|
||||||
|
|
||||||
|
dpkg=us-docker.pkg.dev/google.com/api-project-999119582588/go-boringcrypto/golang:$dversion
|
||||||
|
|
||||||
|
docker build --pull -t $dpkg $dir
|
||||||
|
docker run $dpkg go version
|
||||||
|
docker run $dpkg go tool nm /usr/local/go/bin/go >$dir/nm
|
||||||
|
if ! grep crypto/internal/boring/sig.BoringCrypto $dir/nm >/dev/null; then
|
||||||
|
echo 'built docker image but did NOT find sig.BoringCrypto in go command!' >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
if egrep 'crypto/sha256\.\(\*digest\)' $dir/nm >/dev/null; then
|
||||||
|
echo 'built docker image but DID find sha256.(*digest) in go command unexpectedly!' >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
docker push $dpkg
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo published as $dpkg
|
||||||
102
misc/boring/build.release
Executable file
102
misc/boring/build.release
Executable file
@@ -0,0 +1,102 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
# Use of this source code is governed by a BSD-style
|
||||||
|
# license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
# build.release builds and publishes a new Go+BoringCrypto release.
|
||||||
|
# After running this script, the change to the RELEASES file should be
|
||||||
|
# sent out for review and committed to the repository (but the release
|
||||||
|
# is already done, so there's not much to review).
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case "$#" in
|
||||||
|
0)
|
||||||
|
rev=HEAD;;
|
||||||
|
1)
|
||||||
|
rev="$1";;
|
||||||
|
*)
|
||||||
|
echo 'usage: build.release [git-rev]' >&2
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Determine commit to use.
|
||||||
|
commit=$(git rev-parse "$rev" | awk '{print substr($1, 1, 12)}')
|
||||||
|
if [ "$commit" = "" ]; then
|
||||||
|
echo 'cannot find commit in git history' >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Determine base Go release from tags.
|
||||||
|
base=$(git log --decorate=short --oneline "$rev" | grep 'tag: go' | sed 1q | sed 's/[),].*//; s/.*tag: //')
|
||||||
|
if [ "$base" = "" ]; then
|
||||||
|
echo "cannot find go release tag in git history for $rev" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Determine boring crypto version from file.
|
||||||
|
boring=$(git show "$commit:misc/boring/VERSION")
|
||||||
|
if [ "$boring" = "" ]; then
|
||||||
|
echo "missing BORINGVERSION file in $commit" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure we're not redefining a published release.
|
||||||
|
version="${base}b${boring}"
|
||||||
|
if grep "^$version " RELEASES >/dev/null; then
|
||||||
|
echo "found $version in RELEASES - not rereleasing" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show what's going on, while the release builds.
|
||||||
|
# Good time for user to type ^C if something is wrong.
|
||||||
|
echo >&2
|
||||||
|
echo "building $version from $commit" >&2
|
||||||
|
echo >&2
|
||||||
|
git log -n1 "$commit" >&2
|
||||||
|
echo >&2
|
||||||
|
|
||||||
|
# Build the release tool in a temporary directory.
|
||||||
|
dir=$(mktemp -d)
|
||||||
|
trap "rm -rf $dir" EXIT
|
||||||
|
GOBIN="$dir" go install golang.org/x/build/cmd/release@latest
|
||||||
|
|
||||||
|
# Build the release.
|
||||||
|
sha() {
|
||||||
|
if hash sha256sum 2>/dev/null; then
|
||||||
|
sha256sum "$@"
|
||||||
|
else
|
||||||
|
shasum -a 256 "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
shortgo=$(echo "$base" | perl -pe 's/(go\d+\.\d+)(\.\d+|rc\d+)/$1/')
|
||||||
|
$dir/release -target linux-amd64 -rev "$commit" -version "$version" -skip_long_tests
|
||||||
|
$dir/release -target src -rev "$commit" -version "$version"
|
||||||
|
output="$version.linux-amd64.tar.gz"
|
||||||
|
ls -l "$output"
|
||||||
|
sha256=$(sha "$output" | awk '{print $1}')
|
||||||
|
outputsrc="$version.src.tar.gz"
|
||||||
|
ls -l "$outputsrc"
|
||||||
|
sha256src=$(sha "$outputsrc" | awk '{print $1}')
|
||||||
|
|
||||||
|
trap "rm -f /tmp/go.release.$$ /tmp/go.nm.$$" EXIT
|
||||||
|
tar -xzf "$output" -O go/bin/go >/tmp/go.release.$$
|
||||||
|
go tool nm /tmp/go.release.$$ >/tmp/go.nm.$$
|
||||||
|
if ! grep crypto/internal/boring/sig.BoringCrypto /tmp/go.nm.$$ >/dev/null; then
|
||||||
|
echo 'built release but did NOT find sig.BoringCrypto in go command!' >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
if egrep 'crypto/sha256\.\(\*digest\)' /tmp/go.nm.$$ >/dev/null; then
|
||||||
|
echo 'built release but DID find sha256.(*digest) in go command unexpectedly!' >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Publish the release.
|
||||||
|
gsutil cp "$output" gs://go-boringcrypto/
|
||||||
|
url="https://go-boringcrypto.storage.googleapis.com/$output"
|
||||||
|
gsutil cp "$outputsrc" gs://go-boringcrypto/
|
||||||
|
urlsrc="https://go-boringcrypto.storage.googleapis.com/$outputsrc"
|
||||||
|
|
||||||
|
# Record that it was published.
|
||||||
|
echo "$version $commit linux-amd64 $url $sha256" >>RELEASES
|
||||||
|
echo "$version $commit src $urlsrc $sha256src" >>RELEASES
|
||||||
31
misc/boring/dockerfile.in
Normal file
31
misc/boring/dockerfile.in
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Template for Dockerfile, used in build.docker script.
|
||||||
|
# Based on https://github.com/docker-library/golang/blob/7e3d99a803/1.13/buster/Dockerfile
|
||||||
|
FROM buildpack-deps:buster-scm
|
||||||
|
|
||||||
|
# gcc for cgo
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
g++ \
|
||||||
|
gcc \
|
||||||
|
libc6-dev \
|
||||||
|
make \
|
||||||
|
pkg-config \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ENV GOLANG_VERSION VVV
|
||||||
|
|
||||||
|
RUN set -eux; \
|
||||||
|
\
|
||||||
|
url="UUU"; \
|
||||||
|
wget -O go.tgz "$url"; \
|
||||||
|
echo "SSS go.tgz" | sha256sum -c -; \
|
||||||
|
tar -C /usr/local -xzf go.tgz; \
|
||||||
|
rm go.tgz; \
|
||||||
|
\
|
||||||
|
export PATH="/usr/local/go/bin:$PATH"; \
|
||||||
|
go version
|
||||||
|
|
||||||
|
ENV GOPATH /go
|
||||||
|
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
|
||||||
|
|
||||||
|
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
|
||||||
|
WORKDIR $GOPATH
|
||||||
34
misc/boring/merge.sh
Executable file
34
misc/boring/merge.sh
Executable file
@@ -0,0 +1,34 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [ "$#" -ne 2 ]; then
|
||||||
|
echo "usage: merge.sh <target branch> <source revision>"
|
||||||
|
echo ""
|
||||||
|
echo "example: merge.sh dev.boringcrypto master"
|
||||||
|
echo " merge.sh dev.boringcrypto.go1.10 go1.10.7"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
TARGET="$1"
|
||||||
|
SOURCE="$2"
|
||||||
|
WORKTREE="$(mktemp -d)"
|
||||||
|
BRANCH="boring/merge-$TARGET-$(date +%Y%m%d%H%M%S)"
|
||||||
|
|
||||||
|
git fetch
|
||||||
|
git worktree add --track -b "$BRANCH" "$WORKTREE" "origin/$TARGET"
|
||||||
|
|
||||||
|
cd "$WORKTREE"
|
||||||
|
export GIT_GOFMT_HOOK=off
|
||||||
|
git merge --no-commit --no-stat "$SOURCE" || echo "Ignoring conflict..."
|
||||||
|
[[ -f VERSION ]] && git rm -f VERSION
|
||||||
|
git checkout --ours codereview.cfg && git add codereview.cfg
|
||||||
|
git commit -m "all: merge $SOURCE into $TARGET"
|
||||||
|
|
||||||
|
if ! git log --format=%B -n 1 | grep "\[$TARGET\] "; then
|
||||||
|
echo "The commit does not seem to be targeting the BoringCrypto branch."
|
||||||
|
echo "(Or you are missing the git-codereview hooks.)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git codereview mail -trybot HEAD
|
||||||
|
cd - && git worktree remove "$WORKTREE"
|
||||||
34
misc/boring/release.sh
Executable file
34
misc/boring/release.sh
Executable file
@@ -0,0 +1,34 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [ "$#" -eq 0 ]; then
|
||||||
|
echo "usage: <target branch> [<target branch> ...]"
|
||||||
|
echo ""
|
||||||
|
echo "example: release.sh dev.boringcrypto.go1.11 dev.boringcrypto.go1.12"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check that the Docker daemon is available.
|
||||||
|
docker ps > /dev/null
|
||||||
|
|
||||||
|
WORKTREE="$(mktemp -d)"
|
||||||
|
BRANCH="boring/release-$(date +%Y%m%d%H%M%S)"
|
||||||
|
|
||||||
|
git fetch
|
||||||
|
git worktree add --track -b "$BRANCH" "$WORKTREE" origin/dev.boringcrypto
|
||||||
|
|
||||||
|
cd "$WORKTREE/src"
|
||||||
|
GOEXPERIMENT=boringcrypto ./make.bash
|
||||||
|
|
||||||
|
cd ../misc/boring
|
||||||
|
for branch in "$@"; do
|
||||||
|
./build.release "origin/$branch"
|
||||||
|
./build.docker
|
||||||
|
done
|
||||||
|
|
||||||
|
git add RELEASES
|
||||||
|
git commit -m "misc/boring: add new releases to RELEASES file"
|
||||||
|
git codereview mail
|
||||||
|
|
||||||
|
rm *.tar.gz
|
||||||
|
cd - && git worktree remove "$WORKTREE"
|
||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
"go/ast"
|
"go/ast"
|
||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
"internal/testenv"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -66,9 +66,6 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestArgumentsPositions(t *testing.T) {
|
func TestArgumentsPositions(t *testing.T) {
|
||||||
testenv.MustHaveCGO(t)
|
|
||||||
testenv.MustHaveExec(t)
|
|
||||||
|
|
||||||
testdata, err := filepath.Abs("testdata")
|
testdata, err := filepath.Abs("testdata")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@@ -91,7 +88,7 @@ func TestArgumentsPositions(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("%s: %v\n%s", cmd, err, cmd.Stderr)
|
t.Fatalf("%s: %v\n%s", cmd, err, cmd.Stderr)
|
||||||
}
|
}
|
||||||
mainProcessed, err := os.ReadFile(filepath.Join(dir, "issue42580.cgo1.go"))
|
mainProcessed, err := ioutil.ReadFile(filepath.Join(dir, "issue42580.cgo1.go"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -6,8 +6,6 @@ package errorstest
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"cmd/internal/quoted"
|
|
||||||
"internal/testenv"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -41,9 +39,6 @@ func main() {
|
|||||||
`
|
`
|
||||||
|
|
||||||
func TestBadSymbol(t *testing.T) {
|
func TestBadSymbol(t *testing.T) {
|
||||||
testenv.MustHaveGoBuild(t)
|
|
||||||
testenv.MustHaveCGO(t)
|
|
||||||
|
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
|
|
||||||
mkdir := func(base string) string {
|
mkdir := func(base string) string {
|
||||||
@@ -172,14 +167,7 @@ func TestBadSymbol(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func cCompilerCmd(t *testing.T) []string {
|
func cCompilerCmd(t *testing.T) []string {
|
||||||
cc, err := quoted.Split(goEnv(t, "CC"))
|
cc := []string{goEnv(t, "CC")}
|
||||||
if err != nil {
|
|
||||||
t.Skipf("parsing go env CC: %s", err)
|
|
||||||
}
|
|
||||||
if len(cc) == 0 {
|
|
||||||
t.Skipf("no C compiler")
|
|
||||||
}
|
|
||||||
testenv.MustHaveExecPath(t, cc[0])
|
|
||||||
|
|
||||||
out := goEnv(t, "GOGCCFLAGS")
|
out := goEnv(t, "GOGCCFLAGS")
|
||||||
quote := '\000'
|
quote := '\000'
|
||||||
@@ -7,7 +7,6 @@ package errorstest
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"internal/testenv"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -23,8 +22,6 @@ func path(file string) string {
|
|||||||
|
|
||||||
func check(t *testing.T, file string) {
|
func check(t *testing.T, file string) {
|
||||||
t.Run(file, func(t *testing.T) {
|
t.Run(file, func(t *testing.T) {
|
||||||
testenv.MustHaveGoBuild(t)
|
|
||||||
testenv.MustHaveCGO(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
contents, err := os.ReadFile(path(file))
|
contents, err := os.ReadFile(path(file))
|
||||||
@@ -92,8 +89,6 @@ func expect(t *testing.T, file string, errors []*regexp.Regexp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sizeofLongDouble(t *testing.T) int {
|
func sizeofLongDouble(t *testing.T) int {
|
||||||
testenv.MustHaveGoRun(t)
|
|
||||||
testenv.MustHaveCGO(t)
|
|
||||||
cmd := exec.Command("go", "run", path("long_double_size.go"))
|
cmd := exec.Command("go", "run", path("long_double_size.go"))
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -117,7 +112,6 @@ func TestReportsTypeErrors(t *testing.T) {
|
|||||||
"issue18889.go",
|
"issue18889.go",
|
||||||
"issue28721.go",
|
"issue28721.go",
|
||||||
"issue33061.go",
|
"issue33061.go",
|
||||||
"issue50710.go",
|
|
||||||
} {
|
} {
|
||||||
check(t, file)
|
check(t, file)
|
||||||
}
|
}
|
||||||
@@ -139,8 +133,6 @@ func TestToleratesOptimizationFlag(t *testing.T) {
|
|||||||
} {
|
} {
|
||||||
cflags := cflags
|
cflags := cflags
|
||||||
t.Run(cflags, func(t *testing.T) {
|
t.Run(cflags, func(t *testing.T) {
|
||||||
testenv.MustHaveGoBuild(t)
|
|
||||||
testenv.MustHaveCGO(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", path("issue14669.go"))
|
cmd := exec.Command("go", "build", path("issue14669.go"))
|
||||||
@@ -154,8 +146,6 @@ func TestToleratesOptimizationFlag(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMallocCrashesOnNil(t *testing.T) {
|
func TestMallocCrashesOnNil(t *testing.T) {
|
||||||
testenv.MustHaveCGO(t)
|
|
||||||
testenv.MustHaveGoRun(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cmd := exec.Command("go", "run", path("malloc.go"))
|
cmd := exec.Command("go", "run", path("malloc.go"))
|
||||||
@@ -10,12 +10,9 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"internal/testenv"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
|
||||||
"slices"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -164,17 +161,6 @@ var ptrTests = []ptrTest{
|
|||||||
fail: true,
|
fail: true,
|
||||||
expensive: true,
|
expensive: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
// Storing a pinned Go pointer into C memory should succeed.
|
|
||||||
name: "barrierpinnedok",
|
|
||||||
c: `#include <stdlib.h>
|
|
||||||
char **f14a2() { return malloc(sizeof(char*)); }
|
|
||||||
void f14b2(char **p) {}`,
|
|
||||||
imports: []string{"runtime"},
|
|
||||||
body: `var pinr runtime.Pinner; p := C.f14a2(); x := new(C.char); pinr.Pin(x); *p = x; C.f14b2(p); pinr.Unpin()`,
|
|
||||||
fail: false,
|
|
||||||
expensive: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
// Storing a Go pointer into C memory by assigning a
|
// Storing a Go pointer into C memory by assigning a
|
||||||
// large value should fail.
|
// large value should fail.
|
||||||
@@ -445,54 +431,10 @@ var ptrTests = []ptrTest{
|
|||||||
body: `s := &S40{p: new(int)}; C.f40((*C.struct_S40i)(&s.a))`,
|
body: `s := &S40{p: new(int)}; C.f40((*C.struct_S40i)(&s.a))`,
|
||||||
fail: false,
|
fail: false,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
// Test that we handle unsafe.StringData.
|
|
||||||
name: "stringdata",
|
|
||||||
c: `void f41(void* p) {}`,
|
|
||||||
imports: []string{"unsafe"},
|
|
||||||
body: `s := struct { a [4]byte; p *int }{p: new(int)}; str := unsafe.String(&s.a[0], 4); C.f41(unsafe.Pointer(unsafe.StringData(str)))`,
|
|
||||||
fail: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "slicedata",
|
|
||||||
c: `void f42(void* p) {}`,
|
|
||||||
imports: []string{"unsafe"},
|
|
||||||
body: `s := []*byte{nil, new(byte)}; C.f42(unsafe.Pointer(unsafe.SliceData(s)))`,
|
|
||||||
fail: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "slicedata2",
|
|
||||||
c: `void f43(void* p) {}`,
|
|
||||||
imports: []string{"unsafe"},
|
|
||||||
body: `s := struct { a [4]byte; p *int }{p: new(int)}; C.f43(unsafe.Pointer(unsafe.SliceData(s.a[:])))`,
|
|
||||||
fail: false,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPointerChecks(t *testing.T) {
|
func TestPointerChecks(t *testing.T) {
|
||||||
testenv.MustHaveGoBuild(t)
|
dir, exe := buildPtrTests(t)
|
||||||
testenv.MustHaveCGO(t)
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
// TODO: Skip just the cases that fail?
|
|
||||||
t.Skipf("some tests fail to build on %s", runtime.GOOS)
|
|
||||||
}
|
|
||||||
|
|
||||||
var gopath string
|
|
||||||
var dir string
|
|
||||||
if *tmp != "" {
|
|
||||||
gopath = *tmp
|
|
||||||
dir = ""
|
|
||||||
} else {
|
|
||||||
d, err := os.MkdirTemp("", filepath.Base(t.Name()))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
dir = d
|
|
||||||
gopath = d
|
|
||||||
}
|
|
||||||
|
|
||||||
exe := buildPtrTests(t, gopath, false)
|
|
||||||
exe2 := buildPtrTests(t, gopath, true)
|
|
||||||
|
|
||||||
// We (TestPointerChecks) return before the parallel subtest functions do,
|
// We (TestPointerChecks) return before the parallel subtest functions do,
|
||||||
// so we can't just defer os.RemoveAll(dir). Instead we have to wait for
|
// so we can't just defer os.RemoveAll(dir). Instead we have to wait for
|
||||||
@@ -509,18 +451,30 @@ func TestPointerChecks(t *testing.T) {
|
|||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
testOne(t, pt, exe, exe2)
|
testOne(t, pt, exe)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildPtrTests(t *testing.T, gopath string, cgocheck2 bool) (exe string) {
|
func buildPtrTests(t *testing.T) (dir, exe string) {
|
||||||
|
var gopath string
|
||||||
|
if *tmp != "" {
|
||||||
|
gopath = *tmp
|
||||||
|
dir = ""
|
||||||
|
} else {
|
||||||
|
d, err := os.MkdirTemp("", filepath.Base(t.Name()))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
dir = d
|
||||||
|
gopath = d
|
||||||
|
}
|
||||||
|
|
||||||
src := filepath.Join(gopath, "src", "ptrtest")
|
src := filepath.Join(gopath, "src", "ptrtest")
|
||||||
if err := os.MkdirAll(src, 0777); err != nil {
|
if err := os.MkdirAll(src, 0777); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := os.WriteFile(filepath.Join(src, "go.mod"), []byte("module ptrtest\ngo 1.20"), 0666); err != nil {
|
if err := os.WriteFile(filepath.Join(src, "go.mod"), []byte("module ptrtest"), 0666); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -587,38 +541,15 @@ func buildPtrTests(t *testing.T, gopath string, cgocheck2 bool) (exe string) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
exeName := "ptrtest.exe"
|
cmd := exec.Command("go", "build", "-o", "ptrtest.exe")
|
||||||
if cgocheck2 {
|
|
||||||
exeName = "ptrtest2.exe"
|
|
||||||
}
|
|
||||||
cmd := exec.Command("go", "build", "-o", exeName)
|
|
||||||
cmd.Dir = src
|
cmd.Dir = src
|
||||||
cmd.Env = append(os.Environ(), "GOPATH="+gopath)
|
cmd.Env = append(os.Environ(), "GOPATH="+gopath)
|
||||||
|
|
||||||
// Set or remove cgocheck2 from the environment.
|
|
||||||
goexperiment := strings.Split(os.Getenv("GOEXPERIMENT"), ",")
|
|
||||||
if len(goexperiment) == 1 && goexperiment[0] == "" {
|
|
||||||
goexperiment = nil
|
|
||||||
}
|
|
||||||
i := slices.Index(goexperiment, "cgocheck2")
|
|
||||||
changed := false
|
|
||||||
if cgocheck2 && i < 0 {
|
|
||||||
goexperiment = append(goexperiment, "cgocheck2")
|
|
||||||
changed = true
|
|
||||||
} else if !cgocheck2 && i >= 0 {
|
|
||||||
goexperiment = append(goexperiment[:i], goexperiment[i+1:]...)
|
|
||||||
changed = true
|
|
||||||
}
|
|
||||||
if changed {
|
|
||||||
cmd.Env = append(cmd.Env, "GOEXPERIMENT="+strings.Join(goexperiment, ","))
|
|
||||||
}
|
|
||||||
|
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("go build: %v\n%s", err, out)
|
t.Fatalf("go build: %v\n%s", err, out)
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Join(src, exeName)
|
return dir, filepath.Join(src, "ptrtest.exe")
|
||||||
}
|
}
|
||||||
|
|
||||||
const ptrTestMain = `
|
const ptrTestMain = `
|
||||||
@@ -635,7 +566,7 @@ func main() {
|
|||||||
|
|
||||||
var csem = make(chan bool, 16)
|
var csem = make(chan bool, 16)
|
||||||
|
|
||||||
func testOne(t *testing.T, pt ptrTest, exe, exe2 string) {
|
func testOne(t *testing.T, pt ptrTest, exe string) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
// Run the tests in parallel, but don't run too many
|
// Run the tests in parallel, but don't run too many
|
||||||
@@ -643,12 +574,7 @@ func testOne(t *testing.T, pt ptrTest, exe, exe2 string) {
|
|||||||
runcmd := func(cgocheck string) ([]byte, error) {
|
runcmd := func(cgocheck string) ([]byte, error) {
|
||||||
csem <- true
|
csem <- true
|
||||||
defer func() { <-csem }()
|
defer func() { <-csem }()
|
||||||
x := exe
|
cmd := exec.Command(exe, pt.name)
|
||||||
if cgocheck == "2" {
|
|
||||||
x = exe2
|
|
||||||
cgocheck = "1"
|
|
||||||
}
|
|
||||||
cmd := exec.Command(x, pt.name)
|
|
||||||
cmd.Env = append(os.Environ(), "GODEBUG=cgocheck="+cgocheck)
|
cmd.Env = append(os.Environ(), "GODEBUG=cgocheck="+cgocheck)
|
||||||
return cmd.CombinedOutput()
|
return cmd.CombinedOutput()
|
||||||
}
|
}
|
||||||
12
misc/cgo/fortran/fortran.go
Normal file
12
misc/cgo/fortran/fortran.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package fortran
|
||||||
|
|
||||||
|
// int the_answer();
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
func TheAnswer() int {
|
||||||
|
return int(C.the_answer())
|
||||||
|
}
|
||||||
13
misc/cgo/fortran/fortran_test.go
Normal file
13
misc/cgo/fortran/fortran_test.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package fortran
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestFortran(t *testing.T) {
|
||||||
|
if a := TheAnswer(); a != 42 {
|
||||||
|
t.Errorf("Unexpected result for The Answer. Got: %d Want: 42", a)
|
||||||
|
}
|
||||||
|
}
|
||||||
44
misc/cgo/fortran/test.bash
Executable file
44
misc/cgo/fortran/test.bash
Executable file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
# Use of this source code is governed by a BSD-style
|
||||||
|
# license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
# This directory is intended to test the use of Fortran with cgo.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
FC=$1
|
||||||
|
|
||||||
|
goos=$(go env GOOS)
|
||||||
|
|
||||||
|
libext="so"
|
||||||
|
if [ "$goos" = "darwin" ]; then
|
||||||
|
libext="dylib"
|
||||||
|
elif [ "$goos" = "aix" ]; then
|
||||||
|
libtext="a"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$FC" in
|
||||||
|
*gfortran*)
|
||||||
|
libpath=$(dirname $($FC -print-file-name=libgfortran.$libext))
|
||||||
|
if [ "$goos" != "aix" ]; then
|
||||||
|
RPATH_FLAG="-Wl,-rpath,$libpath"
|
||||||
|
fi
|
||||||
|
export CGO_LDFLAGS="$CGO_LDFLAGS $RPATH_FLAG -L $libpath"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if ! $FC helloworld/helloworld.f90 -o /dev/null >& /dev/null; then
|
||||||
|
echo "skipping Fortran test: could not build helloworld.f90 with $FC"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
rm -f main.exe
|
||||||
|
|
||||||
|
status=0
|
||||||
|
|
||||||
|
if ! go test; then
|
||||||
|
echo "FAIL: go test"
|
||||||
|
status=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $status
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build ignore
|
//go:build ignore
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
// Compute Fibonacci numbers with two goroutines
|
// Compute Fibonacci numbers with two goroutines
|
||||||
// that pass integers back and forth. No actual
|
// that pass integers back and forth. No actual
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build ignore
|
//go:build ignore
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
63
misc/cgo/life/life_test.go
Normal file
63
misc/cgo/life/life_test.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package life_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
log.SetFlags(log.Lshortfile)
|
||||||
|
os.Exit(testMain(m))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testMain(m *testing.M) int {
|
||||||
|
GOPATH, err := os.MkdirTemp("", "cgolife")
|
||||||
|
if err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(GOPATH)
|
||||||
|
os.Setenv("GOPATH", GOPATH)
|
||||||
|
|
||||||
|
// Copy testdata into GOPATH/src/cgolife, along with a go.mod file
|
||||||
|
// declaring the same path.
|
||||||
|
modRoot := filepath.Join(GOPATH, "src", "cgolife")
|
||||||
|
if err := overlayDir(modRoot, "testdata"); err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
if err := os.Chdir(modRoot); err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
os.Setenv("PWD", modRoot)
|
||||||
|
if err := os.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return m.Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTestRun(t *testing.T) {
|
||||||
|
if os.Getenv("GOOS") == "android" {
|
||||||
|
t.Skip("the go tool runs with CGO_ENABLED=0 on the android device")
|
||||||
|
}
|
||||||
|
out, err := exec.Command("go", "env", "GOROOT").Output()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
GOROOT := string(bytes.TrimSpace(out))
|
||||||
|
|
||||||
|
cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
|
||||||
|
out, err = cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
|
||||||
|
}
|
||||||
|
t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
|
||||||
|
}
|
||||||
78
misc/cgo/life/overlaydir_test.go
Normal file
78
misc/cgo/life/overlaydir_test.go
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package life_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
||||||
|
//
|
||||||
|
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
||||||
|
// factor this function out into a package to reduce duplication.
|
||||||
|
func overlayDir(dstRoot, srcRoot string) error {
|
||||||
|
dstRoot = filepath.Clean(dstRoot)
|
||||||
|
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil || srcPath == srcRoot {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
||||||
|
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
||||||
|
suffix = suffix[1:]
|
||||||
|
}
|
||||||
|
dstPath := filepath.Join(dstRoot, suffix)
|
||||||
|
|
||||||
|
perm := info.Mode() & os.ModePerm
|
||||||
|
if info.Mode()&os.ModeSymlink != 0 {
|
||||||
|
info, err = os.Stat(srcPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
perm = info.Mode() & os.ModePerm
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always copy directories (don't symlink them).
|
||||||
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
|
if info.IsDir() {
|
||||||
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, copy the bytes.
|
||||||
|
src, err := os.Open(srcPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer src.Close()
|
||||||
|
|
||||||
|
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = io.Copy(dst, src)
|
||||||
|
if closeErr := dst.Close(); err == nil {
|
||||||
|
err = closeErr
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
41
misc/cgo/life/testdata/life.go
vendored
Normal file
41
misc/cgo/life/testdata/life.go
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
// skip
|
||||||
|
|
||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package cgolife
|
||||||
|
|
||||||
|
// #include "life.h"
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
|
func Run(gen, x, y int, a []int32) {
|
||||||
|
n := make([]int32, x*y)
|
||||||
|
for i := 0; i < gen; i++ {
|
||||||
|
C.Step(C.int(x), C.int(y), (*C.int)(unsafe.Pointer(&a[0])), (*C.int)(unsafe.Pointer(&n[0])))
|
||||||
|
copy(a, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep the channels visible from Go.
|
||||||
|
var chans [4]chan bool
|
||||||
|
|
||||||
|
//export GoStart
|
||||||
|
// Double return value is just for testing.
|
||||||
|
func GoStart(i, xdim, ydim, xstart, xend, ystart, yend C.int, a *C.int, n *C.int) (int, int) {
|
||||||
|
c := make(chan bool, int(C.MYCONST))
|
||||||
|
go func() {
|
||||||
|
C.DoStep(xdim, ydim, xstart, xend, ystart, yend, a, n)
|
||||||
|
c <- true
|
||||||
|
}()
|
||||||
|
chans[i] = c
|
||||||
|
return int(i), int(i + 100)
|
||||||
|
}
|
||||||
|
|
||||||
|
//export GoWait
|
||||||
|
func GoWait(i C.int) {
|
||||||
|
<-chans[i]
|
||||||
|
chans[i] = nil
|
||||||
|
}
|
||||||
49
misc/cgo/life/testdata/main.go
vendored
Normal file
49
misc/cgo/life/testdata/main.go
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
// run -tags=use_go_run
|
||||||
|
|
||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build test_run
|
||||||
|
|
||||||
|
// Run the game of life in C using Go for parallelization.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"cgolife"
|
||||||
|
)
|
||||||
|
|
||||||
|
const MAXDIM = 100
|
||||||
|
|
||||||
|
var dim = flag.Int("dim", 16, "board dimensions")
|
||||||
|
var gen = flag.Int("gen", 10, "generations")
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
var a [MAXDIM * MAXDIM]int32
|
||||||
|
for i := 2; i < *dim; i += 8 {
|
||||||
|
for j := 2; j < *dim-3; j += 8 {
|
||||||
|
for y := 0; y < 3; y++ {
|
||||||
|
a[i**dim+j+y] = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cgolife.Run(*gen, *dim, *dim, a[:])
|
||||||
|
|
||||||
|
for i := 0; i < *dim; i++ {
|
||||||
|
for j := 0; j < *dim; j++ {
|
||||||
|
if a[i**dim+j] == 0 {
|
||||||
|
fmt.Print(" ")
|
||||||
|
} else {
|
||||||
|
fmt.Print("X")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Print("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
78
misc/cgo/stdio/overlaydir_test.go
Normal file
78
misc/cgo/stdio/overlaydir_test.go
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package stdio_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
|
||||||
|
//
|
||||||
|
// TODO: Once we no longer need to support the misc module in GOPATH mode,
|
||||||
|
// factor this function out into a package to reduce duplication.
|
||||||
|
func overlayDir(dstRoot, srcRoot string) error {
|
||||||
|
dstRoot = filepath.Clean(dstRoot)
|
||||||
|
if err := os.MkdirAll(dstRoot, 0777); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil || srcPath == srcRoot {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
suffix := strings.TrimPrefix(srcPath, srcRoot)
|
||||||
|
for len(suffix) > 0 && suffix[0] == filepath.Separator {
|
||||||
|
suffix = suffix[1:]
|
||||||
|
}
|
||||||
|
dstPath := filepath.Join(dstRoot, suffix)
|
||||||
|
|
||||||
|
perm := info.Mode() & os.ModePerm
|
||||||
|
if info.Mode()&os.ModeSymlink != 0 {
|
||||||
|
info, err = os.Stat(srcPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
perm = info.Mode() & os.ModePerm
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always copy directories (don't symlink them).
|
||||||
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
|
if info.IsDir() {
|
||||||
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, copy the bytes.
|
||||||
|
src, err := os.Open(srcPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer src.Close()
|
||||||
|
|
||||||
|
dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = io.Copy(dst, src)
|
||||||
|
if closeErr := dst.Close(); err == nil {
|
||||||
|
err = closeErr
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
63
misc/cgo/stdio/stdio_test.go
Normal file
63
misc/cgo/stdio/stdio_test.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package stdio_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
log.SetFlags(log.Lshortfile)
|
||||||
|
os.Exit(testMain(m))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testMain(m *testing.M) int {
|
||||||
|
GOPATH, err := os.MkdirTemp("", "cgostdio")
|
||||||
|
if err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(GOPATH)
|
||||||
|
os.Setenv("GOPATH", GOPATH)
|
||||||
|
|
||||||
|
// Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
|
||||||
|
// declaring the same path.
|
||||||
|
modRoot := filepath.Join(GOPATH, "src", "cgostdio")
|
||||||
|
if err := overlayDir(modRoot, "testdata"); err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
if err := os.Chdir(modRoot); err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
os.Setenv("PWD", modRoot)
|
||||||
|
if err := os.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return m.Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTestRun(t *testing.T) {
|
||||||
|
if os.Getenv("GOOS") == "android" {
|
||||||
|
t.Skip("subpackage stdio is not available on android")
|
||||||
|
}
|
||||||
|
out, err := exec.Command("go", "env", "GOROOT").Output()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
GOROOT := string(bytes.TrimSpace(out))
|
||||||
|
|
||||||
|
cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
|
||||||
|
out, err = cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
|
||||||
|
}
|
||||||
|
t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
|
||||||
|
}
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
|
// run -tags=use_go_run
|
||||||
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build test_run
|
// +build test_run
|
||||||
|
|
||||||
// Pass numbers along a chain of threads.
|
// Pass numbers along a chain of threads.
|
||||||
|
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
|
// run -tags=use_go_run
|
||||||
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build test_run
|
// +build test_run
|
||||||
|
|
||||||
// Compute Fibonacci numbers with two goroutines
|
// Compute Fibonacci numbers with two goroutines
|
||||||
// that pass integers back and forth. No actual
|
// that pass integers back and forth. No actual
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
|
// run -tags=use_go_run
|
||||||
|
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build test_run
|
// +build test_run
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user