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 언어에서 동시성에 대한 내용이다.
잠시 쉬었다가 고고씽
'Web 개발' 카테고리의 다른 글
jsconfig.json에 include를 추가해 VS Code에서 자동완성 (0) | 2020.02.16 |
---|---|
Go 언어로 Web Framework 시작해보기! 나의 선택은? (+Go 설치 및 환경설정) (2) | 2019.09.03 |
Go 언어 Web Framework 를 선택해보자, star가 가장 많은 웹프레임워크는? Echo, Gin, Chi? 당신의 선택은 무엇인가? (0) | 2019.08.31 |
Go 언어를 배워보자! (~72 끝까지 달려보자! 동시성(Concurrency)에 대한 내용) + 이후에 튜토리얼, 레퍼런스 등 참고하기 좋은 사이트 (0) | 2019.08.31 |
Go 언어를 배워보자! (~52까지 완료! 소요시간은 대략 1시간) (0) | 2019.08.31 |