प्रौद्योगिकी साझेदारी

Go generics इत्यस्य विस्तृतव्याख्या

2024-07-12

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

आमुख

यदि वयं क्रमशः द्वयोः पूर्णाङ्कयोः प्लवङ्गबिन्दुसङ्ख्यायोः च आकारस्य तुलनां कर्तुं फंक्शन् लिखितुम् इच्छामः तर्हि अस्माभिः द्वौ फंक्शन् लिखितव्यम् । यथा- १.

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

द्वयोः कार्ययोः भिन्नदत्तांशप्रकारं विहाय सम्यक् समानं संसाधनतर्कं भवति । उपर्युक्तं कार्यं एकेन कार्येण साधयितुं किमपि उपायः अस्ति वा ? आम्, तत् सामान्यम् अस्ति।

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

जेनेरिक

आधिकारिकजालस्थलदस्तावेजः : १.https://go.dev/blog/परिचय-सामान्यम्
जेनेरिक्स् भाषायां त्रीणि महत्त्वपूर्णानि नवीनविशेषतानि योजयन्ति-

  • कार्याणां प्रकाराणां च कृते पैरामीटर्स् टङ्कयन्तु ।
  • अन्तरफलकप्रकारं प्रकारसमूहरूपेण परिभाषयन्तु, यत्र विधिरहिताः प्रकाराः अपि सन्ति ।
  • प्रकारानुमानं, बहुषु सन्दर्भेषु कार्याणि आह्वयति समये प्रकारमापदण्डान् लोपयितुं शक्नोति ।

Parameters इति प्रकारः

इदानीं फंक्शन्-प्रकारयोः प्रकार-मापदण्डाः भवितुं अनुमताः सन्ति । प्रकारपैरामीटर्सूची सामान्यपैरामीटर्सूची इव दृश्यते, केवलं गोलकोष्ठकानां स्थाने वर्गकोष्ठकानां उपयोगं करोति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

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

तेषु constraints.Ordered इति इष्टप्रकारः (स्रोतसङ्केतः अत्र न दर्शितः) ।
यदि भवान् न अवगच्छति तर्हि अस्थायीरूपेण बाधाः प्रतिस्थापयितुं शक्नोति।Ordered with ·int | float64

GMin कृते प्रकारपैरामीटर् (अस्मिन् सन्दर्भे int) प्रदातुं instantiation इति कथ्यते । दृष्टान्तीकरणं द्वयोः सोपानयोः भवति ।

  • प्रथमं, कम्पैलरः सम्पूर्णे जेनेरिक फंक्शन् अथवा प्रकारे सर्वान् प्रकारान् तर्कान् तेषां स्वस्वप्रकारमापदण्डैः प्रतिस्थापयति ।
  • द्वितीयं, संकलकः सत्यापयति यत् प्रत्येकं प्रकारपैरामीटर् स्वस्य स्वस्वप्रतिबन्धान् पूरयति ।
    वयं शीघ्रमेव पश्यामः यत् एतस्य अर्थः किम्, परन्तु यदि द्वितीयं सोपानं विफलं भवति तर्हि instantiation विफलं भविष्यति तथा च प्रोग्राम् अमान्यः भविष्यति ।

सफलस्य उदाहरणीकरणानन्तरं अस्माकं कृते एकं अ-जेनेरिकं फंक्शन् अस्ति यत् अन्येषां फंक्शन् इव आह्वयितुं शक्यते ।यथा, कोड् इत्यादिषु

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

सर्वे कोडाः सन्ति

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

GMin[float64] इत्यस्य उदाहरणं कृत्वा वास्तवतः अस्माकं मूलं फ्लोटिंग् बिन्दु Min फंक्शन् उत्पाद्यते, यस्य उपयोगं वयं फंक्शन् कॉल् इत्यत्र कर्तुं शक्नुमः ।

प्रकारमापदण्डानां उपयोगः प्रकारैः सह अपि कर्तुं शक्यते ।

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

