min și max în Go

Returnează cel mai mic, respectiv cel mai mare dintre argumente; merg pe numere și texte (Go 1.21).

Sintaxă
func min[T cmp.Ordered](x T, y ...T) T
func max[T cmp.Ordered](x T, y ...T) T

min(3, 7, 1)        // 1
max("Arad", "Iași")  // "Iași"

Ce face min și max

min și max primesc unul sau mai multe argumente de același tip ordonat (întregi, numere reale sau texte) și returnează cel mai mic, respectiv cel mai mare. Textele se compară octet cu octet (ordine lexicografică), deci literele mari vin înaintea celor mici, iar diacriticele după alfabetul englez.

Funcțiile primesc valori separate, nu un slice: pentru un slice folosește slices.Min(s) și slices.Max(s). Dacă toate argumentele sunt constante, rezultatul este și el constant. La numere reale, dacă un argument este NaN, rezultatul este NaN.

Un caz foarte des întâlnit este limitarea unei valori într-un interval: max(minim, min(x, maxim)).

Parametri

Parametru Descriere
x Primul argument (obligatoriu).
y Celelalte argumente, de același tip, opționale.

Ce returnează

Cea mai mică (min) sau cea mai mare (max) valoare.

Exemple

Exemplul 1: Numere și texte

package main

import "fmt"

func main() {
    fmt.Println(min(7, 3, 9), max(7, 3, 9))
    fmt.Println(min(2.5, 1.75), max(-1, 0))
    fmt.Println(min("Iași", "Arad", "Cluj"), max("Iași", "Arad", "Cluj"))

    const limita = max(10, 20) // constantă
    fmt.Println(limita)
}

Rezultat

3 9
1.75 0
Arad Iași
20

Exemplul 2: Limitarea într-un interval

Nota este ținută între 1 și 10, oricât de greșită ar fi valoarea introdusă.

package main

import (
    "fmt"
    "slices"
)

func limiteaza(x, jos, sus int) int {
    return max(jos, min(x, sus))
}

func main() {
    for _, n := range []int{-3, 7, 15} {
        fmt.Println(n, "->", limiteaza(n, 1, 10))
    }
    note := []int{8, 10, 6, 9}
    fmt.Println("din slice:", slices.Min(note), slices.Max(note))
}

Rezultat

-3 -> 1
7 -> 7
15 -> 10
din slice: 6 10

Greșeli frecvente

  • min(note) cu un slice: invalid argument: note (variable of type []int) cannot be ordered. Folosește slices.Min.
  • Tipuri amestecate: min(n, 2.5) cu n int nu compilează: 2.5 (untyped float constant) truncated to int.
  • Funcții proprii numite min/max în cod vechi: ascund funcțiile predefinite din Go 1.21.

Comenzi înrudite

  • generics (parametri de tip): Funcții și tipuri care lucrează cu mai multe tipuri, scrise o singură dată cu parametri de tip [T constrângere].
  • funcții variadice (...): Funcții care primesc oricâte argumente de același tip prin …T; în funcție ele sunt un slice.
  • comparable: Constrângere predefinită pentru generics: tipurile care se pot compara cu == și != (pot fi chei de map).