[Golang]Golang 기본 저장하기2

코딩생활/Golang

[Golang]Golang 기본 저장하기2

열렙생활 2021. 5. 25. 00:27
반응형

슬라이스
- 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