अत्र सामान्यप्रकारः Tree प्रकारपैरामीटर् T इत्यस्य मूल्यं संगृह्णाति । सामान्यप्रकारस्य विधिः भवितुम् अर्हति, यथा अस्मिन् उदाहरणे Lookup । सामान्यप्रकारस्य उपयोगाय, .अवश्यं तस्य उदाहरणं करणीयम्Tree[string] इति प्रकार पैरामीटर् स्ट्रिंग् इत्यस्य उपयोगेन Tree इत्यस्य उदाहरणीकरणस्य उदाहरणम् अस्ति ।

सेट् टङ्कयन्तु

प्रकारपैरामीटर्सूचौ प्रत्येकस्य प्रकारपैरामीटर् इत्यस्य एकः प्रकारः भवति । यतः प्रकारपैरामीटर् स्वयं प्रकारः भवति, प्रकारपैरामीटर् इत्यस्य प्रकारः प्रकारसमूहं परिभाषयति ।एषः मेटाटाइपः इति उच्यतेप्रकार बाध्यता
सामान्यविधौ GMin मध्ये, प्रकारप्रतिबन्धाः बाधासङ्कुलात् आयाताः भवन्ति । क्रमबद्धबाधाः सर्वप्रकारस्य संग्रहस्य वर्णनं कुर्वन्ति येषां मूल्यानि क्रमयितुं शक्यन्ते, अन्येषु शब्देषु वा &lt; ऑपरेटर् (अथवा &lt;=, &gt; इत्यादिना) सह तुलना कृता एषा बाधा सुनिश्चितं करोति यत् केवलं क्रमणीयमूल्यानि युक्ताः प्रकाराः एव GMin -इत्यत्र पारयितुं शक्यन्ते । अस्य अपि अर्थः अस्ति यत् GMin फंक्शन् बॉडी इत्यस्मिन् अस्य प्रकारस्य पैरामीटर् इत्यस्य मूल्यं &lt; ऑपरेटर् इत्यनेन सह तुलनायै उपयोक्तुं शक्यते ।
Go इत्यस्मिन् प्रकारबाधाः अन्तरफलकाः भवितुमर्हन्ति . अर्थात् अन्तरफलकप्रकाराः मूल्यप्रकाररूपेण अथवा मेटा-प्रकाररूपेण उपयोक्तुं शक्यन्ते । अन्तरफलकाः विधिः परिभाषयन्ति, अतः स्पष्टतया वयं प्रकारबाधाः व्यक्तुं शक्नुमः येषु कतिपयेषु विधिषु उपस्थितिः आवश्यकी भवति । परन्तु constraints.Ordered अपि अन्तरफलकप्रकारः अस्ति, &lt; ऑपरेटर् च मेथड् नास्ति ।
अन्तरफलकप्रकारस्य द्वयप्रयोजनं खलु गोभाषायां महत्त्वपूर्णा अवधारणा अस्ति । "अन्तरफलकप्रकाराः मूल्यप्रकाररूपेण अपि च मेटाप्रकाररूपेण उपयोक्तुं शक्यन्ते" इति कथनं गभीरतया अवगत्य उदाहरणैः [1][2][3][4][5] दर्शयामः

  1. मूल्यप्रकाररूपेण अन्तरफलकम् : १.

यदा कश्चन अन्तरफलकः मूल्यप्रकारस्य रूपेण उपयुज्यते तदा एतत् विधिसमूहं परिभाषयति यत् एतान् पद्धतीन् कार्यान्वितं यः कोऽपि प्रकारः सः अन्तरफलकचराय नियुक्तः भवितुम् अर्हति । एषः अन्तरफलकानां सर्वाधिकं सामान्यः उपयोगः अस्ति ।

उदाहरणतया:

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

