Go (by notepad) - HiroSung/Study GitHub Wiki

[Go Programming]
7/2. 804호 / 김병진.에듀앤택 강사

. 프로그래밍 언어론.
- 中 정적언어인 Go
- cf ) python : 동적언어. H/W가 좋기때문에 필요 데이터 출력이 빨라짐.

I. Go 언어 소개 및 환경
- https://golang.org/doc/
- Go 특성
. 컴파일 언어 > 컴파일(문법검사와 수행할 수 있는 전 단계까지 만들어주는) 프로그램이 별도로 필요함. 컴파일 하고 메모리에 올려서 수행.
. 시스템 프로그래밍을 위해 개발
. C++, Java, Python의 장점.
. GC 기능 제공
. 25개 키워드로 프로그래밍 가능.
. * CSP 스타일의 Concurrent 프로그래밍 지원… Thread 처리. 처리데이터 공유
- Go 설치 및 실행
. https://golang.org/dl/
. 1.10.3 : why? 첫번째는 주버전.서브버젼(기능추가).빌드버젼(툴.컴파일러로소스에 문제가 없을 경우 올림)
. …msi로 설치하면 좋지만 작업폴더도 만들고 ATOM 설치하여 사용하면 좋음.
. ATOM 설치 : https://atom.io/ (또는 Visual Studio Code도 가능)
https://git-scm.com/downloads 에서 git을 다운로드하여 설치하면
workspace 를 C:\goApp로 지정함
Go Programming에 연결될시 github를 사용할 수 있어 용이함.
cf) ATOM 사용방법 : https://seoulrain.net/2016/12/05/atomeditor/

. 수행방법
# go run test.go > 컴파일
# go build test.go > 빌드
. Workspace 폴더
. C:\GoApp 폴더로 정했다면 bin, src , pkg 폴더가 있어야 함.
- 프로그래밍의 저장소와 이름
. 변수
. GO는 메모리에 값을 저장하는 방식
. 메모리의 값을 저장하는 대표적인 이름 : 변수
. var로 선언
var a int
var f float32 = 11.
. 상수
. 한번 저장하면 변경 불가
. const 사용하여 선언
const C int = 10
const S string = “Hi”
. Go 키워드(예약어) – 교재 P51 참고

