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

5
我打算为字符串类型创建一些方法扩展。
我需要将所有的扩展方法写入一个单独的包中。
以下是我的层次结构。
root
|    main.go
|    validation
     |   validate.go

我希望 main.go 中有 "abcd".Required() 方法。

main.go

package main

import (
    "fmt"
    "./validation"
)

func main() {
    fmt.Println( "abcd".Required() )
}

validate.go

package validation

func (s string) Required() bool {

    if s != "" {
        return true
    }

    return false
}

当我运行它时,会出现错误。
错误。
cannot define new methods on non-local type string

我在StackOverflow的其他问题中找到了一些答案,但它们并没有详细讨论字符串类型和将方法放在不同包文件中的情况。


11
正如错误提示所说,你不能在 string 类型上定义方法。不过你可以创建一个新类型(例如 type mystring string),并在新类型上添加方法。 - icza
@icza 是的,没错。我尝试过了,但仍然不能达到我预期的效果。 - usr784638
1个回答

7
在你的 validate.go 文件中创建一个新类型 String:
package validation

type String string

func (s String) Required() bool {

    return s != ""
}

接下来,在主函数中使用 validation.String 对象:

package main

import (
    "fmt"

    "./validation"
)

func main() {
    fmt.Println(validation.String("abcd").Required())
}

这里提供一个包含所有内容的可执行示例:

https://play.golang.org/p/z_LcTZ6Qvfn


该示例与HTML标签一并提供,您可以浏览并了解相关的IT技术。

2
return s != "" - Gavin
@IainDuncan 这个可以用。谢谢。但我想知道如何让 validation.String("abcd").Reqired() 更简单。 - usr784638
在这个例子中,我们如何实际上接受任何类型而不仅仅是字符串? - usr784638
如果要处理任何字段的零值,您可以通过反射来实现,就像这个问题所描述的那样:https://www.google.com/url?sa=t&source=web&rct=j&url=https://dev59.com/2GYr5IYBdhLWcg3wKHIp&ved=2ahUKEwjZ94L1pY3gAhUytHEKHYPsDecQjjgwAHoECAcQAQ&usg=AOvVaw3pMO8hlP8Z5DP8YJIEYu48。 - Iain Duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接