अस्मिन् उदाहरणे .Stringer अन्तरफलकानि मूल्यप्रकाररूपेण उपयुज्यन्ते,Person प्रकारः कार्यान्वयतिString() विधिः, अतः तस्य नियुक्तिः कर्तुं शक्यतेStringer प्रकार चर।

  1. मेटा-प्रकाररूपेण अन्तरफलकम् : १.

यदा मेटाटाइप् इत्यस्य रूपेण अन्तरफलकस्य उपयोगः भवति तदा सामान्यप्रोग्रामिंग् इत्यत्र उपयोगाय प्रकारबाधानां समुच्चयं परिभाषयति । Go 1.18 इत्यस्मिन् जेनेरिक्स् इत्यस्य प्रवर्तनानन्तरं एषः नूतनः उपयोगः अस्ति ।

उदाहरणतया:

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

अस्मिन् उदाहरणे .Ordered अन्तरफलकाः मेटाटाइप् इत्यस्य रूपेण उपयुज्यन्ते, ये प्रकाराणां समुच्चयं (पूर्णाङ्काः, प्लवमानबिन्दुसङ्ख्याः, स्ट्रिंग् च) परिभाषयन्ति यस्य तुलना कर्तुं शक्यते ।Min कार्याणि एतत् अन्तरफलकं प्रकारप्रतिबन्धरूपेण उपयुञ्जते तथा च किमपि स्वीकुर्वन्तिOrdered तर्करूपेण बाध्यतायाः प्रकारः ।

एतत् द्वयप्रयोजनं गो इत्यस्य अन्तरफलकानि सामान्यप्रोग्रामिङ्गस्य कृते अतीव शक्तिशालिनः लचीलाः च भवन्ति । ते न केवलं वस्तुनां व्यवहारं (मूल्यप्रकाररूपेण) परिभाषितुं शक्नुवन्ति, अपितु प्रकारसङ्ग्रहान् (मेटाप्रकाररूपेण) अपि परिभाषितुं शक्नुवन्ति, अतः भाषायाः सरलतां निर्वाहयन् कोडस्य अभिव्यञ्जकतां पुनःप्रयोगक्षमतां च बहुधा वर्धयन्ति

अद्यतनीपर्यन्तं Go विनिर्देशेन उक्तं यत् अन्तरफलकं विधिसमूहं परिभाषयति, यत् मोटेन अन्तरफलके परिगणितविधिसमूहः भवति । एतान् सर्वान् पद्धतीन् कार्यान्वितं यः कोऽपि प्रकारः करोति सः एतत् अन्तरफलकं कार्यान्वयति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
परन्तु एतत् अवलोकयितुं अन्यः उपायः अस्ति यत् एकः अन्तरफलकः प्रकारानां समुच्चयं परिभाषयति अर्थात् एतान् पद्धतीन् कार्यान्विताः प्रकाराः । अस्मात् दृष्ट्या यः कोऽपि प्रकारः अन्तरफलकप्रकारस्य समुच्चयस्य तत्त्वं भवति सः तत् अन्तरफलकं कार्यान्वयति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
उभयदृश्यं समानं परिणामं प्रति नेति: प्रत्येकस्य विधिसमूहस्य कृते वयं एतान् पद्धतीन् कार्यान्वितं प्रकारस्य प्रकारसमूहं तत्सम्बद्धं कल्पयितुं शक्नुमः अर्थात् अन्तरफलकेन परिभाषितप्रकारस्य समुच्चयस्य

अस्माकं प्रयोजनार्थं तु मेथड् सेट् दृश्यस्य अपेक्षया type set view इत्यस्य एकः लाभः अस्ति यत् वयं संग्रहे types इत्यस्य स्पष्टतया योजयित्वा type set इत्येतत् नूतनरीत्या नियन्त्रयितुं शक्नुमः ।

एतत् प्राप्तुं वयं interface types इत्यस्य syntax इत्यस्य विस्तारं कृतवन्तः । यथा, interface{ int|string|bool } इत्यनेन int, string, bool प्रकाराः समाविष्टाः प्रकारसमूहः परिभाष्यते ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
अन्यः उपायः अस्ति यत् अन्तरफलकं केवलं int, string, bool इत्यनेन वा तृप्तं भवति ।

