cmp.Or în Go

Returnează primul argument diferit de valoarea zero a tipului ("", 0, nil); dacă toate sunt zero, returnează zero.

Sintaxă
import "cmp"

func Or[T comparable](vals ...T) T

Ce face cmp.Or

cmp.Or(a, b, c) returnează primul argument care nu este valoarea zero a tipului: "" pentru texte, 0 pentru numere, nil pentru pointeri. Dacă toate sunt zero, returnează zero.

Prima utilizare: valori implicite. cmp.Or(os.Getenv("PORT"), "8080") ia portul din mediu sau, dacă lipsește, 8080.

A doua utilizare: sortare după mai multe criterii. cmp.Or(cmp.Compare(a.Oras, b.Oras), cmp.Compare(a.Nume, b.Nume)) compară după oraș, iar dacă orașele sunt egale (rezultat 0) trece la nume.

Parametri

Parametru Descriere
vals Valorile verificate, în ordine.

Ce returnează

Prima valoare nenulă sau valoarea zero a tipului.

Exemple

Exemplul 1: Valori implicite

Variabila de mediu nu este setată, deci Getenv returnează "" și se folosește valoarea implicită.

package main

import (
    "cmp"
    "fmt"
    "os"
)

func main() {
    port := cmp.Or(os.Getenv("DEXBLOG_PORT_EXEMPLU"), "8080")
    fmt.Println("Port:", port)

    var porecla string
    fmt.Println("Salut,", cmp.Or(porecla, "Ana"))
    fmt.Println(cmp.Or(0, 0, 3, 5))
    fmt.Printf("%q\n", cmp.Or("", ""))
}

Rezultat

Port: 8080
Salut, Ana
3
""

Exemplul 2: Sortare după oraș, apoi după nume

package main

import (
    "cmp"
    "fmt"
    "slices"
)

type Client struct {
    Nume, Oras string
}

func main() {
    clienti := []Client{{"Radu", "Iași"}, {"Ana", "Cluj"}, {"Elena", "Iași"}, {"Bogdan", "Cluj"}}
    slices.SortFunc(clienti, func(a, b Client) int {
        return cmp.Or(
            cmp.Compare(a.Oras, b.Oras),
            cmp.Compare(a.Nume, b.Nume),
        )
    })
    for _, c := range clienti {
        fmt.Println(c.Oras, c.Nume)
    }
}

Rezultat

Cluj Ana
Cluj Bogdan
Iași Elena
Iași Radu

Greșeli frecvente

  • Folosești cmp.Or când 0 sau "" este o valoare validă (de exemplu o reducere de 0%): Or o tratează ca „lipsă” și alege valoarea implicită.
  • Te aștepți ca cmp.Or să evalueze argumentele leneș, ca ||: toate argumentele sunt calculate înainte de apel.

Comenzi înrudite

  • cmp.Compare: Compare returnează -1, 0 sau +1 după cum x este mai mic, egal sau mai mare decât y; Less spune dacă x < y.
  • slices.SortFunc: Sortează un slice după o funcție de comparare care returnează negativ, zero sau pozitiv; SortStableFunc păstrează ordinea celor egali.
  • sort.Slice: Sortează un slice de orice tip după o funcție less(i, j); SliceStable păstrează ordinea elementelor egale.