Los strings y los arrays de bytes están muy relacionados. Podemos convertir de uno a otro fácilmente:
stra := "the spice must flow"
byts := []byte(stra)
strb := string(byts)
De hecho, este tipo de conversión es común también entre otros tipos. Algunas funciones esperan explícitamente un int32 o un int64 o sus homólogos sin signo. Puede que te descubras a ti mismo haciendo cosas como esta:
int64(count)
Es algo que probablemente acabes haciendo con frecuencia cuando utilices bytes y strings. Observa que cuando utilizas []byte(X) o string(X) estás haciendo una copia de los datos. Esto es imprescindible ya que los strings son inmutables.
Los strings están hechos de runas, que son letras unicode. Si recuperas la longitud de un string es probable que no obtengas el valor que esperas. El código siguiente muestra 3:
fmt.Println(len("")) // quizá no lo veas, aquí debería aparecer un carácter chino
Si iteras sobre un string utilizando range obtendrás las runas, no los bytes, aunque cuando conviertes un string en un []byte obtienes los datos correctos.