티스토리 뷰
해당 리포트는 이미지 자료가 많이 들어가기 때문에 블로그 포스팅으로 대체합니다.
들어가기에 앞서
go 언어는 이름이 이름인지라 효율적인 검색 환경을 위해 go lang으로 불리는 경우가 많다.
따라서 해당 포스팅에서도 go lang으로 혼용하도록 하겠다.
go lang의 시작
go 언어는 2009년 11월 구글에서 처음 발표됐다.
해당 게시글은 Google Open Source 블로그에서 확인할 수 있다.
문서를 읽어보면 go 언어의 특징과 초기 컨셉에 대해 이해할 수 있다.
go는 파이썬처럼 dynamic language로 무척 빠른 작업 속도를 자랑하며 C나 C++ 같은 성능과 안전성을 보장한다.
즉각적인 반응속도를 통해 아무리 큰 바이너리라할지라도 몇 초만에 작업한다.
컴파일된 코드 역시 C의 속도에 버금갈 정도다.
Go는 다중 처리와 객체 지향 디자인, 클로저나 리플렉션 같은 기능을 지원하는 시스템 프로그래밍 언어다.
수천 개의 통신 스레드나 더 적은 시간으로 빌드를 완성하고 싶다면 Go를 사용해보도록 하자.
이렇듯 간단하고 안정적이며 빠르다는 이미지는 Go 언어가 내세우는 특징들이다.
발표된 것은 2009년이지만, 공식 사이트에서 버전 정보를 보면 2012년에 정식 출시되었다.
지금 현재도 공식 홈페이지를 가면 다음과 같은 캐치프라이즈를 만나볼 수 있다.
go 언어가 계속이고 언급하는 키워드는 '속도'와 '간단함'이다.
go lang은 어떤 배경을 가지고 있는걸까?
그건 세 사람이 공통적으로 언급한 것에서 판단할 수 있다.
go lang 프로젝트를 처음으로 시작한 세 명의 이름.
Robert Griesemer, Rob Pike, Ken Thompson
그들의 인터뷰를 찾아보았다.
공통적인 언급이 있다.
바로 C++에 대한 혐오.
Go 언어는 복잡한 C++에 한계를 느낀 세 코더들이 C++에서 탈출하기 위한 대안책으로 제작된 언어다.
go의 특징
그렇다면 go 언어는 어떠한 특징들을 가지고 있을까?
정적타입 && 강타입
먼저, go lang은 정적 타입의 강타입 언어로 안정성을 보장한다.
C언어를 대체하기 위해 나온 언어인만큼 안정성에 신경을 썼다.
var a int
자료형을 정적으로 선언해야하며 강타입이기 때문에 자료형을 바꿀 수 없다.
컴파일 언어
컴파일 언어다.
기계어로 번역해 실행파일로 만드는 언어들을 가리킨다.
C언어와 Go가 이쪽에 속한다.
한 줄씩 번역하는 인터프리터 언어와는 달리 컴파일 언어는 이미 실행파일이 만들어져있기 때문에 빠른 속도를 보장한다.
가비지 컬렉션
C언어의 통곡의 벽, 가비지 문제다.
C언어는 메모리를 할당하면 반드시 개발자가 해제해주어야되기 때문에 코린이들의 통곡의 벽이었다.
go lang은 가비지 컬렉션을 지원해주기 때문에 이 과정이 필요 없다.
진입장벽이 보다 낮아졌다고 할 수 있다.
병행성
go lang은 독자적인 루틴을 통해 쓰레드를 생성한다.
병행성을 이용해 동시성 프로그램을 만들 수 있다.
모듈화
코드의 재사용을 위해 모듈화 시스템이 구축되어있다.
그럼 이제 본격적으로 go 언어를 사용하러 가보도록 하겠다.
VS 코드로 설치하겠다.
개발환경 설정
All releases - The Go Programming Language
go.dev
링크로 가서 본인에게 맞는 버전으로 다운받자.
저 캐릭터도 자꾸 보니까 되게 멍청하게 매력있는 것 같다.
설치 완료 문구가 뜨면 터미널로 확인한다.
이때 프롬프트는 껐다 켜야 적용될 때가 많다.
$ go version
제대로 .go 파일이 동작하는지 확인한다.
$ go run 파일이름
튜토리얼
Tutorial: Getting started with multi-module workspaces - The Go Programming Language
Documentation Tutorials Tutorial: Getting started with multi-module workspaces Tutorial: Getting started with multi-module workspaces This tutorial introduces the basics of multi-module workspaces in Go. With multi-module workspaces, you can tell the Go co
go.dev
해당 튜토리얼을 진행해보도록 하겠다.
멀티 모듈 작업환경을 구현하는 튜토리얼이다.
이를 이용해 동시에 여러 모듈에서 코드를 작성하고 쉽게 빌드할 수 있다.
명령 프롬프트를 열어 홈 디렉토리로 변경하고 튜토리얼을 진행할 workspace > hello 디렉토리를 만들어 이동한다.
$ cd
$ mkdir workspace
$ cd workspace
$ mkdir hello
$ cd hello
golang.org/x/example 모듈에 의존하는 새 모듈을 만들고 파일을 연다.
$ go mod init example.com/hello
$ go get golang.org/x/example
현재 디렉토리 상태다.
hello.go를 만들어주고 다음 코드를 입력한다.
코드는 "" 안의 내용을 반전시키는 코드다.
실행하면 olleH가 출력된다.
이제 workspace를 지정해 go.work 파일을 생성해보도록 하겠다.
go work init 명령을 통해 workspace에 대한 파일을 생성한다.
workspace 디렉토리로 돌아가서 다음을 실행한다.
$ go run example.com/hello
그리고 모듈이 포함된 git 리포지토리 복사본을 다운로드한다.
$ git clone https://go.googlesource.com/example
workspace에 모듈을 추가한다.
$ go work use ./example
새로운 함수를 추가해서 결과를 확인해보자.
golang.org/x/example/stringutil 패키지에 대문자 변환 함수를 만들어준다.
toupper.go 파일을 생성해주었다.
다시 hello.go로 돌아가 그 함수를 사용해준다.
제대로 작동했다!
싱글 링크드 리스트
지금부터 go lang으로 싱글 링크드 리스트를 구현해보겠다.
싱글 링크드 리스트는데이터를 노드 단위로 구성해 연결하는 자료 구조다.
다음 노드를 가리키는 과정에서 포인터를 사용하는데 그 부분이 링크를 담당한다.
각 노드가 다음 노드를 가리키는 링크(포인터)만을 가지고 있기에 싱글이다.
참고로 단방향이기 때문에 마지막 노드는 가리키는 링크가 없다.
이를 이용해 삽입과 삭제에 용이하나, 검색에는 비효율적이다.
구현해보자.
먼저 노드 구조체를 선언한다.
type Node struct {
num int
next *Node
} // 노드 구조체
리스트의 시작점을 알려주어 조회의 편의성을 높이기 위한 head 포인터를 가진 구조체를 선언한다.
type LinkedList struct {
head *Node
} // 첫번째 노드를 가리킬 head 포인터
노드 삽입이 가능한 Insert 함수를 정의한다.
func (list *LinkedList) Insert(num int) {
newNode := &Node{ // 삽입하려는 데이터로 새 노드 생성
num: num,
next: nil,
}
if list.head == nil { // 첫 번째 노드가 비어있으면 head를 newNode에 할당
list.head = newNode
} else { // 첫 번째 노드가 존재하면 리스트 끝에서 newNode 연결
current := list.head
for current.next != nil {
current = current.next
}
current.next = newNode
}
}
list 변수가 LinkedList의 포인터를 가리킨다.
list를 통해 LinkedList의 필드와 메서드에 접근 가능하다.
다음은 노드 삭제가 가능한 Delete 함수를 선언한다.
func (list *LinkedList) Delete(num int) {
if list.head == nil { // 첫 번째 노드가 비어있으면 return
return
}
if list.head.num == num {
list.head = list.head.next // 첫 번째 노드를 삭제해야하면 계승 후 노드 삭제
return
}
prev := list.head // prev로 현재의 이전 노드 추적,
current := list.head.next // current로 현재 노드 추적
for current != nil { // 반복문 : 삭제할 노드 찾기
if current.num == num { // 찾았으면 다음 노드에 이전 노드 연결 후 제거
prev.next = current.next
return
}
prev = current
current = current.next
}
}
이제 조회가 가능한 Display() 함수를 구현해주면 끝이다.
func (list *LinkedList) Display() {
current := list.head
for current != nil {
fmt.Printf("%d ", current.num)
current = current.next // 첫 번째 노드부터 출력
}
fmt.Println()
}
테스트해봤다.
func main() {
linkedList := &LinkedList{}
linkedList.Insert(1)
linkedList.Insert(23)
linkedList.Insert(42)
linkedList.Display()
linkedList.Delete(0)
linkedList.Display()
linkedList.Delete(23)
linkedList.Display()
}
참고
Hey! Ho! Let's Go!
opensource.googleblog.com
Release History - The Go Programming Language
Release History This page summarizes the changes between official stable releases of Go. The change log has the full details. To update to a specific release, use: git fetch --tags git checkout goX.Y.Z Release Policy Each major Go release is supported unti
go.dev
Interview with Ken Thompson
The creator of UNIX discusses writing UNIX, the Go language, and collaborating with Dennis Ritchie
web.archive.org
Less is exponentially more
Here is the text of the talk I gave at the Go SF meeting in June, 2012. This is a personal talk. I do not speak for anyone else on the Go...
commandcenter.blogspot.com
The Evolution of Go
Algol successors Pascal (N. Wirth, ETH Zürich, 1968-1970) => BEGIN/END for blocks, semicolons as separators, left-to-right declarations, principled structured data types, notion of predeclared ("standard") functions, designed for teaching. C (Dennis Ritch
go.dev
(go-01) Mac golang 개발환경 설정하기 (VS Code)
devocean.sk.com
'Oops, All Code! > 📝 Study Notes' 카테고리의 다른 글
$04. 리액트로 회원가입 구현 (0) | 2023.05.31 |
---|---|
$03. Vanilla JS로 로그인 구현 (0) | 2023.05.22 |
#02. JSX가 XML을 사용하는 이유 (0) | 2023.05.18 |
#01. HTML과 XML? (1) | 2023.05.17 |
$02. 모달 구현과 fetch API (0) | 2023.05.16 |
- Total
- Today
- Yesterday
- javascript
- 일급객체
- 도서리뷰
- 어휘력
- 회고
- 코딩테스트
- 대학생팝업스토어
- 트러블슈팅
- 소사벌
- 책추천
- 소사벌맛집
- 프로토타입
- typescript
- 어른의어휘공부
- 타입좁히기
- js
- 안성스타필드
- 경험플리마켓
- 비즈플리마켓
- 플리마켓운영
- 도서추천
- 우아한테크코스
- 대학생플리마켓
- 프론트엔드
- 프리코스
- 플리마켓후기
- 카드뉴스
- 카페추천
- 서평
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |