Go 生成自定义结构类型的常量全局变量

Go 生成自定义结构类型的常量全局变量,go,types,constants,Go,Types,Constants,我想创建一个“类”来处理输入验证。我首先制作了一种类型的Input,它是一个用于存储用户输入的字符串,另一种类型是REGP,它存储regex模式和模式描述。我创建了两个常量实例REGP\u LOGINNAME和REGP\u PASSWORD。但我得到的错误是,常量初始值设定项REGP literal不是常量。为什么? package aut import "regexp" type Input string type REGP struct { pattern string

我想创建一个“类”来处理输入验证。我首先制作了一种类型的
Input
,它是一个用于存储用户输入的字符串,另一种类型是
REGP
,它存储regex模式和模式描述。我创建了两个常量实例
REGP\u LOGINNAME
REGP\u PASSWORD
。但我得到的错误是,
常量初始值设定项REGP literal不是常量。为什么?

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.

我最终发现,似乎不可能使
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
}

Go中的constants只能是标量值(例如
2
true
3.14
“及更多”
)或仅由常量组成的任何表达式(例如
1+2
“hello”+“world”
,或
2*math.Pi*1i

这意味着不能将非标量值的结构类型(如
REGP\u 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",
    }
)
进一步阅读

旁白:我当然不知道您的用例,但我真的怀疑您是否真的需要或想要使用regexp来验证用户密码。取而代之的是,考虑通过它(一个用于处理和执行Unicode字符串安全性的框架;不透明的字符串配置文件被设计来处理密码)。类似地,UsernameCaseMapped和UsernameCasePreserved配置文件(也在链接包中实现)可用于用户名,以确保不会出现两个看起来相同但具有不同unicode字符的用户名。当然,还可以进行进一步的验证。

有布尔常量、符文常量、整数常量、浮点常量、复数常量和字符串常量。REGP不是其中之一。@JimB-你的意思是我不能使自定义类型为常量?你有什么办法让它看起来更好吗?没错。大多数代码都会使用一个变量,或者只是让regex字符串组成一种方式,将
模式
描述
包装在一起,形成全局变量?是的,您可以创建一个REGP类型的全局变量。