Пустая строка "" занимает 16 байт на 64-битной системе — это размер заголовка StringHeader: указатель на данные (8 байт) + длина (8 байт). Самих данных — 0 байт.
var s string = ""
fmt.Println(unsafe.Sizeof(s)) // 16
s2 := "hello"
fmt.Println(unsafe.Sizeof(s2)) // 16 (всегда 16 — это размер заголовка)
unsafe.Sizeof возвращает размер заголовка, а не данных. Реальное потребление строки "hello" = 16 байт заголовка + 5 байт данных. Строки в Go неизменяемые — присваивание копирует заголовок, не данные.