타입 사이즈 알아내기

package main

import "fmt"
import "unsafe"

func main() {
	fmt.Println(unsafe.Sizeof(true))        // 1
	fmt.Println(unsafe.Sizeof(uint8(1)))    // 1
	fmt.Println(unsafe.Sizeof(uint32(1)))   // 4
	fmt.Println(unsafe.Sizeof(uint64(1)))   // 8
}

타입 목록

name description byte
bool false, true 1
uint8 0 ~ 255 1
uint16 0 ~ 65535 2
uint32 0 ~ 4294967295 4
uint64 0 ~ 18446744073709551615 8
int8 -128 ~ 127 1
int16 -32768 ~ 32767 2
int32 -2147483648 ~ 2147483647 4
int64 -9223372036854775808 ~ 9223372036854775807 8
byte uint8 의 alias 1
rune int32 의 alias 4
uint 하드웨어 아키텍처에 따라 int32 또는 int64 4, 8
int 하드웨어 아키텍처에 따라 int32 또는 int64 4, 8
uintptr 포인터 값을 저장하기 위한 unsigned int  
float32 IEEE-754 32-bit 부동 소수점 숫자 4
float64 IEEE-754 64-bit 부동 소수점 숫자 8
complex64 float32 실수부와 float32 허수부로 구성 8
complex128 float64 실수부와 float64 허수부로 구성 16
string 포인터와 길이 두 값으로 구성 8, 16

int의 min, max 값 구하기

const MaxUint = ^uint64(0)              // 18446744073709551615
const MinUint = 0                       // 0
const MaxInt = int64(^uint64(0) >> 1)   // 9223372036854775807
const MinInt = -MaxInt - 1              // -9223372036854775808

CPU 아키텍처 확인

package main

import "fmt"
import "runtime"

func main() {
	const GOARCH string = runtime.GOARCH
	fmt.Println(GOARCH) // amd64
}

string

A string is represented in memory as a 2-word structure containing a pointer to the string data and a length. Because the string is immutable, it is safe for multiple strings to share the same storage, so slicing s results in a new 2-word structure with a potentially different pointer and length that still refers to the same byte sequence. This means that slicing can be done without allocation or copying, making string slices as efficient as passing around explicit indexes.

string

  • string의 구조는 2 word로 되어 있다.
    • 배열의 첫 번째 인덱스의 포인터
    • 배열의 길이

따라서 문자열이 짧건 길건 관계없이, 변수의 사이즈는 동일하다.

fmt.Println(runtime.GOARCH)         // amd64
fmt.Println(unsafe.Sizeof("hi"))    // 16
fmt.Println(unsafe.Sizeof("Hello")) // 16
  • string은 immutable 하다.
  • string을 slicing하는 것은 매우 효율적이다.
    • 문자열을 slicing하면 원본 문자열을 참조하는 새로운 포인터가 생긴다.
    • 문자열의 일부를 복사하거나 새로운 메모리 할당을 하지 않기 때문에 효율적이다.