3 ms·
package main import "fmt" // Define an enumeration for status type Status int const ( Pending Status = iota InProgress Completed Failed ) fu
by fullstackchris 2y ago
package main
import "fmt"
// Define an enumeration for status
type Status int
const (
Pending Status = iota
InProgress
Completed
Failed
)
func (s Status) String() string {
return [...]string{"Pending", "InProgress", "Completed", "Failed"}[s]
}
func main() {
var s Status = InProgress
fmt.Println(s) // Output: InProgress
}
- Svip 2y agoOK, but I can set s to 1000, and it still compiles.
- alkonaut 2y agoNext day I have this (added one entry). I forgot to update the string list elsewhere however. const ( Pending Status = iota InProgress Completed Cancelled Failed ) func (s Status) String() string { return [...]string{"Pending", "InProgress", "Completed", "Failed"}[s] } func main() { var s Status = Cancelled fmt.Println(s) // Output: ?? If the compiler - not some linter - protests that the list of names is different from the number of items in the enum, then I think this is at least a half-decent design of an enum type. Not a great one (because the author still had to repeat the names), but at least something that isn't a fundamentally broken design of an enum type. But if the compiler is silent, and the output of the Println(Cancelled) is "Failed" then I'm not angry, I'm disappointed. Edit: https://go.dev/play/p/MMPMh7_U81- https://go.dev/play/p/MMPMh7_U81-
- physicsguy 2y agoI see this suggested all the time as though it’s supposed to be a replacement. It isn’t sufficient, it’s a poor emulation of what enums can be used for and doesn’t offer the same protections, since Status can be set to any integer value without casting or any knowledge that it’s broken. In your suggested method it doesn’t even catch that case and provide an error if the value isn’t in the range.
- powerhugs 2y agoIt seems like none of the other comments here use or are even aware of `go generate`. Go has excellent code generation features [1]. I think parent should be using `stringer` [2] instead. 1: https://go.dev/blog/generate https://go.dev/blog/generate 2: https://pkg.go.dev/golang.org/x/tools/cmd/stringer https://pkg.go.dev/golang.org/x/tools/cmd/stringer
- physicsguy 2y agoI'm well aware of Stringer but I don't again think it's a good replacement of having enums built in!
- powerhugs 2y ago> I don't again think it's a good replacement of having enums built in! I didn't say anything along those lines, in fact I was commenting generally about this issue that you guys and the other commenters mentioned. I was just suggesting a solution to the the problem stated.
- fullstackchris 2y ago"We don't want a solution! We want to complain about what we are used to and dont have!"
- pjmlp 2y agoAlso known as design hack, workaround for what other languages support natively since 1970's. Only one step better than Assembly or Fortran.