tistory사이트에서 Golang 실습 진행
Go 언어를 공부하기 위한 자료 및 문서 정리
Go 이 포스트는 블로그내 Go 카테고리의 목차와 Go 언어를 할 때 참고하면 좋은 문서를 일부 정리해놓기 위해 작성되었다. Go 언어는 성장하고 있으며, 한국어 자료들도 어느정도 나오고 있기 때문
pronist.dev
- 함수(익명함수, 스코프, 고루틴, 지연호출)
- 패키지(package, import)
- 배열 & 슬라이스(Array, Slice)
기본 함수
학습한 함수 구성요소를 살펴보자. func 키워드, 함수의 이름, 입력, 출력정도가 있다.
- func 키워드 통해서 sayHello 함수 정의
- 괄호 사이에 parameter 값이 있고 함수를 호출하면 값을 돌려준다.
- sayHello를 보면 string 타입의 message 라는 parameter를 입력으로 받고 출력으로는 string, error 타입에 해당하는 값을 돌려주게 된다.
- Go func.의 특징!! return 값으로 여러 개의 값을 돌려줄 수 있다. 다른 language처럼 array나 object를 쓰는 것은 아니다.
- 아래에서 nil은 error가 없을 때 반환, 또 map, slice에 대해서 제로 값으로써 동작한다.
package main
import (
"fmt"
"log"
)
func sayHello(message string) (string, error) {
return message, nil
}
func main() {
helloGo, err := sayHello("Hello, Go!")
if err != nil {
log.Fatal(err)
}
fmt.Println(helloGo)
}
// Hello, Go!
함수 스코프
- 또한 함수는 하나의 스코프로 동작가능
- 함수 자신보다 상위의 스코프에서 선언한 변수에 대해서 접근 가능
- 함수내부에서 선언한 변수에 대해서는 상위 스코프에 접근 불가
package main
var (
message string = "Hello, Go!"
)
func sayHello() {
hello := message
}
func main() {
sayHello()
// fmt.Println(helloGo)
// Error
}
// hello declared but not used
일급 함수
- Go 함수는 일급함수. 일급함수는 함수형 프로그래밍에서 쓰이는 개념
- 함수를 다른 함수의 parameter로 넘기거나 변수에 담고, return으로 사용하는 등, 함수 자체를 값 처리할 수 있는 것을 의미.
- 정리하면 함수를 값으로써 여길 수 있으면 일급 함수이고
- 함수 그냥 리턴하거나 parameter로 받거나 리턴하면 고차함수
package main
import "fmt"
func each(arr []string, iterator func(string)) {
for _, v := range arr {
iterator(v)
}
}
func main() {
p := func(v string) {
fmt.Println(v)
}
each([]string{"Hello, Go!", "Who are you?"}, p)
}
// Hello, Go!
// Who are you?
defer
- runtime중에 error가 발생한다고 해도
- defer를 사용하면 함수가 종료될 때 호출됨. defer 키워드를 사용한 함수는 호출이 보장.
- 아래 14 코드에서 defer를 통해 file.Close()를 먼저 예약을 해두고 작업을 진행
- defer를 여러개 사용도 가능. stack으로 쌓이기 때문에 가장 나중에 설정된 defer 부터 실행
- 파일 닫기, 커넥션 종료 등 열고 닫는거 세트로 존재해야 하고
- 리소스 풀지 않으면 메모리를 차지해 시스템에 문제 일으키는 경우 대비해 defer를 사용해 손쉽게 제어
package main
import (
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("./Go.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// -> ./Go.txt
fmt.Println(file.Name())
}
go & go-routine
- go 키워드는 동시성을 쓸 때 사용
- go 언어의 동시성은 OS 스레드를 한 층 더 추상화한 co-routine이고 비동기적 프로그래밍이 가능
- go 에서는 go-routine이라고 부른다.
- 멀티-스레딩을 활용할 때 유용한데
- 스레드에 자원을 배분하거나 스레드 자체에 대해 간섭하는 것은 go-runtime이 알아서 해준다.
아래 코드를 실행하게 되면 숫자, 문자가 번갈아서 무작위의 순서를 가지고 출력되는것이다.
아래 코드에서 sync.WaitGroup을 사용하는데, main() 함수 또한 고루틴이고 만약 다른 고루틴보다 main() 고루틴이 먼저 끝나면 프로그램 자체가 종료되어 이를 사용한 것이다.
결론은 동시성을 위해서 go 키워드를 사용
동시성 소개
왜 동시성 프로그래밍이 필요한가? 동시성 프로그래밍은 최근 인기있는 주제입니다. 동시성 프로그래밍이 새롭게 등장한 개념도 아닌데 왜 인기를 끄는 것일까요? 무어의 법칙;Moore's Law은 발열
velog.io
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
fmt.Println(i)
time.Sleep(time.Second)
}
}()
wg.Add(1)
go func() {
defer wg.Done()
for _, byte := range "Hello, Go!" {
fmt.Printf("%c\n", byte)
time.Sleep(time.Second)
}
}()
wg.Wait()
fmt.Println("Goodbye")
}
// result
H
0
1
e
....
o
8
9
!
Goodbye
패키지(package, import)
- 모든 Go 코드는 특정 패키지에 포함되어야 함.
- 특수 패키지인 main을 제외하고 모두 일반적인 패키지
아래 코드는 main 패키지에 소속되어 있음을 나타냄
특수패키지인 main은 프로그램의 메인 코드인 main() 함수가 정의되어 있고 실행가능한 패키지임을 의미
패키지는 다른 코드에 의해 포함되는 용도로 존재 x
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
// Hello, Go!
'MadApp' 카테고리의 다른 글
(GolangPractice Day3) OJT 2021-12-13 KJH (0) | 2022.03.13 |
---|---|
OJT 2022-03-04 (0) | 2022.03.13 |
OJT 2022-02-21 (0) | 2022.03.13 |
OJT 2021-12-29 (0) | 2022.03.13 |
(GolangPractice Day1) OJT 2021-12-09 KJH (0) | 2022.03.13 |