创建自定义结构类型的常量全局变量

时间:2016-07-23 13:59:18

标签: go types const

我想创建一个"类"处理输入验证。我首先创建一个Input类型,它是一个用于存储用户输入的字符串,以及一个存储正则表达式模式和模式描述的REGP类型。我创建了两个常量实例REGP_LOGINNAMEREGP_PASSWORD。但我收到const initializer REGP literal is not a constant的错误。为什么呢?

package aut

import "regexp"

type Input string

type REGP struct {
    pattern string
    Descr   string
}

const REGP_LOGINNAME = REGP{ //const initializer REGP literal is not a constant
    "regex pattern 1",
    "regex description 1",
}

const REGP_PASSWORD = REGP{ //const initializer REGP literal is not a constant
    "regex pattern 2",
    "regex description 2",
}

func (i Input) isMatch(regp REGP) bool {
    isMatchREGP, _ := regexp.MatchString(regp.pattern, string(i))
    return isMatchREGP
}

错误讯息:

/usr/local/go/bin/go build -i [/home/casper/gopath/codespace_v2.6.6/dev/server_side/golang/go_codespace_v2.1/server/lib/aut]
# _/home/casper/gopath/codespace_v2.6.6/dev/server_side/golang/go_codespace_v2.1/server/lib/aut
./validation.go:15: const initializer REGP literal is not a constant
./validation.go:20: const initializer REGP literal is not a constant
Error: process exited with code 2.

2 个答案:

答案 0 :(得分:2)

Go中的Consants只能是标量值(例如2true3.14"and more")或任何仅由常量组成的表达式(例如。 1 + 2"hello " + "world"2 * math.Pi * 1i)。

这意味着不能将标量值等结构类型(如REGP_LOGINNAME)分配给常量。相反,使用变量:

var (
    REGP_LOGINNAME = REGP{
        pattern: `/^(?=^.{6,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$/`,
        Descr:   "regex description 1",
    }
    REGP_PASSWORD = REGP{
        pattern: `/^(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[0-9a-zA-Z!@#$%^&*()]*$/`,
        Descr:   "regex description 2",
    }
)

进一步阅读

除了:当然,我不知道你的用例,但我确实真的怀疑你确实需要或想要使用正则表达式来验证用户密码。相反,请考虑将其传递给OpaqueString profile of PRECIS(用于处理和强制执行unicode字符串安全性的框架;不透明字符串配置文件旨在处理密码)。同样,UsernameCaseMapped和UsernameCasePreserved配置文件(也在链接包中实现)可用于用户名,以确保您不会看到两个看起来相同但其中包含不同unicode字符的用户名。当然,也可以进行进一步的验证。

答案 1 :(得分:1)

我终于发现似乎不可能使REGP指针或其内部变量保持不变。所以我只是让它们成为全局变量。

package aut

import "regexp"

type Input string

type REGP struct {
    pattern string
    Descr   string
}

var REGP_LOGINNAME = REGP{
    pattern: "/^(?=^.{6,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$/",
    Descr:   "regex description 1",
}

var REGP_PASSWORD = REGP{
    pattern: "/^(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[0-9a-zA-Z!@#$%^&*()]*$/",
    Descr:   "regex description 2",
}

func (i Input) isMatch(regp REGP) bool {
    isMatchREGP, _ := regexp.MatchString(regp.pattern, string(i))
    return isMatchREGP
}