अधुना constraints इत्यस्य वास्तविकपरिभाषां पश्यामः।Ordered:

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

एषा घोषणा सूचयति यत् Ordered अन्तरफलकं सर्वेषां पूर्णाङ्कस्य, प्लवमानबिन्दुस्य, स्ट्रिंग् प्रकारस्य च सङ्ग्रहः अस्ति । ऊर्ध्वाधरपट्टिकाः प्रकारसङ्घस्य (अथवा अस्मिन् सन्दर्भे प्रकारसमूहानां) प्रतिनिधित्वं कुर्वन्ति । Integer तथा Float इत्येतत् constraints package इत्यस्मिन् समानरूपेण परिभाषिताः interface प्रकाराः सन्ति । ध्यानं कुर्वन्तु यत् Ordered अन्तरफलकं किमपि विधिं न परिभाषयति ।

प्रकारप्रतिबन्धानां कृते वयं प्रायः विशिष्टप्रकारस्य चिन्तां न कुर्मः, यथा स्ट्रिंग्-प्रकारेषु वयं रुचिं लभामः;इदमस्ति~ टोकनस्य प्रयोजनम् ।अभिव्यक्ति~string सर्वेषां प्रकारानां संग्रहं प्रतिनिधियति यस्य अन्तर्निहितः प्रकारः स्ट्रिंग् अस्ति ।अस्मिन् प्रकार स्ट्रिंग् एव परिभाषाभिः सह घोषिताः सर्वे प्रकाराः च समाविष्टाः सन्ति, उदा.type MyString string

अवश्यं वयम् अद्यापि अन्तरफलके विधिः निर्दिष्टुं इच्छामः, पश्चात् सङ्गतिः च भवितुम् इच्छामः । Go 1.18 इत्यस्मिन् एकस्मिन् अन्तरफलके पूर्ववत् विधिः, एम्बेडेड् इन्टरफेस् च भवितुं शक्नोति, परन्तु अ-अन्तरफलकप्रकाराः, यूनियन्स्, अन्तर्निहितप्रकारस्य समुच्चयः च एम्बेड् कर्तुं शक्नोति ।

बाधारूपेण उपयुज्यमानं अन्तरफलकं नामकरणं वा (यथा Ordered) अथवा प्रकारपैरामीटर्सूचौ अक्षरशः अन्तरफलकं इन्लाइन् भवितुम् अर्हति । उदाहरणतया:

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

अत्र S स्लाइस् प्रकारः भवितुमर्हति, तस्य एलिमेण्ट् प्रकारः कोऽपि प्रकारः भवितुम् अर्हति ।

यतो हि एषा सामान्या स्थितिः, स्थानानि बाधन्ते ये अन्तरफलकाः सन्ति, तेषां कृते बन्दं अन्तरफलकं{} परित्यक्तुं शक्यते, तथा च वयं केवलं लिखितुं शक्नुमः (Go भाषायां सामान्यग्रन्थानां वाक्यविन्यासशर्करा तथा प्रकारप्रतिबन्धानां सरललेखनम्):

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

यतः रिक्त-अन्तरफलकाः प्रकार-पैरामीटर्-सूचिकासु अपि च सामान्य-गो-सङ्केतेषु सामान्याः सन्ति, Go 1.18 रिक्त-अन्तरफलक-प्रकारस्य कृते उपनामरूपेण नूतनं पूर्वघोषितं परिचयकं any परिचययति एवं वयं एतत् मुहावरसङ्केतं प्राप्नुमः-

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

अनुमानं प्रकारः

प्रकारमापदण्डैः सह प्रकारमापदण्डाः पारितव्याः, येन वर्बोजसङ्केतः भवितुं शक्नोति । अस्माकं सामान्यं GMin कार्यं प्रति पुनः आगच्छामः: