2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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
}
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
}
Documentum officialis website:https://go.dev/blog/intro-generics
Genera tria notae linguae notae magni momenti addunt:
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.
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
}
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.
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)
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
}
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]
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.
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 <=, 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 <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].
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
In hoc exemplo;Stringer
Interfaces pro valore generum adhibentur;Person
Genus instrumentorumString()
modus, sic assignari potestStringer
genus variabile.
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
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.
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.
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.
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
}
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{}]
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{}]
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]
Cum parametris typo, parametris typus praetermittendus est, qui ad verbosum codicem ducere potest. Revertere ad munus generale GMin: