I would do (and have done) what you suggested in your last example, but just put the codes into a 'var' block as opposed to a const block, e.g.:
var ( > E270_01 = ErrorCode{"270.01", "this is error description"} ) I would not personally be concerned about people modifying that public value and messing things up because that has never happened within the past 5 years of my professional career using Go (on two different teams, working with a total of up to 30 other people). At least, as far as I know ;) If you are concerned about future coders misusing these "effectively constant" public values, then you should just use a function to return a new copy each time instead of having a global/shared version: func E270_01() ErrorCode { > return ErrorCode{"270.01", "this is error description"} > } In this func example, each time someone needs an ErrorCode to use or compare to, they will receive a new copy of ErrorCode, making it impossible for misbehaving code to affect other code. On Monday, May 4, 2020 at 10:30:13 PM UTC-6, Amarjeet Anand wrote: > > Hi > > I want to declare a constant that maps an *ErrorCode*(string) like > "100.01" to its *ErrorDescription*(string) like "Error description of > 100.01". > Declaring Error as *code* and *description* is helpful to monitor logs > based based on *ErrorCode* and show the *ErrorDescription* to the client. > > Although go cannot create constant of type map, but it can be achieved in > multiple ways. > > -------------------------------------------------------------------- > -------------------------------------------------------------------- > -------------------------------------------------------------------- > ------------- > One possible way can be :- > > > type ErrorCode string > > const ( > E270_01 ErrorCode = "270.01" > E270_02 = "270.02" > ) > > var ErrDescription = map[ErrorCode]string{ > E270_01: "this is error description", > E270_02: "this is error description", > } > > type LogErr struct { > Code ErrorCode > Description string > } > > func getLogErr(e ErrorCode) LogErr { > return LogErr{ > Code: e, > Description: ErrDescription[e], > } > } > > func TestErrorConstant(t *testing.T) { > fmt.Println(getLogErr(E270_01)) > } > > > > This solves our purpose. But the problem is for every new error, we need to > change things at two places, (1) Declare const like E270_02 (2) Add an entry > in the *ErrDescription* map > > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > > Another possible way looks like :- > > > type ErrorCode string > > const ( > E270_01 ErrorCode = "270.01:this is error description" > E270_02 = "270.02:this is error description" > ) > > type LogErr struct { > Code string > Description string > } > > func getLogErr(e ErrorCode) LogErr { > * token := strings.Split(string(e), ":")* > return LogErr{ > Code: token[0], > Description: token[1], > } > } > > func TestErrorConstant(t *testing.T) { > fmt.Println(getLogErr(E270_01)) > } > > > > This way looks promising, but don't really like the way of splitting string > using ":" > > > > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > > I think best way could have been something like --- > > const ( > E270_01 ErrorCode = {"270.01", "this is error description"} > ) > > > > Since Golang doesn't support the Constant of struct, what could be your > approach? > > Any suggestion is really appreciated. > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/f91631d8-0ce9-49de-8fec-ea3383ad8403%40googlegroups.com.