TypeOf Without an Instance: Passing Result to a Function
In Go, it is possible to obtain a "Type" without having an instance of that type. This can be achieved through the use of reflect.TypeOf(), but typically examples involve an instance.
Getting Type Without Instance
To acquire a "Type" without an instance, the trick is to start with a pointer to the type, which can be assigned a "typed" nil. Subsequently, .Elem() can be used to obtain the reflect.Type descriptor of the pointed type, known as the base type.
<code class="go">t := reflect.TypeOf((*int)(nil)).Elem() fmt.Println(t) t = reflect.TypeOf((*http.Request)(nil)).Elem() fmt.Println(t) t = reflect.TypeOf((*os.File)(nil)).Elem() fmt.Println(t)</code>
Example Output:
int http.Request os.File
Passing Type Around
If you need to pass around types and utilize them in switches, create and store them in global variables for reference:
<code class="go">var ( intType = reflect.TypeOf((*int)(nil)) httpRequestType = reflect.TypeOf((*http.Request)(nil)) osFileType = reflect.TypeOf((*os.File)(nil)) int64Type = reflect.TypeOf((*uint64)(nil)) ) func printType(t reflect.Type) { switch t { case intType: fmt.Println("Type: int") case httpRequestType: fmt.Println("Type: http.request") case osFileType: fmt.Println("Type: os.file") case int64Type: fmt.Println("Type: uint64") default: fmt.Println("Type: Other") } } func main() { printType(intType) printType(httpRequestType) printType(osFileType) printType(int64Type) }</code>
Simplified Approach
If you're utilizing the types solely for comparison purposes, consider using constants instead of reflect.Type:
<code class="go">type TypeDesc int const ( typeInt TypeDesc = iota typeHttpRequest typeOsFile typeInt64 ) func printType(t TypeDesc) { switch t { case typeInt: fmt.Println("Type: int") case typeHttpRequest: fmt.Println("Type: http.request") case typeOsFile: fmt.Println("Type: os.file") case typeInt64: fmt.Println("Type: uint64") default: fmt.Println("Type: Other") } } func main() { printType(typeInt) printType(typeHttpRequest) printType(typeOsFile) printType(typeInt64) }</code>
The above is the detailed content of How to Get a Type Without an Instance in Go?. For more information, please follow other related articles on the PHP Chinese website!