II. 데이터 타입과 문법
# Go 프로그래밍의 데이터 타입
- 정적PGM의 형식의 이상형!
. 정수
. 소수점
. 문
- 타입(형식)
. 참/거짓(Boolean) : bool (내부적으로는 숫자로 처리)
. 문자열 : string
. 정수형 타입 : 숫자 – int int8 int16 int32 int64 uint…
. 실수형 : 소수점 – float32 float64 complex64 complex128
. 기타 : byte (uint8과 동일. 데이터 주고 받고 파일 입출력시 사용), rune (int32와 동일)
# 문자열
- 문자열 리터럴
. 실제데이터
. Black Quote : ’’ – Raw String 그대로이 값
. Double Quote : "" – 복수 라인에 걸쳐 쓸 수 없음. 인용부호 안이 Escape 문자열 들은 특별한 이미로 해석. 문자열에 \n이 있으면 New Line으로 인식
# 형변환
- 데이터 타입의 변환
- 형의변황/형시변환
- 하나의 데이터 타입에서 다른 데이터 타입으로 변환하기 위해서는 T(v)와 같이 표현
. T는 변환하고자 하는 타입을 표시하고, v는 변환될 값을 지정한 것.
. Go에서 타입간 변환은 명시적으로 지정 *
. 명시적 지정이 없이 변환이 일어나면 런타임 에러가 발생
# 프로그래밍 연산자
- 데이터의 정제 작업 : 연산
- 산술연산자
- 관계연산자
- 논리연산자
- Bitwise연산자
. 비트단위 연산을 위해 사용. 바이너리 AND, OR, XOR와 바이너리 쉬프트 연산자
. & , | , ! , << , >>
- 할당 연산자
. 값을 할당하는 = 연산자 외에 사칙연산, 비트여난을 축약한 =, &=, <<= 같은 연산자
- 포인터 연산자 (함수 할때 사용)
. C
+와 같이 & 혹은 * 을 사용하여 해당 변수의 주소를 얻어내거나 이를 반대로 Dereference할 때 사용
. 포인터연산자를 제공하지만 포인터 산출 즉 포인터에 더하고 빼는 기능은 제공하지 않음.
# 프로그램의 제어 – 조건문
- 개발자 프로그램의 흐름을 제어
- if
. 반드시 조건 블럭 시작 브레이스({)를 if 문과 같은 라인
. 조건식은 반드시 Boolean 식으로 표현
- switch
. 여러 값을 비교해야 하는 경우
. 다수의 조건식을 체크해야 하는 경우
. switch문 뒤에 하나의 변수(혹은 Expression)를 지정
. case 문에 해당 변수가 가질 수 있는 값을 지정하여, 각 경우에 다른 문장 블럭들을 지정.
. switch 용법
- switch 뒤에 Expression이 없을 수 있음.
- case문에 Expression을 쓸 수 있음.
- No default fall through
- Type switch
# 프로그램의 제어 – 반복문
- 특정 코드를 반복할 경우
. for 구문이 일반적
. Go는 for 구문 하나만 존재
. “for 초기값; 조건식; 증감 {…}”의 형식 사용


package main

func main() {
sum := 0
for i := 1; i <= 100;i++ {
sum += 1
}

println(sum)
}


- for range 구문
. 컬렉션으로 부터 한 요소씩 가져와 차례로 for 블럭의 문잘들을 실행.
. foreach 비슷한 용법 for 인덱스, 요소값 := range 컬렉션" 같이 for 루프를 구성

name := []string{"홍길동", “이순신”, "강감찬"}
for index, name := range names {
println(index, name)
}

- 기타 제어문
. break
. continue
. goto : 최대한 자제해야 함.

- 실습
. 코딩시 중첩의 중첩은 지양해야 한다.

III. 함수와 컬렉션
1. 함수란?
– 여러 문장을 묶어서 실행하는 코드 블럭의 단위. func 키워드를 사용하여 정의
- func 뒤에 함수명을 적고 괄호()안에 그 함수에 전달하는 파라미터
– Pass By XXXXXX
. 파라미터를 전달하는 방식은 크게 Pass By Value와 Pass By Reference
. Pass By Value
+ 값 만 전달
+ 호출하기 전 함수의 값만 그대로 전달
+ 원본 함수의 값은 변경되지 않음.
. Pass By Reference
+ 참조 전달. 받을때는 *, 전달할때는 & 기호 사용.
+ 호출함수에서 값을 변경하면 원본 함수도 값이 변경됨.
package main

func main() {
msg := “Hello”
say(&msg)
println(msg) // 변경된 메시지 출력
}

func say(msg string) {
println(
msg)
*msg = “Changed” // 메시지 변경
}
- 가변인자 함수
* 고정된 수의 파라미터들을 전달하지 않고 다양한 숫자의 파라미터를 전달하고자 할 때
+ 가변 파라미터는 … 으로 표현
- 함수 리턴값
* 함수는 리턴값이 업을 수도, 리턴값이 하나 일 수도 또는 리턴값이 볼수 개일 가능성
- * 익명함수
* 함수명을 갖지 않는 함수를 익명함수(Anonymous Function)
*
main() {
sum := func( n …int) int {
s := 0
for _, i := range n {
s += i
}
turn s
}

s := sum(1, 2, 3, , 4, 5)
}
- 일급함수
* 함수의 입력 파라미터나 리턴 파라미터로서 함수 자체가 사용
* 함수를 다른 함수의 파라미터로 전달하는 방법

func main() {
//변수 add에 익명함수 할당
add := func(i int, j int) int {
return i + j
}

// add 함수 전달
r1 := calc(add, 10, 20)
println(r1) // 30

// 직접 첫번째 파라미터에 익명함수를 정의함
r2 := calc( func(x int, y int) int { return x – y}, 10, 20)
println(r2) // -10

}
func calc(f func(int, int) int, a int, b int) int {
result := f(a, b)
return result
}

- * type문을 사용한 함수 원형의 정의
* type문은 구조체(struct), 인터페이스 등 Custom Type(혹은 User Defined Tpye)을 정의하ㅣ 위해 사용
* 동시에 여러개의 함수를 수행하고자 하는 경우 수행함. (deligate! = 익명함수+일명함수)
// 원형 정의
type calculator func(int, int) int

// calculator 원형 사용
func calc(f calculator, a int, b int) int {
result := f(a, b)
return result
}

- * 클로저. 중첩함수
* 함수 바깥에 있는 변수를 참조하는 함수값
func nextValue() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
next := nextValue()
println(next()) // 1
println(next()) // 2

anotherNext = nextValue()
println(anotherNext()) // 1 부터 다시 시작
}

