因为并非所有类型都具有可比性,例如切片.所以我们不能这样做
var v ArbitraryType
v == reflect.Zero(reflect.TypeOf(v)).Interface()
Run Code Online (Sandbox Code Playgroud)
编辑 - 解决方案reflect.DeepEqual
var v ArbitratyType
zero := reflect.Zero(reflect.TypeOf(v)).Interface()
isZero := reflect.DeepEqual(v, zero)
Run Code Online (Sandbox Code Playgroud)
去关于reflect.DeepEqual的文档
DeepEqual测试深度相等.它尽可能使用normal == equality,但会扫描数组,切片,映射和结构域的元素.
我需要一个通用函数来检查某项是否等于其零值。
通过这个问题,我能够找到一个适用于值类型的函数。我修改了它以支持指针:
func isZeroOfUnderlyingType(x interface{}) bool {
rawType := reflect.TypeOf(x)
//source is a pointer, convert to its value
if rawType.Kind() == reflect.Ptr {
rawType = rawType.Elem()
}
return reflect.DeepEqual(x, reflect.Zero(rawType).Interface())
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当执行以下操作时,这对我不起作用:
type myStruct struct{}
isZeroOfUnderlyingType(myStruct{}) //Returns true (works)
isZeroOfUnderlyingType(&myStruct{}) //Returns false (doesn't) work
Run Code Online (Sandbox Code Playgroud)
这是因为&myStruct{}是指针,并且无法取消引用interface{}函数内部的方式。如何将指针的值与其类型的零值进行比较?
我打算为字符串类型创建一些方法扩展.
我需要将所有扩展方法写入一个单独的包中.
这是我的层次结构.
root
| main.go
| validation
| validate.go
Run Code Online (Sandbox Code Playgroud)
在main.go我想要的,"abcd".Required()
main.go
package main
import (
"fmt"
"./validation"
)
func main() {
fmt.Println( "abcd".Required() )
}
Run Code Online (Sandbox Code Playgroud)
validate.go
package validation
func (s string) Required() bool {
if s != "" {
return true
}
return false
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,会出错.
错误
cannot define new methods on non-local type string
Run Code Online (Sandbox Code Playgroud)
我在StackOverflow上的其他问题中找到了一些答案,但他们并没有完全谈论字符串类型并将方法放在不同的包文件中.
我有一个将从用户输入中获取其值的结构。\n现在我只想提取具有关联值的字段名称。nil不应返回具有值的字段。我怎样才能做到这一点?
这里\xe2\x80\x99是我的代码:
\n\npackage main\n\n\nimport "fmt"\nimport "reflect"\n\ntype Users struct {\n Name string\n Password string\n}\n\n\nfunc main(){\n u := Users{"Robert", ""}\n\n val := reflect.ValueOf(u)\n\n\n for i := 0; i < val.NumField(); i++ {\n\n fmt.Println(val.Type().Field(i).Name)\n\n }\n\n\n} \nRun Code Online (Sandbox Code Playgroud)\n\n当前结果:
\n\nName\nPassword\nRun Code Online (Sandbox Code Playgroud)\n\n预期结果:
\n\nName\nRun Code Online (Sandbox Code Playgroud)\n