Golang
-
[Go] Printf 와 Println 함수 차이Golang 2021. 12. 7. 03:20
Printf 함수 package main import "fmt" func main() { fmt.Printf("Go!") } 포맷 지정자를 이용하여 개발자가 원하는 형태로 출력하는 함수 %t : bool %b : 2진수 %c : 문자 %d : 10진수 %o : 8진수 %x : 16진수, a~f %X : 16진수, A~F %f : 고정소수점 %F : 고정소수점 %e : 지수 표현, e %E : 지수 표현, E %g : 간단한 실수 표현 %G : 간단한 실수 표현 %s : 문자열 %p : 포인터 %U : 유니코드 %T : 타입 %v : 모든 형식 %#v : 형식을 구분할 수 있게 개행을 자동으로 추가하지 않음. Println 함수 package main import "fmt" func main() { fm..
-
[Go] The Go Programming Language #6-6: 캡슐화Golang 2021. 12. 2. 02:13
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다. 6.6 캡슐화 캡슐화는 정보 은닉으로도 불리며, 객체지향 프로그래밍의 핵심 요소다. Go의 캡슐화는 아주 간단함. 메소드나 필드 이름이 소문자이면 패키지 외부에서 접근할 수 없음. 하지만 대문자로 시작하면 가능함. 같은 패키지 내에서는 접근이 가능함. 이처럼 Go에서 캡슐화의 단위는 타 언어에서처럼 타입이 아닌 패키지임. 패키지 멤버에 대한 접근 제한 기준은 구조체의 필드나 타입의 메소드에도 적용되며, 결과적으로 객체를 캡슐화하려면 구조체로 만들어야 함. type IntSet struct { // 필드 이름을 소문자로 하여 첫 스코프를 같은 패키지 내로 닫음. w**ords []uint64** } // 구조체..
-
[Go] The Go Programming Language #6-4: 메소드 값과 표현식Golang 2021. 12. 2. 02:12
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다. 6.4 메소드 값과 표현식 메소드 값 p.Distance()와 같은 하나의 표현식은 두 작업으로 구분할 수도 있음. p := Point{1, 2} q := Point{4, 6} **distanceFormP := p.Distance** // 메소드 값 fmt.Println(distanceFormP(q)) // "5" scaleP := p.ScaleBy // 메소드 값 scaleP(2) // p는 (2, 4) scaleP(3) // 이후 (6, 12) 셀렉터 p.Distance는 메소드(Point.Distance)를 특정 리시버 p와 결합하는 함수인 메소드 값을 산출함. 이 함수는 리시버 값 없이 인자만으로도 호..
-
[Go] The Go Programming Language #6-3: 내장 구조체를 통한 타입 조합Golang 2021. 12. 2. 02:12
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다. 6.3 내장 구조체를 통한 타입 조합 내장 구조체란? type Point struct{ X, Y float64 } type ColoredPoint struct { Point Color color.RGBA } var cp ColoredPoint **cp.X = 1** fmt.Println(cp.Point.X) // "1" **cp.Point.Y = 2** fmt.Println(cp.Y) // "2" 내장을 통해 단축 문법으로 Point의 모든 필드와 추가 필드를 갖는 ColoredPoint를 정의할 수 있음. ColoredPoint의 필드 중 내장된 Point에서 추가된 필드를 Point에 대한 언급 없이 선택..
-
[Go] The Go Programming Language #6-2: 포인터 수신자가 있는 메소드Golang 2021. 12. 2. 02:12
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다. 6.2 포인터 수신자가 있는 메소드 6.1 에서 나오는 Receiver는 각 인자 값의 복사본이 생성되는 "Value Receiver"이며, 이번 장에서 다룰 내용은 변수의 주소를 전달하는 "Point Receiver"에 대해 알아본다. 사용되는 경우 함수에서 변수의 값을 변경해야 하는 경우 ⇒ Value Receiver 는 값이 변경되지 않음! 인자가 커서 가급적 복사하고 싶지 않은 경우 Point Receiver 선언법 type Vertex struct { x, y int } **func (v *Vertex) sum() int {** return v.x + v.y } func main() { **v := ..
-
[Go] The Go Programming Language #6-1: 메소드 선언Golang 2021. 12. 2. 02:12
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다. 6.1 메소드 선언 Go는 객체지향 프로그래밍 언어이다. Go에서의 메소드란? // 예1) 표준 라이브러리의 메소드 사용 : time.Duration의 Seconds 메소드 const day = 24 *time.Hour fmt.Println(day.Seconds()) // "86400" // 예2) Celsius 타입의 String 메소드를 직접 정의 func (c Celsius) String() string { return fmt.Sprintf("%g℃", c) } // 예3) 배열 타입의 perim 메소드 직접 정의 perim := Path{ {1, 1} {5, 4} } fmt.Println(perim.D..
-
[Go] The Go Programming Language #5-10: 복구Golang 2021. 12. 1. 04:31
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다. 5.10 복구 recover 함수 func f() { **defer func() { s := recover()** // recover 함수로 런타임 에러(패닉) 상황을 복구 **fmt.Println(s) }()** a := [...]int{1, 2} // 정수가 2개 저장된 배열 **for i := 0; i < 5; i++** { // 배열 크기를 벗어난 접근 **fmt.Println(a[i]) }** } func main() { f() **fmt.Println("Hello, world!")** // 런타임 에러가 발생했지만 recover 함수로 복구되었기 때문에 이 부분은 정상적으로 실행됨. } /* 출력 ..
-
[Go] The Go Programming Language #5-9: 패닉Golang 2021. 12. 1. 04:31
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다. 5.9 패닉 실행 흐름 : 에러 발생 → 패닉 발생 → defer → recover → 에러 처리 Go 런타임이 프로그램 실행 시 문제(배열 범위 밖을 참조하거나 nil 포인터를 참조하는 등)를 발견했을 때, 에러가 발생한 뒤 종료되는 상황을 말함. 보통 패닉 상황에서는 정상 실행이 중단되고 고루틴에 있는 모든 연기된 함수가 호출되며, 프로그램이 로그 메시지와 함께 비정상 종료됨. func main() { f(3) } func f(x int) { fmt.Printf("f(%d)\n", x+0/x) // x == 0이면 패닉 defer fmt.Printf("defer %d\n", x) f(x - 1) } /* ..