Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proposal: sizeof: add bit sizes #40168

Open
urandom2 opened this issue Jul 11, 2020 · 3 comments
Open

proposal: sizeof: add bit sizes #40168

urandom2 opened this issue Jul 11, 2020 · 3 comments

Comments

@urandom2
Copy link
Contributor

See the tail of the (open) CL 242018 for the (approved) proposal #29982. There are a number of use cases where bits, not bytes as unsafe.Sizeof and sizeof.Xxx speak in, are really useful and it is a shame that you have to manually derive them, const UintBits = sizeof.Uint * 8, as this is error prone. Instead we should expose constants for bit sizes too:

package sizeof

const (
	bitsSize = size * 8 // 32 or 64

	BitsBool       = 8
	BitsByte       = Uint8
	BitsComplex64  = 64
	BitsComplex128 = 128
	BitsFloat32    = 32
	BitsFloat64    = 64
	BitsInt        = bitsSize
	BitsUint8      = 8
	BitsInt16      = 16
	BitsInt32      = 32
	BitsInt64      = 64
	BitsRune       = BitsInt32
	BitsUint       = bitSize
	BitsUint8      = 8
	BitsUint16     = 16
	BitsUint32     = 32
	BitsUint64     = 64
	BitsUintptr    = bitSize
)

We could derive BitsXxx from Xxx * 8, but the current format seems more terse and intuitive. As well, the names could use a suffix, XxxBits, instead of the current prefix, since we get custom ordering for blocked constants, but to me, prefixes displays better and follows other standard library conventions: http.StatusXxx and xxx.ErrYyy.

Depending on the use case, we could instead export a constant or function for deriving these values. While the former is still prone to user error, it should be intuitive for users familiar with time.Duration. The latter seems like a blocker because functions cannot be compile time constant:

// Bits stores the number of bits in a byte.
//
// This is useful for converting byte type sizes into bits:
//	const UintBits = sizeof.Uint * sizeof.Bits
const Bits = 8
// Bits converts byte sizes into bits.
//
// This is useful for converting byte type sizes into bits:
//	var UintBits = sizeof.Bits(sizeof.Uint)
func Bits(bytes int) int { return bytes * 8 }
@gopherbot gopherbot added this to the Proposal milestone Jul 11, 2020
@urandom2
Copy link
Contributor Author

urandom2 commented Aug 6, 2020

@ianlancetaylor: can you add this to the proposals project?

@ianlancetaylor ianlancetaylor added this to Incoming in Proposals (old) Aug 6, 2020
@ianlancetaylor
Copy link
Contributor

@arnottcr Done.

@rsc rsc moved this from Incoming to Active in Proposals (old) Nov 4, 2020
@rsc rsc moved this from Active to Hold in Proposals (old) Nov 11, 2020
@rsc
Copy link
Contributor

rsc commented Nov 11, 2020

Putting on hold along with #29982.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Hold
Development

No branches or pull requests

4 participants