일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- install
- channel
- http
- window
- Linux
- 책
- tcp
- mutex
- FOR
- go
- 영화
- Sync
- go언어
- File
- bitcoin
- API
- Python
- JavaScript
- C
- Close
- package
- Golang
- GO 언어
- windows
- range
- write
- json
- c++
- 리뷰
- Callback
- Today
- Total
목록go (56)
Code Habit
중첩된 for문에서 break로 for문을 빠져 나오면 가장 가까운 for영역만 나오게 된다. 중첩된 for문을 완전히 빠져나오고 싶을때 label을 활용할 수 있다. func main() { a, b := 9, 9 Out: for i := 0; i < a; i++ { for j := 0; j < b; j++ { if j == 5 { break Out } } } } 'Out' 레이블을 최상단 for문 바로 위에 정의해주고 안쪽에서 break 할때 해당 레이블을 명시하면 중첩된 for문을 모두 빠져나온다. 참고로 레이블을 사용하여 중첩된 for문을 빠져나오는 것은 마치 goto문을 활용하는 것과 같기때문에 자칫 코드에 혼란을 가미할 수 있으니 꼭 필요한 경우만 사용하고 되도록 중첩된 for문의 사용을 지양..
bufio 패키지는 buffered I/O를 구현하며 io.Reader, io.Writer 객체를 래핑한다. bufio를 사용하면 버퍼를 활용해 I/O의 부하를 줄일 수 있다. bufio.NewReader 함수를 이용해 파일이나 표준입력스트림 등에서 defaultBufSize만큼 읽어올 수 있다. func NewReader(rd io.Reader) *Reader { return NewReaderSize(rd, defaultBufSize) } ex) func ReadFile(filename string) (string, error) { file, err := os.Open(filename) if err != nil { return "", err } defer file.Close() rd := bufio.N..
Tigo는 Go언어로 개발된 web 프레임워크로 이를 이용하여 간단하게 웹서버를 제작할 수 있다. 간단히 Get방식의 API 서버를 만들어 보려 한다. 먼저, Tigo 라이브러를 설치해야 한다. 'go get' 명령어를 이용하여 Tigo 라이브러리를 설치한다. >> go get github.com/karldoenitz/Tigo/... 그리고 다음 예제 코드를 작성한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package main import "./thirdparties/Tigo/TigoWeb" // handler type HelloHandler struct { Tig..
go 언어에서 byte배열을 string으로 변환하는 방법은 여러가지 있다. 예제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 b := []byte{'J', 'i', 'n', 'S', 'u', 'n', 'g'} str1 := string(b[:]) str2 := fmt.Sprintf("%s", buf) str3 := bytes.NewBuffer(b).String() str4 := BytesToString(b) // func BytesToString(b []byte) string { bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) sh := reflect.StringHeader{bh.Data, bh.Len} return *(*string)(unsafe...
go 로 작성된 서버/클라이언트 끼리 구조체 데이터를 주고 받고 싶으면 "gob"패키지 같은 go에서 제공하는 패키지를 사용하면 편리하다. 그런데 만약 go로 서버를 만들되 클라이언트를 다른언어 ( c ) 로 만들게 되면 위와 같은 패키지는 사용할 수 없게 된다. 이렇게 되면 문제가 하나 발생하는데 go에서는 포인터 개념도 없고, 문자열을 표현하는 string 자료형이 가변이라 약속된 크기의 데이터를 주고 받기가 꽤 까다롭다는 것이다. 그래서 필자는 아래와 같은 두가지 방법을 생각해 보았다. 1. 사이즈 전송 후 구조체 데이터를 json데이터로 전송 2. 사이즈 전송 후 구조체 데이터의 각 필드를 고정된 크기의 []byte형으로 전송 네트워크 통신에서 (특히 http 통신)에서 많이 사용하는 json 데..
앞에서 go를 이용한 TCP ehco 서버/클라이언트를 만들어 보았는데, 구현에 문제점이 있다고 지적하였었다. TCP 통신은 원래 데이터간의 경계가 존재 하지 않는다. 즉 네트워크나 PC 상황에 따라 데이터 전송이 밀려 자칫 데이터 전송이 의도치 않게 될수 있다는 것이다. 그래서 이를 보완하기 위해 본 데이터를 전송하기 전에 미리 전송되는 데이터의 size를 알려줘 데이터 전송에 오차가 없도록 할 수 있다. 참 다행히도 TCP 통신은 데이터의 무결성을 보장하기 때문에 전송하는 데이터가 중간에 유실될 염려는 하지 않아도 된다. 다음은 예제 코드이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 func Co..
go를 이용하여 간단한 tcp echo 서버/클라이언트를 만들어 보겠다. server 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 // main.go package main import ( "io" "log" "net" ) func main() { l, err := net.Listen("tcp", ":8000") if nil != err { log.Println(err) } defer l.Close() for { conn, err := l.Accept() if nil != err { ..
golang에서 "net" 패키지에서 TCP 프로토콜을 제공한다. 간단히 TCP 프로토콜 에코서버와 클라이언트를 만들어 보겠다. 서버 예제 // main.go package main import ( "fmt" "io" "net" ) func handler(conn net.Conn) { recv := make([]byte, 4096) for { n, err := conn.Read(recv) if err != nil { if err == io.EOF { fmt.Println("connection is closed from client : ", conn.RemoteAddr().String()) } fmt.Println("Failed to receive data : ", err) break } if n > 0 ..