相关疑难解决方法(0)

如何知道Golang中任意类型的变量是否为零?

因为并非所有类型都具有可比性,例如切片.所以我们不能这样做

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,但会扫描数组,切片,映射和结构域的元素.

reflection go go-reflect

6
推荐指数
2
解决办法
1605
查看次数

如何使用reflect.DeepEqual()将指针的值与其类型的零值进行比较?

我需要一个通用函数来检查某项是否等于其零值。

通过这个问题,我能够找到一个适用于值类型的函数。我修改了它以支持指针:

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{}函数内部的方式。如何将指针的值与其类型的零值进行比较?

reflection go

5
推荐指数
1
解决办法
1728
查看次数

如何在Golang中创建字符串类型的方法

我打算为字符串类型创建一些方法扩展.

我需要将所有扩展方法写入一个单独的包中.

这是我的层次结构.

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上的其他问题中找到了一些答案,但他们并没有完全谈论字符串类型并将方法放在不同的包文件中.

go

2
推荐指数
1
解决办法
408
查看次数

从结构迭代中排除空字段

我有一个将从用户输入中获取其值的结构。\n现在我只想提取具有关联值的字段名称。nil不应返回具有值的字段。我怎样才能做到这一点?

\n\n

这里\xe2\x80\x99是我的代码:

\n\n
package 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} \n
Run Code Online (Sandbox Code Playgroud)\n\n

当前结果:

\n\n
Name\nPassword\n
Run Code Online (Sandbox Code Playgroud)\n\n

预期结果:

\n\n
Name\n
Run Code Online (Sandbox Code Playgroud)\n

go

0
推荐指数
1
解决办法
2373
查看次数

标签 统计

go ×4

reflection ×2

go-reflect ×1