← Back to context

Comment by sph

3 days ago

Not sure why you call it runtime overhead. That’s core logic, nothing fancy, to have a pointer to a number of possible types. That’s what `void *` is, and sometimes you want a little logic to restrict the space of possibilities to a few different choices.

Not having syntactic sugar for this ultra-common use case doesn’t make it disappear. It just makes it more tedious.

There are many implementations and names, and what I refer to runtime casting/any type, which is unnecessary for low-level programming, is the one that uses types and reflection at runtime to be 100% sure you are casting to the correct type. Like Go’s pattern (syntax might be a bit off):

  var s *string
  var unknown interface{}

  // panics at runtime if unknown is not a string pointer
  s = unknown.(*string)

This is overkill for low-level programming and has much higher overhead (i.e. having to store type info in the binary, fat pointers, etc.) than tagged unions, which are the bread and butter of computing.