728x90

go 38

[Go] 기초 - 루틴(goroutine)

1. Go루틴 - Go루틴(goroutine)은 Go 런타임이 관리하는 Lightweight 논리적 (혹은 가상적) 쓰레드이다. - Go에서 "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행한다. - goroutine은 비동기적으로 함수루틴을 실행한다. 이를 통해 여러 코드를 동시에 실행한다. package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 10; i++ { fmt.Println(s, "***", i) } } func main() { // 함수를 동기적으로 실행 say("첫 번째 함수 실행") // 함수를 비동기적으로 실행 go say("두 번째?") go say("세 번째?") go ..

개발/Go 2022.08.02

[Go] 기초 - defer&panic

1. defer - defer는 특정 문장이나 함수를 나중에 (defer를 호출하는 함수가 리턴하기 직전에) 실행하게 한다. - Java 같은 언어에서의 finally 블럭처럼 마지막에 작업을 위해 사용 package main import "os" func main() { f, err := os.Open("1.txt") if err != nil { panic(err) } // main 마지막에 파일 close 실행 defer f.Close() // 파일 읽기 bytes := make([]byte, 1024) f.Read(bytes) println(len(bytes)) } - 나는 주로 DB 커넥션을 끊을 때 사용했다. 2. panic - panic은 현재 함수를 즉시 멈추고 현재 함수에 defer 함수들..

개발/Go 2022.08.01

[Go] 기초 - Error

1. 에러 - Go는 error 라는 interface 타입을 갖고 있다. - Go에서 에러가 발생한 경우 error 인터페이스를 통해서 주고 받는다. type error interface { Error() string } 2. Go 에러처리 package main import ( "log" "os" ) func main() { f, err := os.Open("C:\\temp\\1.txt") if err != nil { log.Fatal(err.Error()) } println(f.Name()) } - Go 함수가 결과와 에러를 함께 리턴한다면, 이 에러가 nil 인지를 체크해서 에러가 없는지를 체크할 수 있다. - 에러가 nil이 아니면 에러 로그를 남기는 로직. - 또 다른 에러처리는 error의 ..

개발/Go 2022.07.31

[Go] 기초 - 인터페이스

1. Go 인터페이스 - 구조체(struct)가 필드들의 집합체라면, interface는 메서드들의 집합체 - interface는 타입(type)이 구현해야 하는 메서드 원형(prototype)들을 정의 - 하나의 사용자 정의 타입이 interface를 구현하기 위해서는 단순히 그 인터페이스가 갖는 모든 메서드들을 구현하면 된다. - 인터페이스는 struct와 마찬가지로 type 문을 사용하여 정의 type Shape interface { area() float64 perimeter() float64 } 2. 인터페이스 구현 - 인터페이스를 구현하기 위해서는 해당 타입이 그 인터페이스의 메서드들을 모두 구현하면 되므로, 위의 Shape 인터페이스를 구현하기 위해서는 area(), perimeter() 2..

개발/Go 2022.07.30

[Go] 기초 - 메소드

1. Go 메소드(Method) - 메소드는 특별한 형태의 func 함수 - 메소드는 함수 정의에서 func 키워드와 함수명 사이에 "그 함수가 어떤 struct를 위한 메소드인지"를 표시한다. - receiver부분에 메소드가 속한 struct 타입과 struct 변수명을 지정한다.(struct 변수명은 함수 내에서 마치 입력 파라미터처럼 사용된다.) package main //Rect - struct 정의 type Rect struct { width, height int } //Rect의 area() 메소드 func (r Rect) area() int { return r.width * r.height } func main() { rect := Rect{10, 20} area := rect.area()..

개발/Go 2022.07.27

[Go] 기초 - 구조체(Struct)

1. Struct (구조체) - Go에서 struct는 Custom Data Type을 표현하는데 사용되는데, Go의 struct는 필드들의 집합체다. - Go에서 struct는 필드 데이터만을 가지며, (행위를 표현하는) 메서드를 갖지 않는다. - Go 언어는 객체지향 프로그래밍(Object Oriented Programming, OOP)을 고유의 방식으로 지원한다. 즉, Go에는 전통적인 OOP 언어가 가지는 클래스, 객체, 상속 개념이 없다. 전통적인 OOP의 클래스(class)는 Go 언어에서 Custom 타입을 정의하는 struct로 표현되는데, 전통적인 OOP의 클래스가 필드와 메서드를 함께 갖는 것(Java)과 달리 Go 언어의 struct는 필드만을 가지며, 메서드는 별도로 분리하여 정의한..

개발/Go 2022.07.27

[Go] 기초 - 컬렉션 (Map)

1. Map 개요 - Map은 키(Key)에 대응하는 값(Value)을 신속히 찾는 해시테이블(Hash table)을 구현한 자료구조이다 var newMap map[int]string newMap = make(map[int]string) //리터럴을 사용한 초기화 exMap := map[string]string{ "a": "apple", "b": "banana", "c": "coconut", } - Map을 사용하려면 make함수로 초기화를 꼭 해주어야 한다. - 바로 초기화도 가능하지만 나는 개발할 때 항상 make함수로 초기화를 한 후에 사용했다. 2. Map 사용 - 데이터를 추가하기 위해서는 "map변수[키] = 값" 처럼 해당 키에 그 값을 할당 - 키가 중복일 경우 마지막에 할당한 값이 기존에..

개발/Go 2022.07.22

[Go] 기초 - 컬렉션 (Slice)

1. 슬라이스 - 배열과 다르게 크기를 동적으로 변동이 가능하다. - Go Slice 선언은 배열을 선언하듯이 "var v []T" 처럼 하는데 배열과 달리 크기는 지정하지 않는다. 예를 들어, 정수형 Slice 변수 a를 선언하기 위해서 "var a []int" 처럼 선언할 수 있다. - make 함수를 통해서 선언이 가능하다. - make() 함수의 첫번째 파라미터에 생성할 슬라이스 타입을 지정하고, 두번째는 Length (슬라이스의 길이), 그리고 세번째는 Capacity (내부 배열의 최대 길이)를 지정하면, 모든 요소가 Zero value인 슬라이스를 만들게 된다. 여기서 만약 세번째 Capacity 파라미터를 생략하면 Capacity는 Length와 같은 값을 갖는다. 그리고 슬라이스의 길이 ..

개발/Go 2022.07.21

[Go] 기초 - 컬렉션 (배열)

1. 배열 - 배열은 연속적인 메모리 공간에 동일한 타입의 데이타를 순서적으로 저장하는 자료구조 - Go에서 배열의 첫번째 요소는 0번, 그 다음은 1번, 2번 등으로 인덱스를 매긴다 (Zero based array). - 배열의 선언은 "var 변수명 [배열크기] 데이타타입" 과 같이 하는데, 배열크기를 데이타타입 앞에 써 주는 것이 C, Java 같은 다른 언어들과 다르다. Go에서 배열의 배열크기는 Type을 구성하는 한 요소이다. 즉, [3]int와 [5]int는 서로 다른 타입으로 인식된다. 배열이 선언된 후에 각 배열의 요소를 인덱스를 사용하여 읽거나 쓸 수 있다. package main func main() { var a [3]int //정수형 3개 요소를 갖는 배열 a 선언 a[0] = 1..

개발/Go 2022.07.20
728x90