목록Go 언어 (13)
Connecting
TCP 통신 Go 언어에서는 기본 패키지에 다양한 네트워크 프로토콜을 제공합니다. 이중 TCP는 네트워크 전송계층에서 가장 핵심적인 부분이라고 할 수 있을 정도로 많이 사용되며, HTTP 프로토콜도 TCP기반으로 동작합니다. 간단하게 서버 / 클라이언트 통신 서버를 만들어 보고 동작하는지 확인해보도록 하겠습니다. TCP Server package main import ( f "fmt" "net" ) func main() { f.Println("server running 8888 port") ln, err := net.Listen("tcp", ":8888") // 8888 포트로 리스닝하는 tcp 서버를 생성합니다. if err != nil { f.Println(err) return } defer ln.C..
Go 언어에서는 간단하게 파일을 압축하고 풀수 있는 패키지를 기본적으로 제공합니다. 각각의 예제를 작성하고 실행하겠습니다. 파일 압축하기 package main import ( "compress/gzip" f "fmt" "os" ) func main() { file, err := os.OpenFile( "hello.txt.gz", os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.FileMode(0644)) if err != nil { f.Println(err) return } defer file.Close() w := gzip.NewWriter(file) defer w.Close() s := "Hello World" w.Write([]byte(s)) w.Flush() } 파일 압축 풀기..
Go 언어에서는 간단하게 URL를 파싱할 수 있는 기능을 제공합니다. 다음 예제를 통해서 간단하게 확인해 보세요. package main import ( f "fmt" "net" "net/url" ) func main() { s := "postgres://user:pass@host.com:5432/path?k=v#f" u, err := url.Parse(s) if err != nil { panic(err) } f.Println(u.Scheme) f.Println(u.User) f.Println(u.User.Username()) password, _ := u.User.Password() f.Println(password) f.Println(u.Host) host, port, _ := net.SplitHos..
파일 입출력 거의 모든 프로그래밍 언어에서 데이터를 읽기/쓰기 작업 기능이 필요합니다. Go 언어 역시 이러한 기능을 제공하며, 다음 예제를 통해서 확인해 보겠습니다. package main import ( f "fmt" "io/ioutil" "os" ) func main() { CurrentDirectory() data, err := ioutil.ReadFile("hello.txt") check(err) f.Print(string(data)) } func check(e error) { if e != nil { f.Println("파일을 읽을 수 없습니다.") f.Println("Error Code : ", e) } } func CurrentDirectory() { path, _ := os.Getwd()..
고루틴 고루틴 (goroutine)은 가벼운 스레드와 같은 것으로 수행 흐름과 별개로 병렬처리가 가능하게 합니다. OS에서 스케줄링으로 관리되는 스레드(약 1MB)보다 가볍기 때문에 (약 8kbyte) 자신의 코어갯수보다 많이 실행해도 무리 없이 동작한다는 장점이 있습니다. 고루틴은 고 런타임이 관리하고 고채널을 통해 고루틴간의 통신을 할 수 있습니다. Go 언어에서 고루틴을 실행하는 방법은 아래와 같이 매우 간단합니다. go Hello() // 일반함수를 통한 고루틴 실행 for i := 0; i < 3; i++ { go func(n int) { // 익명함수(클로저)를 통한 고루틴 실행 f.Println("goroutine : ", n) oneTime.Do(Hello) }(i) } 고루틴을 사용하고자..
구조체 Go의 structs는 필드들로 이루어진 타입을 갖는 컬렉션입니다. 레코드를 구성하기 위해 데이터들을 그룹핑 하는데 유용합니다. 다음 예제를 통해 구조체 선언을 확인해 보세요. type person struct { name string age int } 위 person 구조체 타입은 name과 age라는 필드를 가지고 있습니다. 같은 자료형을 가지고 있다면 다음과 같이 작성할 수 도 있습니다. type person struct { phone, age int } 구조체를 선언하고 필드명을 초기화 할 수 있으며, 생략된 필드는 0을 가지게 됩니다. 기본적으로 . 을 사용해서 구조체 필드에 접근하여 사용하며, &를 사용하면 구조체 포인터를 사용할 수 있습니다. 다음 예제를 통해 구조체 연습을 진행하도록..
클로저 / 재귀 / 지연호출 클로저 사용하기 Go 언어에서의 클로저란 익명 함수(Anonymous functions)와 비슷한 개념으로 이름 없이 한줄로 함수를 정의하고 싶을때 유용합니다. 이를 통해 함수 안에서 함수를 선언 및 정의할 수 있고, 바깥쪽 함수에 선언된 변수에도 접근할 수도 있습니다. 아래 예제를 통해 클로저 사용 예제를 확인하시길 바랍니다. package main import f "fmt" func main() { f.Println("클로저") sum := func(a int, b int) int { return a + b } result := sum(1, 2) f.Println(result) f.Println("-----------------") cal := voltage() f.Pri..
함수 함수(function)란 어떠한 입력을 통해서 어떠한 출력 매개변수로 맵핑하는 독립적인 코드 영역입니다. Go 언어에서는 main 함수가 기본이지만 필요에 따라서 여러 함수 선언을 통해서 다양한 역할을 담당하는 함수를 선언하여 사용할 수 있습니다. 이렇게 기능별 함수를 선언하면 해당 역할을 담당하는 함수를 재사용 할 수 있으며, 코드를 간결하게 작성할 수 있습니다. 다음 예제는 함수를 사용한 기본 예제입니다. package main import f "fmt" func hello() { f.println("Hello") } func main() { hello() world() } func world() { f.println("world!") } 일부 언어의 경우 함수를 선언하기 위해서는 정의한 함수를..
배열 사용하기 Go 언어에도 다른 프로그래밍 언어와 동일하게 배열이 존재합니다. 배열은 숫자, 문자, 문자열 등을 나열해 놓은 상태로서 다양한 값이 들어갈 수 있습니다. 또한, 배열은 비슷한 데이터들을 한번에 가지고 있을 때 사용되거나, 반복적으로 사용되어야 하는 값들의 집합을 만들 때 사용합니다. Go 언어에서 배열은 길이가 고정되어 있고, 다른 언어와 마찬가지로 배열의 인덱스는 0부터 시작합니다. 다음 예제를 통해 배열을 선언하도록 하겠습니다. var empty [5]int // 크기가 5인 배열을 생성 empty[4] = 5 // empty 배열 4번째 부분에 값을 5로 초기화 한다. f.Println(empty) var a [3]int = [3]int{1, 2, 3} // 정수형의 크기가 3인 배..
조건문 / 분기문 / 반복문 if 사용하기 if 문은 해당 조건이 만족하면 {}안에 코드를 수행합니다. 다만 다른 언어와 다르게 조건식을 ()를 작성하지 않아도 되지만 반드시 Boolean 형식으로 작성해야 하며, 해당 문법을 같은 라인에 두어야 합니다. 이를 어기게 될 경우 에러가 발생합니다. 다음은 기본적인 if 문법을 사용한 예제입니다. package main import f "fmt" func main() { num := 10 if num = 1 && num = 6 && num