Sobes.tech
Middle

Miks tühine liides Go-s võib muuta mis tahes tüübiks?

sobes.tech AI

Vastus AI-lt

Tühi liides interface{} ei sisalda meetodeid. Iga Go tüüp võib rahuldada meetodit nõudmata liidest. Seetõttu saab iga tüübi väärtuse omistada interface{} tüüpi muutujale või edasi anda funktsioonile, mis võtab vastu interface{}. Põhimõtteliselt on interface{} konteiner iga tüübi väärtuse jaoks, mis salvestab nii väärtuse kui ka selle tüübi.

package main

import "fmt"

func main() {
	var i interface{} // Tühi liides muutujana

	i = 42            // Omistame int
	fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)

	i = "tere"      // Omistame string
	fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)

	i = true        // Omistame bool
	fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)

	i = struct{}{}  // Omistame tühja struktuuri
	fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)
}

Konverteerimine interface{}-st konkreetseks tüübiks on võimalik kasutades tüübiväiteid (type assertion) või tüübivõrku (type switch).

package main

import "fmt"

func main() {
	var i interface{} = "maailm"

	// Tüübiväide
	s, ok := i.(string) // kontrollib, kas väärtus on string
	if ok {
		fmt.Println("Tüübiväide õnnestus:", s)
	} else {
		fmt.Println("Tüübiväide ebaõnnestus")
}

	// Tüübivõrk
	switch v := i.(type) {
	case int:
		fmt.Println("Tüüp on int, väärtus:", v)
	case string:
		fmt.Println("Tüüp on string, väärtus:", v)
	default:
		fmt.Println("Tundmatu tüüp")
	}
}