9

채널(channel), 컨텍스트(Context)

채널(channel), 컨텍스트(Context) 이전에 고루틴을 나누는 방법을 보았는데, 동시성을 제어하는 방법들을 살펴봤다. 그리고 거기서 역할을 나누는 것이 있었고... 이 때에 쓰이는게 채널이다. 채널 : 고루틴끼리 메세지를 전달할 수 있는 메세지 큐 데이터를 FIFO로 넣고 -> 빼고 이렇게 하는거임 이거 다른말로 Thread-safe Queue이다. 채널의 크기 기본 크기 0 처음 만들면 크기가 0으로 생성된다. 그리고 make(chan int, 20) 이런 식으로 크기를 정해줄 수 있다(이러면 20개짜리 크기) 이거 그래서 채널 만들어놓고 데이터 넣은 다음에 안빼주면 무한히 대기하게 된다ㄷㄷ 이런것을 좀비 고루틴, 록은 고루틴 릭이라고 하는데(채널을 닫아주지 않아 무한 대기를 하는 고루틴) 이..

고루틴(goRoutine)

고루틴(goRoutine) 쓰레드 먼저 쓰레드는 실행 흐름을 의미. 프로그램은 사실 기계어 명령의 다발인데, 이게 로드되면 메모리로 올라가게 된다. CPU는 이 명령어를 실행하는 주체이고 그냥 연산해서 결과를 보내주는 녀석이다. 그래서 이제 원래는 하나의 CPU가 이 명령어의 다발(쓰레드)를 실행해 주었다. 멀티 쓰레드 근데 이제 멀티쓰레드 어쩌고를 들어본적이 있을텐데, 그거는 코어가 빠르게 쓰레드를 교체하게 된다. (실행 흐름이 여러개가 돌아감) 이게 어떻게 가능할까? 각 쓰레드는 자신만의 IP포인트가 있다. CPU가 각 IP포인트에 있는 명령을 수행한다. 그러다가 다음 쓰레드의 IP포인트에서부터 증가하면서 수행한다. 그러고 또 다음 쓰레드를 찾아간다. 그니까 사실 동시에라기 보다는 각 쓰레드의 명령을..

Go와 Gin Framework 를 사용한 게시판 만들기 (2) - Swagger 붙이기

이번에는 Go에서 Swagger를 통해 API명세를 진행해 보겠다. Go는 자바에 비해 좀 귀찮다. 세팅하기 먼저 Terminal상에서 Swagger에 필요한 세팅을 받아줄 것이다. go get -u github.com/swaggo/swag/cmd/swag 그러면 이렇게 알아서 관련된 것들을 module에 추가해준다. swagger가 제대로 설치되었는지 확인하기 위해 한번 관련 명령어를 쳐본다. swag 이거 만약에 쳐봤는데 안나오면 아마 PATH가 제대로 설정되지 않았을 확률이 높다. export PATH=$(go env GOPATH)/bin:$PATH 이거 해보셈.. 이제 gin Framework에 맞춰서 여기 필요한 gin swagger를 받아준다. go get -u github.com/swaggo..

Go와 Gin Framework 를 사용한 게시판 만들기 (1) - 시작하기

목표는 간단한 기능을 가진 게시판 API를 제작하는 것이다. 프론트는 안붙일건데, 이유는 귀찮아서이다 하핫 먼저 처음부터 막 진행하기는 좀 곤란하니까, Go에 Gin Framework를 붙이고 이를 확인하는 것까지 해보려고 한다. 프로젝트 만들기 Go를 통해 간단한 Get API를 만들 예정이다. 먼저 개인 폴더(chan_personal_go)를 만들어 준다. 그리고 그 아래에 main.go 폴더를 만들고, controller를 관리해줄 controller 폴더를 생성한다. 이후 해당 폴더 아래에 controller.go 파일을 생성한다. go는 기본적으로 main.go를 동작시킨다. 이제 메인을 작성해줄 것이다. main.go 작성 package main import ( "github.com/gin-g..

Golang의 포인터

포인터 포인터는 C나 C++에서 지원하는 친구인데, Go도 이걸 지원한다. 참고로 java, python, JS등에서도 포인터를 쓰고는 있는데, 이걸 개발자가 직접 쓰는게 아니라 암묵적으로 내부에서 사용하는 것이다. 포인터는, 메모리 주소를 값으로 갖는 타입이다. var a int var p *int p = &a // a의 메모리 주소를 포인터 변수 p에 대입이거는 var p가 int타입의 메모리 주소값을 값으로 가지고 있다는 것이고, a의 메모리 주소를 p가 저장한다. *p = 20 이건 p가 a의 주소를 가지고 있었는데, 그 공간의 값을 20으로 넣어라 라는 것이다. 이렇게 되면 a의 값이 20이 될 것이다. 여러 포인터 변수가 하나의 변수를 가리킬 수 있다. package main import "f..

Golang의 구조체

구조체 여러 필드를 묶어서 사용하는 타입 구조체 선언 type 타입명 struct { 필드명 타입 ... 필드명 타입 }새로운 type을 선언하겠다고 한 뒤에 타입명 선언, 이후 구조체(struct)를 선언하면 된다. ex) type Student struct { Name string Class int No int Score float64 }var a Student 이후 a라는 변수가 구조체 Student타입이라고 선언해서 사용해줄 수 있다. 구조체 변수 초기화 var house House 모든 필드값이 기본값으로 초기화된다. var house House = House{"경기도 군포시", 50, 10, "아파트"} var house House = House{ "경기도 군포시", 30, 10, "아파트",..

Golang의 기초

Go언어에 관하여 Go의 역사 GO언어는 2009년에 Google에서 만들어진 오픈 소스 프로그래밍 언어이다. 그리고 GO는 UTF-8을 기본 문자로 갖는다. Go의 특징 pakage Go는 1개의 main package와 여러 개의 다른 package를 가지고 있다. 원하는 기능을 가진 package를 가져와서 사용하면 된다. main은 시작점이기 때문에 따로 설정해 줄 수 없고 단 한개만을 사용한다. fmt는 function의 약자이다.(un -> m) fmt는 함수를 정의하기 위해 사용한다. 변수 변수란 값을 저장하는 메모리 공간을 가리키는 이름이다. 값을 저장하는 공간은 크게 하드디스크, memory 두개로 나뉜다. 하드디스크는 느리지만 프로그램이 종료되어도 데이터가 유지된다. memory는 빠르..

Golang - 고랭 이란??

프로그래밍 언어 프로그램이란? 원하는 명령을 원하는 순서대로 실행될 수 있도록 적어 놓은 문서를 뜻한다. 프로그래밍은 어떠한 명령을 실행할 때에 결국 컴퓨터 언어로 실행하게 된다. 정적 컴파일 언어, 동적 컴파일 언어 이 컴퓨터 언어로의 변환 시점에 따라 정적 컴파일 언어와 동적 컴파일 언어로 나뉘게 된다. 정적 컴파일 언어 C, C++, Go 정적 컴파일 언어는 Code를 실행하기 전에 미리 기계어로 변환시킨다.(실행 파일 생성) 이 방식의 장점은 미리 기계어로 변환시켜두었기 때문에 한번 변환하게 되면 속도가 빠르게 사용할 수 있다. 동적 컴파일 언어 JS, python 등등.. 추가로 Java가 동적 컴파일 언어라고 나와있어서 이상해서 찾아 보았는데, java는 동적/정적의 특성을 모두 가지고 있는 ..