是否有可能获得" Type"没有实例?我已经看到了一些使用reflect.TypeOf()
的例子,但它们都处理了一个实例。
以下是我尝试做的事情的片段:
import (
"net/http"
)
type ParamReader struct {
// The request from which to extract parameters
context *http.Request
}
// Initialize the ParamReader with a specific http request. This serves
// as the 'context' of our param reader. All subsequent calls will validate
// the params that are present on this assigned http.Request
func (p *ParamReader) Context(r *http.Request) {
p.context = r
}
// Validate that a given param 's' is both present and a valid
// value of type 't'. A value is demeed valid if a conversion from
// its string representation to 't' is possible
func(p *ParamReader) Require(s string, t Type) {
// if context not have 's'
// addError('s' is not present)
// return
if( t == typeof(uint64)) {
// If not s -> uint64
// addError('s' is not a valid uint64)
} else if (t == typeof(uint32)) {
// ....
} / ....
}
我的用法示例是
func (h *Handler) OnRequest(r *http.Request) {
h.ParamReader.Context(r)
h.ParamReader.Require("age", uint16)
h.ParamReader.Require("name", string)
h.ParamReader.Require("coolfactor", uint64)
h.ParamReader.Optional("email", string, "unspecified")
h.ParamReader.Optional("money", uint64, "0")
if h.ParamReader.HasErrors() {
// Iterate or do something about the errors
} else {
coolness := h.ParamReader.ReadUint64("coolfactor")
email := h.ParamReader.ReadString("email")
money := h.ParamReader.ReadUint64(0)
}
}
请注意,写完这篇文章之后,我意识到我可以提供"RequireUint64"
,"RequireUint32"
等等。也许这就是Go方式?
答案 0 :(得分:8)
是的,这是可能的。诀窍是从指向类型的指针开始(其值可以是类型 nil
,这是完全正常的),然后使用Type.Elem()
来获取{{1指向类型的描述符( base 类型)。
参见一些例子:
reflect.Type
输出(在Go Playground上尝试):
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)
参见相关问题:
Golang reflect: Get Type representation from name?
How to get the string representation of a type?
如果你想传递类型并在int
http.Request
os.File
es中使用它们,你可以像这样在全局变量中创建和存储它们,并参考全局变量:
switch
上述输出(在Go Playground上尝试):
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)
}
但老实说,如果你像这样使用它并且你没有使用Type: int
Type: http.request
Type: os.file
Type: uint64
的方法,那么创建常量会更容易,更有效。它看起来像这样:
reflect.Type
输出是一样的。在Go Playground上尝试。
答案 1 :(得分:0)
我很确定这在Go中是不可能的。虽然它远非理想,但您可以使用Type.Name()
和string
作为函数arg来进行必要的比较。
package main
import (
"fmt"
"reflect"
)
func main() {
printIt("int")
}
func printIt(x string) {
i := 10
if (reflect.TypeOf(i).Name() == x) {
fmt.Println(x)
}
}