Sobes.tech
Middle

Ինչու՞ է Go-ում դատարկ ինտերֆեյսը կարող է վերածվել ցանկացած տիպի:

sobes.tech AI

Պատասխան AI-ից

Դատարկ ինտերֆեյս interface{} պարունակում է մեթոդներ։ Յուրաքանչյուր տիպ Go-ում կարող է բավարարել մեթոդներ չպահանջող ինտերֆեյսին։ Հետևաբար, ցանկացած տիպի արժեքը կարող է վերագրել interface{} տիպի փոփոխականի կամ փոխանցել այն ֆունկցիային, որը ընդունում է interface{}։ Իրականում, interface{}-ը կոնտեյներ է ցանկացած տիպի արժեքի համար, որը պահում է ինչպես արժեքը, այնպես էլ նրա տիպը։

package main

import "fmt"

func main() {
	var i interface{} // Դեկլարենք դատարկ ինտերֆեյս փոփոխական

	i = 42            // վերագրենք int
	fmt.Printf("Արժեքը: %v, Տիպը: %T\n", i, i)

	i = "բարև"     // վերագրենք string
	fmt.Printf("Արժեքը: %v, Տիպը: %T\n", i, i)

	i = true        // վերագրենք bool
	fmt.Printf("Արժեքը: %v, Տիպը: %T\n", i, i)

	i = struct{}{}  // վերագրենք դատարկ կառուցվածք
	fmt.Printf("Արժեքը: %v, Տիպը: %T\n", i, i)
}

Կատարյալ տիպի վերածում interface{}-ից հնարավոր է օգտագործելով տիպի հաստատում (type assertion) կամ տիպի switch։

package main

import "fmt"

func main() {
	var i interface{} = "աշխարհ"

	// Տիպի հաստատում
	s, ok := i.(string) // ստուգում, արդյոք արժեքը string է
	if ok {
		fmt.Println("Տիպի հաստատում հաջողվեց:", s)
	} else {
		fmt.Println("Տիպի հաստատում ձախողվեց")
}

	// Տիպի switch
	switch v := i.(type) {
	case int:
		fmt.Println("Տիպը int, արժեք:", v)
	case string:
		fmt.Println("Տիպը string, արժեք:", v)
	default:
		fmt.Println("Անհայտ տիպ")
	}
}