Presentation is loading. Please wait.

Presentation is loading. Please wait.

Go by Example Closures ~ Errors 2015-03-30, Sam Jo.

Similar presentations


Presentation on theme: "Go by Example Closures ~ Errors 2015-03-30, Sam Jo."— Presentation transcript:

1 Go by Example Closures ~ Errors 2015-03-30, Sam Jo

2 내용 Closures Recursion Pointers Structs Methods Interfaces Errors

3 Closures A closure is a function together with a referencing environment for the non-local variables of that function. 클로져는 그 함수의 지역 변수가 아닌 것들을 위한 참조 환경을 함 께 가지고 있는 함수이다. – By Wikipedia ??????????

4 Closures in JavaScript function ini() { var name = "Mozilla"; function displayName() { alert(name); } displayName(); } ini(); function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName; } var myFunc = makeFunc(); myFunc();

5 Closures in Go func ini() { name := "Mozilla“ displayName := func() { fmt.Println(name) } displayName() } func makeFunc() func() { name := "Mozilla" displayName := func() { fmt.Println(name) } return displayName; } myFunc := makeFunc() myFunc()

6 Closures func get5Adder() func() { sum := 0 return func() { sum += 5 fmt.Println(sum) } fiveAdder := get5Adder() fiveAdder() Closure 안에서 외부 변수의 값을 변경 가능하다 ! 그 값은 계속 유지된다 ! <- 5 <- 10

7 Closures - Exercise 피보나치 수열을 출력해보자 ! func fiboSeq() func() int { …. return func() int { …. }

8 Closures - Solution func fiboSeq() func() int { a, b := 0, 1 return func() int { a, b = b, a + b return a } func main() { fun := fiboSeq() for i := 0; i < 10; i++ { fmt.Println(fun()) }

9 Recursion func fact(n int) int { if n == 0 { return 1 } return n * fact(n-1) }

10 Pointer A pointer is a programming language object, whose value refers to (or "points to") another value stored elsewhere in the computer memory using its address. 다른 값의 메모리 주소를 가리키는 오브젝트 – By Wikipedia C/C++ 에서 나오는 그 포인터 NO Pointer Arithmetic

11 C 랑 비슷한 문법 *int * 을 붙이면 포인터 타입 *iptr = 해당 메모리 주소에 값 대입 &i i 의 메모리 주소 func zeroval(ival int) { ival = 0 } func zeroptr(iptr *int) { *iptr = 0 } i := 1 fmt.Println("initial:", i) zeroval(i) fmt.Println("zeroval:", i) zeroptr(&i) fmt.Println("zeroptr:", i) fmt.Println("pointer:", &i)

12 Structs type Animal struct { age int name string } p := Animal{8, “ 냥이 ”} p := Animal{age: 8} p := Animal{} fmt.Println(p.X) C 의 바로 그거, mutable 하다. <- 이렇게 선언해주면 된다. <- 이렇게 객체를 만들면 된다. ( 생략된 field 는 0, false, nil) <- 이렇게 값에 접근하면 된다.

13 Structs + Pointers ani := Animal{8, “ 냥이 “} ani.age = 4 aniP := &ani aniP.age = 8 fmt.Println(ani) <- struct 변수 앞에 & 을 붙여서 포인터 <- struct 변수와 포인터 모두.(dot) 을 이 용하여 내용에 접근 (C 와 다름 )

14 Methods func (a *Animal) fakeAge() int { return a.age * 2 } func (a Animal) kill() { a.age = -1 } fmt.Println(ani.fakeAge()) ani.kill(); fmt.Println(ani) fmt.Println(aniP.fakeAge()) aniP.kill(); fmt.Println(aniP) func (p type) name() ret_type { … } 와 같이 선언 type 또는 *type 둘 중에 하나만 선언해도 자동으로 처리 ( 그리고 하나만 선언해야 한다 ) https://golang.org/doc/faq#methods_on_values_or_pointers <- 이 코드의 결과는 ?

15 Methods - Result fmt.Println(ani.fakeAge()) ani.kill(); fmt.Println(ani) fmt.Println(aniP.fakeAge()) aniP.kill(); fmt.Println(aniP) func (a *Animal) kill() { a.age = -1 } 16 {8 냥이 } 16 &{8 냥이 } <- 이렇게 바꾸면 잘 됩니당

16 Interfaces type name interface { method_name() ret_type } type t struct implement name { } <- 이렇게 선언하면 된다. <- 이렇게 쓰는거 아닙니다. 모든 method 를 구현하기만 하면 됩니다.

17 Interfaces – Examples https://gobyexample.com/interfaces https://tour.golang.org/methods/4 More Detail: http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-gohttp://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go

18 Errors Go 는 기본적으로 try/catch/finally 같은 것을 지원하지 않음 ( 그래서 이걸 만든 사람이 있음 https://github.com/manucorporat/try)https://github.com/manucorporat/try -“In Go it’s idiomatic to communicate errors via an explicit, separate return value.” Convention 에 의하면 error object 는 기본 interface 인 error type 을 가져야 하며, 가장 마지막 반환 값에 위치합니다.

19 Errors - Default func f1(arg int) (int, error) { if arg == 42 { return -1, errors.New(“42!") } return arg + 3, nil } <- error 는 가장 마지막에 위치 <- errors.New 는 error object 생성 <- nil 은 오류가 없음을 표시

20 Errors - Custom type argError struct { arg int prob string } func (e *argError) Error() string { return fmt.Sprintf("%d - %s", e.arg, e.prob) } func f2(arg int) (int, error) { if arg == 42 { return -1, &argError{arg, "can't work with it"} } return arg + 3, nil } Error interface 는 다음과 같다. type error interface { Error() string } 즉, Error() 만 구현하면 된다 ! - 오류가 발생했을 때 오류 정보를 string 으 로 만들기 위해 호출되는 함수 Error 도 struct 이므로 struct 생성 방법 과 똑같이 만들면 된다.

21 Errors – How to Use? for _, i := range []int{7, 42} { if r, e := f2(i); e != nil { fmt.Println("f2 failed:", e) } else { fmt.Println("f2 worked:", r) } 딱히 설명이 필요 없다.

22 Interfaces, Errors - Exercise https://tour.golang.org/methods/16 https://tour.golang.org/methods/9

23 Interfaces, Errors – Solution 1 func (i Image) Bounds() image.Rectangle { return image.Rect(0, 0, 256, 256) } func (i Image) ColorModel() color.Model { return color.RGBAModel } func (i Image) At(x, y int) color.Color { return color.RGBA{uint8(x + y), uint8(x - y), 255, 255} }

24 Interfaces, Errors – Solution 2 type ErrNegativeSqrt float64 func (e ErrNegativeSqrt) Error() string { return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e)) } func Sqrt(x float64) (float64, error) { if (x < 0) { return -1, ErrNegativeSqrt(x) } return math.Sqrt(x), nil }

25 끝 – 감사합니다.


Download ppt "Go by Example Closures ~ Errors 2015-03-30, Sam Jo."

Similar presentations


Ads by Google