2011-11-07 1 views
20

바이트 배열을 처음 사용할 수있는 편리한 방법이 있습니까?go 문자열을 고정 크기 바이트 배열로 변환

package main 
import "fmt" 
type T1 struct { 
    f1 [5]byte // I use fixed size here for file format or network packet format. 
    f2 int32 
} 
func main() { 
    t := T1{"abcde", 3} 
    // t:= T1{[5]byte{'a','b','c','d','e'}, 3} // work, but ugly 
    fmt.Println(t) 
} 

prog.go : 8 : 유형으로 "ABCDE"(입력 문자열)을 사용할 수 없다 [5] 필드 값 UINT8

I는 t := T1{[5]byte("abcde"), 3}

prog.go의 행을 변경하는 경우 : 8 : "abcde"(유형 문자열)를 [5] 유형으로 변환 할 수 없습니다. uint8

+0

이것은 http://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array와 유사합니다. – jimt

답변

9

당신은 바이트 배열의 조각으로 문자열을 복사 할 수 있습니다 :

package main 
import "fmt" 
type T1 struct { 
    f1 [5]byte 
    f2 int 
} 
func main() { 
    t := T1{f2: 3} 
    copy(t.f1[:], "abcde") 
    fmt.Println(t) 
} 

편집 : JIMT의 제안에 의해 문자 그대로 T1의 이름 양식을 사용하여.

+0

이 방법에서는 컴파일 작업 대신 런타임에 복사 작업이 지연됩니다. 내가 맞습니까? –

+0

@ DanielYCLin : 맞습니다. 여기에 보여준 예제는 struct initializer의'[5] byte {}'비트 없이도 할 수 있습니다. 고정 배열 구조체 필드가 ​​이미 초기화되었습니다. 두 번 할 필요가 없습니다 :'t : = T1 {f2 : 3}; 복사 (t.f1 [:], "abcde")'. – jimt

+0

두 경우 모두 컴파일 타임에 복사 할 수 없습니다. 두 경우 모두 데이터가 스택에 복사되거나 프로그램 데이터에서 힙으로 복사됩니다. 또한 명명 된 양식이 더 좋다고 동의하지만 (배열을 사용하는 것을 고려하고 있었지만 그렇게하지 않기로 결정한 경우), 배열은 내가 게시 한 코드에서 두 번 초기화되지 않습니다. – SteveMcQwark

12

바이트 배열이 필요한 특별한 이유가 있습니까? Go에서는 대신 바이트 슬라이스를 사용하는 것이 좋습니다.

package main 
import "fmt" 

type T1 struct { 
    f1 []byte 
    f2 int 
} 

func main() { 
    t := T1{[]byte("abcde"), 3} 
    fmt.Println(t) 
} 
+3

네트워크 패킷 전송을 위해 바이트 배열이 필요합니다. 데이터를 파일로 저장하십시오. –

+2

그렇게하고 싶다면 고정 된 크기의 int (int32, int64)도 사용해야합니다. – SteveMcQwark

+0

감사합니다, SteveMcQwark, 명확하게 내 질문을 수정했습니다. –