Go 언어를 배우기 위해서 1부터 ~52까지 진행한 내용을 정리했었는데,
53부터 다시 시작을 해보려고 한다!

Interface

인터페이스는 메소드의 집합으로 정의된다.
메소드들의 구현되어 있는 타입의 값은 모두 인터페이스의 값이 될 수 있다.
이것은... 도대체 언제 쓰는것일까.. (나중에 생각해보기로... 일단 모르겠음)

package main

import (
    "fmt"
    "math"
)

type Abser interface {
    Abs() float64
}

func main() {
    var a Abser
    f := MyFloat(-math.Sqrt2)
    v := Vertex{3, 4}

    a = f  // a MyFloat implements Abser
    a = &v // a *Vertex implements Abser
    a = v  // a Vertex, does NOT
    // implement Abser

    fmt.Println(a.Abs())
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

인터페이스의 메소드들을 구현하면 인터페이스를 구현하게 됩니다?
이를 위해 명시적으로 선언할 게 없습니다.
암시적 인터페이스는 인터페이스를 정의한 패키지로부터 구현 패키지를 분리 (decouple)해 줍니다.
다른 의존성 또한 없음은 물론이다? 이게 무슨 번역기 돌려놔서 무슨말인지 모르겠네...
일단 나중에 필요하면 찾아보는 걸로 #54

Error

나의 메소드 Error로 구성된 내장 인터페이스 타입 Error에서 나왔다.

type error interface {
    Error() string
}

package main

import (
    "fmt"
    "time"
)

type MyError struct {
    When time.Time
    What string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("at %v, %s",
        e.When, e.What)
}

func run() error {
    return &MyError{
        time.Now(),
        "it didn't work",
    }
}

func main() {
    if err := run(); err != nil {
        fmt.Println(err)
    }
}

집중력이 매우 흐려지고 있다.
점점 상황이 되면 다시 찾아보자... 하는 마음이 생기기 시작한다.
집중하도록 한다.

웹 서버

드디어 나왔다. node.js를 할지 Go를 해볼지 고민했었던
웹 서버! 어떻게 동작할까?

package main

import (
    "fmt"
    "net/http"
)

type Hello struct{}

func (h Hello) ServeHTTP(
    w http.ResponseWriter,
    r *http.Request) {
    fmt.Fprint(w, "Hello!")
}

func main() {
    var h Hello
    http.ListenAndServe("localhost:4000", h)
}

http.Handler를 구현한 어떤 값을 사용하여 HTTP 요청(requests)을 제공한다.
위의 예제에서는 Hello라는 타입은 http.Handler를 구현한다.

파일을 생성하고 실행해보려고 하니... Go는 어떻게 파일을 만들고 실행하는지도 모른다.
중간에 뜬금없이만 Go를 실행하는 방법은 아래 설명

Go 실행하기 (뜬금없지만)

실행하는 방법 이 설치하는 페이지에 설명이 되어 있다.

$ cd $HOME/go/src/hello
$ go build

$ ./hello
hello, world

hello 안에는 *.go의 파일이 있어야 한다.
build하고 나면 마지막 디렉토리명으로 실행 파일이 생성된다.

HTTP Handler (HTTP 핸들러) 연습

#58 에서 HTTP 핸들러 연습을 하는데,
아니 배운게 없는데 갑자기 핸들러를 등록하라니.. 도전해보도록 한다.

package main

import (
    "net/http"
)

func main() {
    // your http.Handle calls here
    http.ListenAndServe("localhost:4000", nil)    
}

정답은 바로!

package main

import (
    "fmt"
    "net/http"
)

type String string

func (s String) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, s)
}

type Struct struct {
    Greeting string
    Punct string
    Who string
}

func (s *Struct) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, s.Greeting, s.Punct, s.Who)
}


func main() {
    http.Handle("/string", String("I'm a frayed knot."))
    http.Handle("/struct", &Struct{"Hello", ":", "Gophers!"})
    http.ListenAndServe("localhost:4000", nil)
}

정답은 이미 풀어놓은 사람의 소스를 가져왔다. 쉽다는데 아직은 어렵다.
이렇게 풀어서 코딩하는구나~ 라는 정도로만 이해하고 스킵! 받아들여~

Image

Pakcage Image는 Image 인터페이스를 정의한다.
자세한 내용은 다음을 참고하자
지금은 맛보기!

package main

import (
    "fmt"
    "image"
)

func main() {
    m := image.NewRGBA(image.Rect(0, 0, 100, 100))
    fmt.Println(m.Bounds())
    fmt.Println(m.At(0, 0).RGBA())
}

// 출력결과
(0,0)-(100,100)
0 0 0 0

속도가 점점 느려지고 있는데,
어떻게 한번에 이해하겠나?
다음은 Go 언어에서 동시성에 대한 내용이다.
잠시 쉬었다가 고고씽

+ Recent posts