본문 바로가기

기타

[Golang] Go 시작하기

반응형

특징

컴파일언어이지만 컴파일러의 컴파일 속도가 매우 빨라 인터프리터 언어처럼 사용할 수 있다. 언어의 문법적 구조를 개선해서 달성할 수 있었는데, 컴파일러가 소스코드를 해석하는 pass수를 줄여 달성할 수 있었다.

GO 에서는 GoRoutine 이라는 비동기 메커니즘을 제공하고 있다. 고루틴을 사용하면 이벤트 처리, 병렬 프로그래밍 등이 간단하게 작성할 수 있다. 단, 동기화를 유의하여 프로그래밍 해야한다. 고루튼은 멀티 스레드 메커니즘이지만 경량스레드로 CPU코어수와 무관하게 수백, 수천만 고루틴을 작성해도 성능에 문제가 생기지 않는다.

 

Go에서 언더스코어(underscore)

사용하지 않을 변수를 의미한다. 사용하지 않은 변수, 패키지 등에 대해 _(underscore)를 사용하지 않는 경우 에러를 발생시킨다. 

 

 

참고 블로그

https://steemit.com/kr/@brownbears/go

 

GO언어란? — Steemit

Go 언어는 빠른 성능, 안정성, 편의성, 쉬운 프로그래밍을 목표로 개발되었으며 범용 프로그래밍 언어입니다. 내용 구글이 2009년에 만든 프로그래밍 언어입니다. 이름이 이름인 만큼 검색이 불편

steemit.com

 

 

Go Method

객체지향 프로그래밍을 고유의 방식으로 지원하고 있다. 다른 언어에서는 클래스 내에 필드, 메소드를 함께 갖고 있는 반면 Go언어 에서는 struct가 필드만을 가지며 메소드는 별도로 분리되어 정의된다. 

Go 메소드에서 갖는 func함수는 그함수가 어떤 struct를 위한 메소드인지 표기한다. 이 부분은 receiver라고도 불리는데 struct 타입과 struct변수명을 지정한다. struct 변수명은 함수내에서 파라미터처럼 활용된다. 

//Device struct 정의
type Device struct{
	config int,
    width int
}

//Device register() 메소드
func (d Device) register() int {
	return d.config;
}


//pointer Reciever
func (d *Device) check() int {
	d.config ++;
    return d.width + d.config;
}

 마지막의 예제는 value 와 pointer 의 차이에 대해 보여주고 있다. value는 struct의 데이터를 복사하여 전달한다면  pointer는 struct의 포인터를 전달한다. 그래서 메소드 내에서 필드값이 변경되면 그대로 호출자에도 반영된다.

 

GoRoutine

경량쓰레드인 고루틴을 만드는 방법은 일반 함수 앞에 go 를 붙이면 경량 쓰레드로 동작한다. 

go func(){
	for{
    		time.Sleep(timme.Second * 5)
    	}
}

 

 

Channel

고루틴에서 어떤 작업을 수행한 후 결과를 받고 싶은 경우 사용한다. 다른 언어에서는 동시성 보장을 위해 큐를 만들도 이벤트 동기화 처리를 해주는 등의 작업이 있지만 고언어에서는 간편하게 수행할 수 있다.

func main(){
	ch := make(chan int) // channel 생성
    	go send(ch) 	// goroutine
    	go receive(ch) 	//	goroutine

}

func send(ch chan int){
	//..
    
    ch <- 45
}

func receive(ch chan int){
	value := <-ch
    	fmt.Print("receive: " , v)
}

가장 윗줄에서 int타입을 전송할 수 있는 채널을 만든다. 그런 뒤 생성자는 45를 생성하여 쓰고, 소비자는 그 값을 처리한다.

 

Interface

struct가 필드들의 집합이라면 interface 는 메소드들의 집합이다. interface는 구현해야하는 메소드들을 정의한다.

type BaseProv interface{
	asText(int16) string
    	resHandler() (func(uj.JNode))
}

interface를 구현하기 위해서는 해당 타입이 그 인터페이스의 메소드들을 모두 구현하면 된다. 위의 BaseProv 인터페이스를 구현하는 MyProv 가 하단에 정의되어 있다.

type MyProv struct{
	name string
    onRes func(uj.JNode)
}

func (my MyProv) asText(int16) (string) {
	return 'text';
}

func (my MyProv) resHandler()(func(uj.JNode)){
	return my.onRes;
}

 

Socket

golang에서 websocket을 사용하는 방법은 아래와 같다. 

var upgrader = websocket.Upgrader{
	ReadBufferSize: 1024,
    WriteBufferSize: 1024,
}

func sendReq(c *gin.Context){
	writer := c.Writer;
    req := c.Request;
	conn, err := upgrader.Upgrade(writer,req,nul)
    if err!=nil{
    	fmt.Println("no..");
        return
    }
    
    for {
    	messageType, message, err = conn.ReadMessage();
        if err !=nil{
        	fmt.Println("read no..");
        }
        if 
    }

}

 

gin

gin은 웹서버를 만들 수 있는 웹 프레임워크이다. go 프레임워크로 fiber, echo, router, fasthttp 등이 있다.

사용하는 방법은 패키지를 먼저 설치후 import를 수행한다.

import "github.com/gin-gonic/gin"

 

Map

hashtable을 구현한 자료구조로 key,value 형태이다. "map[key 타입 ] value타입" 형태로 선언한다.

var myMap map[int] string

이때 선언된 변수 myMap은 reference type 으로 nil 값을 갖는다. map 을 초기화하기 위해서 make()함수를 사용한다.

//1. make() 
myMap := make(map[int]string)

//2. literal
myMap := map[int]string{
	1:"Sample1",
   	2:"Sample2"
}

make함수는 해시테이블 자료구조를 메모리에 생성하고 그 메모리를 가르키는 값을 리턴한다. 

반응형

'기타' 카테고리의 다른 글

프로세스와 스레드  (0) 2020.10.03
보안  (0) 2020.09.15
Semaphore & Mutex  (0) 2020.09.10
git  (0) 2020.09.02
SQLD  (0) 2020.09.02