diff options
author | Robert Griesemer <gri@golang.org> | 2023-05-24 13:23:14 -0700 |
---|---|---|
committer | Robert Griesemer <gri@google.com> | 2023-05-25 21:09:38 +0000 |
commit | f9d114d0e85eba7a79b9656aa65f0ba939787fb6 (patch) | |
tree | 2837985b5fe6ca90dce0035dd82bcf5575cce45d /doc/go_spec.html | |
parent | 01b5cce626c44f7fd1ca7e2c076d63c175193ccf (diff) | |
download | go-f9d114d0e85eba7a79b9656aa65f0ba939787fb6.tar.gz go-f9d114d0e85eba7a79b9656aa65f0ba939787fb6.zip |
spec: document min and max built-ins
For #59488.
Change-Id: I50f65216bf02b42c1e0619702833f4a6dbed8925
Reviewed-on: https://go-review.googlesource.com/c/go/+/498136
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Bypass: Robert Griesemer <gri@google.com>
Diffstat (limited to 'doc/go_spec.html')
-rw-r--r-- | doc/go_spec.html | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/doc/go_spec.html b/doc/go_spec.html index 3f24b53f7f..2caf274ed0 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ <!--{ "Title": "The Go Programming Language Specification", - "Subtitle": "Version of May 24, 2023", + "Subtitle": "Version of May 25, 2023", "Path": "/ref/spec" }--> @@ -643,6 +643,7 @@ an identifier denoting a constant, a <a href="#Constant_expressions">constant expression</a>, a <a href="#Conversions">conversion</a> with a result that is a constant, or the result value of some built-in functions such as +<code>min</code> or <code>max</code> applied to constant arguments, <code>unsafe.Sizeof</code> applied to <a href="#Package_unsafe">certain values</a>, <code>cap</code> or <code>len</code> applied to <a href="#Length_and_capacity">some expressions</a>, @@ -2319,7 +2320,7 @@ Zero value: Functions: append cap clear close complex copy delete imag len - make new panic print println real recover + make max min new panic print println real recover </pre> <h3 id="Exported_identifiers">Exported identifiers</h3> @@ -7531,6 +7532,70 @@ The precise behavior is implementation-dependent. </p> +<h3 id="Min_and_max">Min and max</h3> + +<p> +The built-in functions <code>min</code> and <code>max</code> compute the +smallest—or largest, respectively—value of a fixed number of +arguments of <a href="#Comparison_operators">ordered types</a>. +There must be at least one argument. +</p> + +<p> +The same type rules as for <a href="#Operators">operators</a> apply: +for <a href="#Comparison_operators">ordered</a> arguments <code>x</code> and +<code>y</code>, <code>min(x, y)</code> is valid if <code>x + y</code> is valid, +and the type of <code>min(x, y)</code> is the type of <code>x + y</code> +(and similarly for <code>max</code>). +If all arguments are constant, the result is constant. +</p> + +<pre> +var x, y int +m := min(x) // m == x +m := min(x, y) // m is the smaller of x and y +m := max(x, y, 10) // m is the larger of x and y but at least 10 +c := max(1, 2.0, 10) // c == 10.0 (floating-point kind) +f := max(0, float32(x)) // type of f is float32 +var s []string +_ = min(s...) // invalid: slice arguments are not permitted +t := max("", "foo", "bar") // t == "foo" (string kind) +</pre> + +<p> +For numeric arguments, <code>min</code> and <code>max</code> are +commutative and associative: +</p> + +<pre> +min(x, y) == min(y, x) +min(x, y, z) == min(min(x, y), z) == min(x, min(y, z)) +</pre> + +<p> +For floating-point arguments negative zero, NaN, and infinity the following rules apply: +</p> + +<pre> + x y min(x, y) max(x, y) + + -0.0 0.0 -0.0 0.0 // negative zero is smaller than (non-negative) zero + -Inf y -Inf y // negative infinity is smaller than any other number + +Inf y y +Inf // positive infinity is larger than any other number + NaN y NaN NaN // if any argument is a NaN, the result is a NaN +</pre> + +<p> +For string arguments the result for <code>min</code> is the first argument +with the smallest (or for <code>max</code>, largest) value, +compared lexically byte-wise: +</p> + +<pre> +min(x, y) == if x <= y then x else y +min(x, y, z) == min(min(x, y), z) +</pre> + <h3 id="Allocation">Allocation</h3> <p> |