- 실습
* format string … 날자를 년/월/일 로 출력할때 사용함.

- 컬렉션
+ 배열
- 연속적인 메모리 공간에 동일한 타입의 데이터를 순서적으로 저장하는 자료 구조.
- 배열은 최대한 간단하게 구성.
var 변수명[배열크기] 데이터타입 // 배열크기 – indexer
- 배열의 초기화
var a1 = 3 int{1,2,3}
var a3 = […] int {1,2,3,4}
- 다차원 배열 : 3차원 까지 사용을 권장
var multiArray 345int //정의
multiArray012 = 10 // 사용
+ 슬라이스
- 일차원가변배열. 메모리 낭비가 될 수 있음.
- 배열은 고정된 배열크기 안에 동일한 타입의 데이터를 연속적으로 저장
- 배열의 크기를 동적으로 증가시키거나 부분을 발췌하는 등의 기능 (cf. linked Database 구조)

var a []int
a = []int{1,2,3}
a1 = 10

- 슬라이스 추가/병합/복사
+ copy(), append() 사용
+ Map
- Key와 Value의 구조 : 해시테이블(Hash table)
tickers := map[string]string{
GOOG”: “Google Inc”,
MSFT”: “Microsoft”,
“FB”: “Face Book”,
}

IV. 패키지와 구조체
1. 패키지
- 코드의 모듈화, 코드의 재사용 기능을 제공
- 라이브러리 패키지들은 GOROOT/pkg 안에 존재
- Main 패키지
+ main 이라고 명명된 패키지는 Go Compiler에 의해 특별하게 인식
+ 공유 라이브러리로 만들 때에는 , main 패키지나 main 함수를 사용해서는 불가
- Import
+ 복수 개일 경우 세미콜론(윈도우즈의 경우)을 사용하여 연결
- 패키지 init 함수/alias
+ 패키지 실행시 처음으로 호출되는 init() 함수
+ import시 alias 정의 가능
- 사용자 정의 패키지 생성 / Export
+
package testlib
import “fmt”

var pop = map[string]string // 필드. 패키지와 함수사이에 있기에 사용에 따라 변경 가능함. 자제해야 함.

func init() {
pop = make(map[string]string)
pop[“Adel”] = “Hello”
}

func getMusic(singer string) string {
return pop[singer]
}
2. 구조체
- 사용자 정의 데이터타입 만들때 사용
- 필드 데이터만을 가지며, (행위를 표현하는) 메서드는 없음. OOP을 공유의 방식으로 지원
- Method에서 다시 한번 설명 예정
- 구조체의 선언
type person struct {
name string
age int
}

func main() {
p := person{}

p.name = “Lee”
p.age = 10
}
- 객체의 생성
var p1 person
p1 = person{"bob", 20}
p2 := person{name:“Sean”, age:50}
- 객체 : 상속과 다양성 기능을 통해서 기능을 바꿀 수 있음. / 정보은닉 public, private, protected
- 생성자 함수
+ Constructor : 필드 전체가 사용되기 전에 초기화 되어야 하는 경우 사용.
+ 모든것을 갖고 수행되는 함수. 잘못 구성하면 처음 수행시 수행이 안될 수 있음. 필요할때만 사용하기를~
type dict struct {
data map[int]string
}

//생성자 함수 정의
func newDict() *dict {
d := dict{}
d.data = map[int]strig{}
return &d // 포인터 전달
}

func main() {
dic := newDict() // 생성자 호출
dic.data1 = “a”
}

2일차

V. 메서드와 인터페이스

VI. 에러처리와 지연 실행과 함수

VII. 동시성(thread) 및 루틴과 채널 (* 중요)

VIII. 파일 읽기/쓰기와 테스트 F/W(*중요)

⚠️ **GitHub.com Fallback** ⚠️