슬라이스
- Go언어에서 제공하는 동적 배열.
- 길이가 요소 개수에 따라 자동으로 증가
슬라이스 선언
{}를 이용한 초기화
var slice1 = []int{1,2,3}
var slice2 = []int{1, 5:2, 10:3}
make()를 이용한 초기화
var slice = make([]int,3)
값추가
slice = append(slice, 3,4,5,6,7)
슬라이싱
배열의 일부를 집어내는 기능
유용한 슬라이싱 기능 활용
복제
package main
import "fmt"
func main() {
slice1 := []int{1, 2, 3, 4, 5}
slice2 := make([]int, 3, 10)
slice3 := make([]int, 10)
cnt1 := copy(slice2, slice1)
cnt2 := copy(slice3, slice1)
fmt.Println(cnt1, slice2)
fmt.Println(cnt2, slice3)
}
삭제
package main
import "fmt"
func main() {
slice := []int{1, 2, 3, 4, 5, 6}
idx := 2
for i := idx + 1; i < len(slice); i++ {
slice[i-1] = slice[i]
}
slice = slice[:len(slice)-1]
fmt.Println(slice)
}
메서드
- 메서드 선언
리시버를 func 키워드와 함수 이름 사이에 중괄호로 명시
func (r Rabbit) info() int {
return r.width * r.height
}
- 리시버 타입
- 매서드를 사용해야 하는 이유
> 결합도를 낮추고 응집도를 높여야 한다.
- 포인터 메서드 vs 값 타입 메서드
- 리시버: 메서드가 어느 구조체에 속하는지 표시, 메서드가 속하는 타입을 알려준다.
인터페이스
ㄴ인터페이스 정의
> 구현을 포함하지 않는 메서드 집합
ㄴ인터페이스 사용법
>
type DuckInterface interface {
Fly()
Walk(distance int ) int
}
> 1. 메서드는 반드시 메서드명이 있어야 한다.
> 2. 메서드 이름이 같을 수 없다.
> 3. 메서드 구현은 포함하지 않는다.
> 추상화 계층
ㄴ덕 타이핑이란 무엇인가
> 타입 선언 시 인터페이스 구현 여부를 명시적으로 나타낼 필요 없이 인터페이스에 정의한 메서드 포함 여부만으로 결정
ㄴ인터페이스 변환
함수 고급편
ㄴ 가변 인수 함수 : ...
ㄴ defer 지연 실행 : 바로 실행하지 않고, 해당 함수가 종료되기 직전에 실행
ㄴ 함수 타입 변수
ㄴ 함수 리터럴
자료구조
ㄴ 데이터를 저장하는 구조
ㄴ 배열, 슬라이스
ㄴ 리스트: 비연속 메모리를 사용해 요소를 저장.
ㄴ 큐: FIFO
ㄴ 스택: FILO
ㄴ 링: 처음과 끝이 연결된 리스트로 크기가 고정된 구조
ㄴ 맵: 키와 값 형태로 자료가 저장되는 자료 구조
리스트
package main
import (
"container/list"
"fmt"
)
func main() {
v := list.New() // 새로운 리스트 생성
e4 := v.PushBack(4) //리스트 뒤에 요소 추가
e1 := v.PushFront(1) // 리스트 앞에 요소 추가
v.InsertBefore(3, e4)
v.InsertAfter(2, e1)
for e := v.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, " ")
}
fmt.Println()
for e := v.Back(); e != nil; e = e.Prev() {
fmt.Print(e.Value, " ")
}
}
배열 vs 리스트
맨 앞에 데이터 추가
- 배열 : 각 요소를 한 칸씩 뒤로 밀어 낸다.
- 리스트 : 밀어냄 없음
특정 요소 접근하기
-배열 : 배열 시작 주소 + 인텍스 X 타입크기
-리스트 : 포인터로 연결되어 있기 때문에 앞 요소들을 모두 거쳐야 접근 가능
링
- 실행 취소 기능: 문서 편집기 등에서 일정한 개수의 명령을 저장하고 실행 취소하는 경우
- 고정 크기 버퍼 기능
- 리플레이 기능
맵
- 키와 값의 쌍으로 데이터를 저장한다.
package main
import "fmt"
func main() {
m := make(map[string]string) // 맵 생성
m["이화랑"] = "서울시 광진구 " // 키와 값 추가
m["송하나"] = "서울시 강남구 "
m["백두산"] = "부산시 사하구"
m["최번개"] = "전주시 덕진구"
m["최번개"] = "청주시 상당구 " // 값 변경
fmt.Printf("송하나의 주소는 %s입니다. \n", m["송하나"]) //값 출력
fmt.Printf("백두산의 주소는 %s입니다. \n", m["백두산"])
}
값타입
map[key]value
키타입
맵 순회
for k, v := range m {
fmt.Println(k, v)
}
맵 요소 삭제
delete() 함수로 요소를 삭제 한다.
요소를 조회할 때 키에 알맞는 요소가 없으면 값 타입의 기본값을 반환한다.
delete(m, key)
에러 핸들링
- 에러 반환
- 패닉
- 복구
고루틴과 동시성 프로그램밍
- 고루틴이란
고루틴은 Go 언어에서 관리하는 경량 스레드입니다.
함수나 명령을 동시에 수행할 때 사용합니다.
여러 고루틴을 갖는 프로그램을 코딩하는 것을 동시성 프로그래밍이라 한다.
- 컨텍스트 스위칭 : CPU 코어가 여러 스레드를 전환하면서 수행하면 더 많은 비용이 든다.
- 고루틴의 특징
- 동시성 프로그래밍 주의점
- 뮤텍스
채널과 컨텍스트
- 채널이란
고루틴간 메시지를 전달하는 메시지 큐
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go square(&wg, ch)
ch <- 9
wg.Wait()
}
func square(wg *sync.WaitGroup, ch chan int) {
n := <-ch
time.Sleep(time.Second)
fmt.Printf("Square: %d\n", n*n)
wg.Done()
}
- 생성자 소비자 패턴
- 컨텍스트
ㄴ 컨텍스트: 작업을 지시할 때 작업 가능 시간, 작업 취소 등의 조건을 지시할 수 있는 작업 명세서.
'코딩생활 > Golang' 카테고리의 다른 글
[Golang] Golang 기본 저장하기 (0) | 2021.05.19 |
---|