Middle
Чӣ гуна намудро дар Go дар вақти иҷро санҷидан мумкин аст?
sobes.tech AI
Ҷавоб аз AI
Дар муҳити иҷро дар Go, шумо метавонед тағйирёбандаро бо чанд роҳ санҷед:
-
Истифодаи type assertion: Барои санҷиши намуди мушаххас дар тағйирёбандаи интерфейсӣ мувофиқ аст.
package main import "fmt" func main() { var i interface{} = "hello" s, ok := i.(string) // кӯшиши табдил додани i ба намуди string if ok { fmt.Printf("Тағйирёбанда i намуди string дорад: %s\n", s) } else { fmt.Println("Тағйирёбанда i намуди string надорад") } } -
Истифодаи type switch: Барои санҷиши чанд намуди эҳтимолӣ мувофиқ аст.
package main import "fmt" func main() { var t interface{} switch tt := t.(type) { // tt намуди мушаххас хоҳад дошт case int: fmt.Printf("Тағйирёбанда дорои намуди int: %d\n", tt) case string: fmt.Printf("Тағйирёбанда дорои намуди string: %s\n", tt) case bool: fmt.Printf("Тағйирёбанда дорои намуди bool: %t\n", tt) case nil: fmt.Println("Тағйирёбанда дорои арзиши nil") default: fmt.Printf("Намуди ношино: %T\n", tt) // tt намуди interface{} хоҳад дошт } t = 123 switch tt := t.(type) { case int: fmt.Printf("Тағйирёбанда дорои намуди int: %d\n", tt) case string: fmt.Printf("Тағйирёбанда дорои намуди string: %s\n", tt) case bool: fmt.Printf("Тағйирёбанда дорои намуди bool: %t\n", tt) case nil: fmt.Println("Тағйирёбанда дорои арзиши nil") default: fmt.Printf("Намуди ношино: %T\n", tt) } } -
Истифодаи пакети
reflect: Имкон медиҳад, ки маълумот дар бораи намуд ва арзиши тағйирёбанда дар вақти иҷрои баррасӣ шавад. Ин барои ҳолатҳои, ки намуди онҳо дар вақти компиляция маълум нест, ё барои санҷишҳои мураккабтар истифода мешавад.package main import ( "fmt" "reflect" ) func main() { var x float64 = 3.4 v := reflect.ValueOf(x) // гирифтани арзиши рефлексия fmt.Println("Намуд:", v.Type()) // Мебарояд "Намуд: float64" fmt.Println("Категория:", v.Kind()) // Мебарояд "Категория: float64" y := "hello" vv := reflect.ValueOf(y) fmt.Println("Намуд:", vv.Type()) // Мебарояд "Намуд: string" fmt.Println("Категория:", vv.Kind()) // Мебарояд "Категория: string" z := []int{1, 2, 3} vvv := reflect.ValueOf(z) fmt.Println("Намуд:", vvv.Type()) // Мебарояд "Намуд: []int" fmt.Println("Категория:", vvv.Kind()) // Мебарояд "Категория: slice" }
Пакети reflect қавитар аст, аммо истифодаи он мураккаб аст. Type assertion ва type switch барои санҷишҳои оддии намуди тағйирёбандаҳои интерфейсӣ беҳтар аст, зеро онҳо бехатартар ва ба намуди онҳо нигаронида шудаанд.