Most of them are actually the same and on several microcontrollers you can even just access them as an array of structs, selecting each port at runtime. HALs try to hide these facts which you can only find out about in the hardware documentation
Most GPIO defs are just "this is a struct at 0xAABBCCDD"
Most GPIO defs are just "this is a struct at 0xAABBCCDD"