read binary data from binary file and copy to struct
아주 작은 프로젝트가 하나 생겼다.
파일에서 특정 데이터를 추출해내는 것이다.
기본적으로는 mpeg의 기본 구조를 따르는 것으로 보인다
go lang으로 작업을 진행하면서 보이는 자잘한 문제를 기술한다.
첫번째는 binary file에서 binary 데이터를 읽어 struct에 넣는 것이다
아래 코드와 같이 코딩하고 진행을 하면 이 지점에서 panic이 발생한다
err = binary.Read(buf, binary.LittleEndian, &riffHeader)
using value obtained using unexported field
package main import ( "os" "bytes" "encoding/binary" "fmt" ) type Header struct { //A int32 //B int32 //C int32 sID [4]byte size uint32 stype [4]byte } func readFile(filename string) { f, err := os.Open(filename) if err != nil { panic(err) } defer f.Close() b := make([]byte, 12) readsize, err := f.Read(b) if ( len(b) != readsize || err != nil) { panic(err) } riffHeader := Header{} buf := bytes.NewBuffer(b) err = binary.Read(buf, binary.LittleEndian, &riffHeader) if err != nil { fmt.Println("binary.Read failed:", err) } } func main() { readFile("e:/temp/20161101_105118_GE_2.avi") }
'프로그래밍??? > Go Lang' 카테고리의 다른 글
Defer를 이용한 코딩 패턴 - Deferred closure (0) | 2017.11.24 |
---|---|
필드 이름 없이 선언하는 것을 막아주는 방법 (0) | 2017.10.11 |
GOLANG 첫번째 프로젝트 완료! (0) | 2017.02.06 |
인터페이스와 메서드 집합 그리고 포인터 (0) | 2017.01.12 |
테스트 프로젝트 시작 (0) | 2017.01.05 |
인터페이스와 메서드 집합 그리고 포인터
현재 읽고 있는 GO IN ACTION 책의 5.4 절의 인터페이스부에 나오는 내용이다.
다른 책을 읽을때 인터페이스 (정확히는 메소드와 리시버 부분)에 의문이 있었다.
이 책에서 그 부분을 해소해주고 있다.
읽는 도중에 잊지않기 위해 적는 것이니 자세한 글의 내용은 추후 정리하도록 한다.
리시버를 포인터 형태로 지정할 수 있고 값 형태로 지정할 수 있다.
책에서는 언어 명세의 규격으로 설명하고 있다.
이것을 다르게 풀어서 설명하는게 낫다고 생각한다.
내 머릿속 내용이긴 하지만... 풀어보자면 다음과 같다.
리시버를 값 형태로 등록한 인터페이스(메소드)가 있다고 하자.
이를 호출할때 포인터에서 호출하면 포인터의 역참조를 통해 값으로 변환하여 호출 할 수 있다.
그리 한다고 해서 그 내용이 달라질게 전혀 없다.
반대의 상황을 보자.
리시버를 포인터 형태로 등록한 인터페이스가 있다고 하자.
이를 호출할때 역참조를 통해 해당 값을 수정할 수도 있다.
호출시 값 형태로 넘어온 것을 컴파일러가 포인터 형태로 변경해서 처리해준다고 생각해보자.
문법적인 형태의 위험은 값 형태로 넘어온 것에 대한 역참조를 통한 값의 변경을 개발자가 모를 수 있다.
컴파일러를 다른 형태로 구현한다면 값 형태로 넘어간다는 것은 복사본의 값이 넘어가게 된다.
이럴 경우 역참조하여 아무리 수정하여도 의미가 없을수 밖에 없다.
아마도 규격을 정할때 이런 부분들을 다 고려했던거 같다.
그래서 리시버에 포인터를 사용하는 경우는
반드시 포인터인자에 대한 메소드에 대해서만 동일 인터페이스로 취급한다.
자세한 코드는 나중에 책에서 발췌하여 정리하도록 한다.
아래의 코드에서 admin과 user의 notify()의 리시버를 보면
하나는 포인터로 지정하였고 하나는 값 방식으로 지정하였다.
sendNotification() 호출시
lisa 대해서 포인터를 지정하든 값 방식으로 사용하든 모두 문제가 없다
bill에 대해서 포인터를 사용하지 않게 되면 문제가 발생한다
package main import "fmt" type notifier interface { notify() } type user struct { name string email string } func (u *user) notify() { fmt.Printf("사용자에게 메일을 전송합니다: %s<%s>\n", u.name, u.email) } type admin struct { name string email string } func (a admin) notify() { fmt.Printf("사용자에게 메일을 전송합니다: %s<%s>\n", a.name, a.email) } func sendNotification(n notifier) { n.notify() } func main() { bill := user{"Bill", "bill@email.com"} sendNotification(&bill) lisa := admin{"Lisa", "lisa@mail.com"} sendNotification(lisa) }
'프로그래밍??? > Go Lang' 카테고리의 다른 글
Defer를 이용한 코딩 패턴 - Deferred closure (0) | 2017.11.24 |
---|---|
필드 이름 없이 선언하는 것을 막아주는 방법 (0) | 2017.10.11 |
GOLANG 첫번째 프로젝트 완료! (0) | 2017.02.06 |
read binary data from binary file and copy to struct (0) | 2017.02.01 |
테스트 프로젝트 시작 (0) | 2017.01.05 |
테스트 프로젝트 시작
GO LANG에 대한 테스트 프로젝트를 시작해 본다.
타켓은 운영중인 리버스지오코딩 엔진...
선택한 이유는...
내가 맘대로 때려 고쳐볼 수 있으며...
요구 사항이 많지 않으며...
웹 서버 코딩이며...
현재 서비스 하고 있는 프로젝트 중 제일 많은 초당 요청을 가지고 있다 (초당 150건 내외.)
'프로그래밍??? > Go Lang' 카테고리의 다른 글
Defer를 이용한 코딩 패턴 - Deferred closure (0) | 2017.11.24 |
---|---|
필드 이름 없이 선언하는 것을 막아주는 방법 (0) | 2017.10.11 |
GOLANG 첫번째 프로젝트 완료! (0) | 2017.02.06 |
read binary data from binary file and copy to struct (0) | 2017.02.01 |
인터페이스와 메서드 집합 그리고 포인터 (0) | 2017.01.12 |