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("Անհայտ տիպ")
}
}