Technology sharing

Explicatio Ite generica

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Introductio

Si munus scribere velimus ut duos integros numeros comparare et punctum fluitantis numerorum respective, scribere debemus duo munera. sic:

func Min(x, y float64) float64 {
    if x < y {
        return x
    }
    return y
}

func MinInt(x, y int) int {
	if x < y {
		return x
	}
	return y
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Duae functiones eandem prorsus habent logicam processus, exceptis diversis speciebus datae. Estne aliquis modus praedicta functione una functione ad perficiendum? Ita generale est.

func min[T int | float64](x, y T) T {
	if x < y {
		return x
	}
	return y
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Generic

Documentum officialis website:https://go.dev/blog/intro-generics
Genera tria notae linguae notae magni momenti addunt:

  • Typus parametri ad munera et genera.
  • Definire genus instrumenti sicut copia generum, etiam genera sine modis.
  • Genus illationis, in multis casibus permittit typus ambitum omitti cum functiones vocant.

Typus Morbi

Munera et genera nunc permittuntur ut ambitum generis habeant. Genus parametri electronicum simile normali parametri indicem spectat, excepto quod uncis quadratis loco uncis rotundis utitur.
Insert imaginem descriptionis hic

package main

import (
	"fmt"
	"golang.org/x/exp/constraints"
)

func GMin[T constraints.Ordered](x, y T) T {
	if x < y {
		return x
	}
	return y
}

func main() {
	x := GMin[int](2, 3)
	fmt.Println(x) // 输出结果为2
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Inter eas angustias. Ordo consuetudinis typus est (the source code is not shown here).
Si non intelligis, angustias temporis reponere potes. Ordo cum ·int | float64

Parametrum typum praebens (int in hoc casu) GMin vocatur instantiatio. Instantia autem fit duobus gradibus.

  • Primum, compilator omnes rationes generis supponit cum suo cuiusque generis parametros per munus vel genus generale.
  • Secundo compilator certificat unumquemque genus moduli suis angustiis satisfacere.
    Quid hoc significet cito videbimus, sed si secundus gradus deficiat, instantiatio deficiat et propositum invalidum erit.

Post prosperam instantiam, munus non genericum habemus, quod sicut quodlibet aliud munus dici potest.Exempli gratia in codice similia

fmin := GMin[float64]
m := fmin(2.71, 3.14)
  • 1
  • 2

Omnes codes sunt

package main

import (
	"fmt"
	"golang.org/x/exp/constraints"
)

func GMin[T constraints.Ordered](x, y T) T {
	if x < y {
		return x
	}
	return y
}

func main() {
	fmin := GMin[float64] // 相当于func GMin(x, y float64) float64{...}
	m := fmin(2.71, 3.14)
	fmt.Println(m) // 输出结果为2.71
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Instantiating GMin [float64] nostrum punctum fluitantis originalis actualiter Min functionem producit, qua uti in functione possumus vocat.

Typus parametri etiam cum typo adhiberi possunt.

type Tree[T interface{}] struct {
    left, right *Tree[T]
    value       T
}

func (t *Tree[T]) Lookup(x T) *Tree[T] { ... }

var stringTree Tree[string]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Arbor genus genericum hic valorem generis parametri T reponit. Genera generica methodos habere possunt, sicut in hoc exemplo Lookup. Genera uti;Instantiated oportetLignum [nervum] exemplum est arboris instantiantis utens typum chordae parametri.

Type sets

Uniuscuiusque generis parameter in typo parametri indicem typum habet. Cum typum parametri typum ipse sit, typus parametri typum definito typorum definit.Hoc metatype appellaturgenus angustiis
In methodo generica GMin, generis angustiae e coercitionibus involucrum importatae sunt. Angustiae ordinatae describunt omnes species collectionum quae valores habent ordinabiles vel aliis verbis comparatas cum operante (vel &lt;=, etc.). Haec necessitas efficit ut solae species cum valoribus sortibus ad GMin transiri possint. Hoc etiam significat in corpore functionis GMin, valor parametri huius generis adhiberi potest ad comparationem cum &lt;operante.
In Go, generis angustiae interfaces esse debent . Hoc est, rationes interfaces pro valore typi vel meta-types adhiberi possunt. Interfaces modos definiunt, ut manifesto exprimi possumus angustias generis quae certis modis praesentiam requirunt. Sed angustiis. Ordinatum est etiam genus interfaciendi, et modus operans non est.
Finis interfaciendi duplex est notio magni momenti in lingua Go. Integre intelligamus ac illustremus quod "types interfacei uti possunt typi pretii et metatypes" cum exemplis [1][2][3][4][5].

  1. Interface ut valorem type:

Cum interface uti pro valore generis, definit methodum definitam quaelibet species quae huiusmodi methodos instrumenti variabilis assignari potest. Hoc est frequentissimum interfaces.

Exempli gratia:

type Stringer interface {
    String() string
}

type Person struct {
    Name string
}

func (p Person) String() string {
    return p.Name
}

var s Stringer = Person{"Alice"} // Person 实现了 Stringer 接口
fmt.Println(s.String()) // 输出: Alice
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

In hoc exemplo;Stringer Interfaces pro valore generum adhibentur;Person Genus instrumentorumString() modus, sic assignari potestStringer genus variabile.

  1. Interface ut meta-type:

Cum interfacies adhibetur ut metatypus, certa quaedam generis angustias ad usum programmandi generatim definit. Hic est novus usus postquam generica introductio in Go 1.18.

Exempli gratia:

type Ordered interface {
    int | float64 | string
}

func Min[T Ordered](a, b T) T {
    if a < b {
        return a
    }
    return b
}

fmt.Println(Min(3, 5))       // 输出: 3
fmt.Println(Min(3.14, 2.71)) // 输出: 2.71
fmt.Println(Min("a", "b"))   // 输出: a
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

In hoc exemplo;Ordered Interfaces adhibentur ut metatypes, quae definiunt numerum generum (integerum, punctum numerorum et chordarum) quae comparari possunt.Min Munera hoc instrumento utuntur ut typum coactum et quodlibet accipere possuntOrdered Genus coercitionis pro argumento.

Haec dualis propositio interfaces Go validissimas et flexibiles facit ad programmationem genericam. Non solum mores rerum obiectorum (sicut species pretii definire possunt), sed collectiones typorum (sicut metatyporum) definire possunt, ita vehementer augent expressionem ac reusability codicis, servata simplicitate linguae.

Usque nuper, specificatio Go dixit methodum interface definitam esse, quae methodorum in interface enumeratis fere ponitur. Quodlibet genus, quod omnes rationes huiusmodi instrumentorum instrumentorum instrumentorum efficiat.
Insert imaginem descriptionis hic
Sed alius modus inspiciendi hoc est dicere quod interface definitas figuras, i.e. rationes, quae modos istos efficiant. Hoc prospectu, quodlibet genus quod est elementum instrumenti instrumenti interfaciei.
Insert imaginem descriptionis hic
Utraque sententia eodem eventu ducunt: pro singulis methodis, fingere possumus congruentem numerum generum, qui istas methodos efficiant, id est, generum rationum interface definitas.

Ad propositum autem nostrum, genus sententiarum unum commodum habet supra rationem propositam: genus in novis modis moderari possumus, typos collectioni expresse addendo.

Syntaxi typi interfaciei ad hoc assequendum extendimus. Exempli gratia, interface{int|string|bool} figuram definitam in se continentem int, chordas, et rationes bool.
Insert imaginem descriptionis hic
Alius modus loquendi est quod interfacies non satisfacit nisi per int, chordas vel bool.

Nunc inspiciamus ipsam definitionem angustiarum.Ordered:

type Ordered interface {
    Integer|Float|~string
}
  • 1
  • 2
  • 3

Haec declaratio indicat ordinem instrumenti esse collectionem omnium integer, punctum fluitantis et chordarum generum. Serae verticales uniones typorum (vel stolis typi in hoc casu). Integer et Float sunt typi interfaciei in angustiis involucrum similiter definitum. Nota quod interface Ordinatum nullos modos definit.

Genus enim cohiberi plerumque non curat de speciebus specificis, sicut chordae;Hic est~ Cuius rei causa est.expressio~string Exhibet collectionem omnium generum, quarum ratio chorda subest.Hoc filum ipsum genus includit et omnia genera definitionibus declarata, v.g.type MyString string

Scilicet modos in interface definire volumus, et retro compatibile esse volumus. In Go 1.18, interfaces modos et interfaces ut prius infixas continere potest, sed etiam formas non interfacies, uniones et rationes subiacentium generum immergi potest.

Interfacies adhibita ut necessitas potest vel nominari (ut Ordinatum est) vel litteralis interfacies in linea parametri generis. Exempli gratia:

[S interface{~[]E}, E interface{}]
  • 1

Hic S frustum genus esse debet, cuius elementum typus cuiuslibet generis esse potest.

Quia haec communis condicio est, ad interfaces quae constringunt positiones, interface clausa{} omitti potest, et simpliciter scribere possumus (syntaxis saccharum genericorum in lingua Go et simplicior scripturae generis angustiae);

[S ~[]E, E interface{}]
  • 1

Cum interfaces inanes sunt communes in speciebus parametris necnon in normali Go codice, Go 1.18 inducit novum identifiatorem praedelatum quemvis sicut alias ad interfaces inanes. Sic hunc idiomaticum codicem consequimur:

[S ~[]E, E any]
  • 1

Type consequentia

Cum parametris typo, parametris typus praetermittendus est, qui ad verbosum codicem ducere potest. Revertere ad munus generale GMin: