mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-23 17:41:41 +00:00
Complete Korean translation
This commit is contained in:
parent
c07cb9560c
commit
9b3ce954b1
@ -10,7 +10,7 @@ translators:
|
||||
lang: ko-kr
|
||||
---
|
||||
|
||||
Go는 일을 잘 끝낼 필요에 의해 만들어졌다. Go가 잘 알려진 최신의
|
||||
Go는 어떤 일을 잘 끝낼 수 있도록 하기위해 만들어졌다. Go가 잘 알려진 최신의
|
||||
트렌드는 아니지만, 실세계의 문제들을 해결하기 위해서는 가장
|
||||
새롭고 빠른 방법이다.
|
||||
|
||||
@ -27,21 +27,21 @@ Go는 정적 타이핑(static typing)의 명령형 언어들(imperative language
|
||||
/* 여러 줄
|
||||
주석 */
|
||||
|
||||
// 모든 Go 소스 파일은 `package`로 시작한다.
|
||||
// 패키지 이름 중 `main`은 라이브러리가 아닌 실행파일을 선언하는 특별한 이름이다.
|
||||
// 모든 Go 소스 파일은 package로 시작한다.
|
||||
// 패키지 이름 중 main은 라이브러리가 아닌 실행파일을 선언하는 특별한 이름이다.
|
||||
package main
|
||||
|
||||
// `import`는 이 Go 소스 파일 내에서 참조하는 라이브러리 패키지들을 선언한다.
|
||||
// import는 이 Go 소스 파일 내에서 참조하는 라이브러리 패키지들을 선언한다.
|
||||
import (
|
||||
"fmt" // Go 표준 라이브러리에 있는 패키지
|
||||
"net/http" // 표준 라이브러리에는 웹 서버 패키지도 있다! (클라이언트도 있음)
|
||||
"strconv" // 문자열 변환 패키지
|
||||
)
|
||||
|
||||
// 함수 선언. `main`은 실행 프로그램에서 시작점이 되는 특별한 함수다.
|
||||
// 함수 선언. main은 실행 프로그램에서 시작점이 되는 특별한 함수다.
|
||||
// 중괄호를 사용한다.
|
||||
func main() {
|
||||
// `Println`은 표준 출력으로 개행을 출력한다.
|
||||
// Println은 표준 출력으로 개행을 출력한다.
|
||||
// fmt 패키지를 통해 이용할 수 있다.
|
||||
fmt.Println("Hello world!")
|
||||
|
||||
@ -53,7 +53,7 @@ func main() {
|
||||
func beyondHello() {
|
||||
var x int // 변수 선언. 변수는 사용하기 전에 선언해야 한다.
|
||||
x = 3 // 변수에 값 할당.
|
||||
// 짧은 선언(short declaration)으로 `:=` 를 사용하는데,
|
||||
// 짧은 선언(short declaration)으로 := 를 사용하는데,
|
||||
// 이렇게 값을 할당하면 값의 타입에 따라 변수의 타입이 결정된다.
|
||||
y := 4
|
||||
sum, prod := learnMultiple(x, y) // 함수는 두 개 이상의 리턴 값을 줄 수 있다.
|
||||
@ -117,16 +117,16 @@ func learnTypes() {
|
||||
|
||||
// Go는 가비지 컬렉션 기능을 JVM 같은 곳이 아닌 실행파일 런타임에 포함하고 있다.
|
||||
// 그리고 포인터는 있지만, 포인터 연산(*p++ 같은)은 없다.
|
||||
// 그래서 `nil` 포인터 접근같은 것 때문에 실수를 할 수는 있지만
|
||||
// 그래서 nil 포인터 접근같은 것 때문에 실수를 할 수는 있지만
|
||||
// 포인터 연산으로 인한 실수는 없게 된다.
|
||||
func learnMemory() (p, q *int) {
|
||||
// 지명된 리턴 값(named return value)인 p와 q는 int에 대한 포인터 타입이다.
|
||||
p = new(int) // 내장함수인 `new`는 메모리를 할당해준다.
|
||||
// 메모리 할당된 int는 0으로 초기화 되고, p는 이제 `nil`이 아니다.
|
||||
p = new(int) // 내장함수인 new는 메모리를 할당해준다.
|
||||
// 메모리 할당된 int는 0으로 초기화 되고, p는 이제 nil이 아니다.
|
||||
s := make([]int, 20) // 메모리의 단일 블록으로 20개의 int 공간을 할당한다.
|
||||
s[3] = 7 // 그중 하나에 값을 준다.
|
||||
r := -2 // 또다른 로컬 변수를 선언한다.
|
||||
return &s[3], &r // `&`는 어떤 대상체의 메모리 주소를 가져오게 된다.
|
||||
return &s[3], &r // &는 어떤 대상체의 메모리 주소를 가져오게 된다.
|
||||
}
|
||||
|
||||
func expensiveComputation() int {
|
||||
@ -134,40 +134,40 @@ func expensiveComputation() int {
|
||||
}
|
||||
|
||||
func learnFlowControl() {
|
||||
// `if`문에 중괄호는 필요하지만, 조건이 들어갈 곳에 소괄호는 쓰지 않는다.
|
||||
// if문에 중괄호는 필요하지만, 조건이 들어갈 곳에 소괄호는 쓰지 않는다.
|
||||
if true {
|
||||
fmt.Println("told ya")
|
||||
}
|
||||
// 모든 Go 소스의 코드 포맷팅은 `go fmt` 커맨드라인 명령으로 규격을 맞춘다.
|
||||
// 모든 Go 소스의 코드 포맷팅은 "go fmt" 커맨드라인 명령으로 소스코드의 포맷을 맞춘다.
|
||||
if false {
|
||||
// pout
|
||||
} else {
|
||||
// gloat
|
||||
}
|
||||
// if-else 체인 형태보다 `switch` 사용이 권장된다.
|
||||
// if-else 체인 형태보다 switch 사용이 권장된다.
|
||||
x := 1
|
||||
switch x {
|
||||
case 0:
|
||||
case 1:
|
||||
// case 안에서는 `break`가 없어도 자동으로 다음 case로 내려가지 않는다.
|
||||
// 자동으로 내려가게 하려면 `fallthrough` 키워드를 사용한다.
|
||||
// case 안에서는 break가 없어도 자동으로 다음 case로 내려가지 않는다.
|
||||
// 자동으로 내려가게 하려면 fallthrough 키워드를 사용한다.
|
||||
case 2:
|
||||
// x는 1이므로 여기는 실행되지 않음.
|
||||
}
|
||||
// `if`에서처럼 `for`에서도 양쪽에 소괄호를 쓰지 않는다.
|
||||
for x := 0; x < 3; x++ { // `++`은 실행을 제어하는 하나의 구문(statement)이다.
|
||||
// if 에서처럼 for 에서도 양쪽에 소괄호를 쓰지 않는다.
|
||||
for x := 0; x < 3; x++ { // ++ 은 실행을 제어하는 하나의 구문(statement)이다.
|
||||
fmt.Println("iteration", x)
|
||||
}
|
||||
// 여기서 x는 1이다. 위 for에서 x는 for 안의 블록 범위에 있기 때문.
|
||||
|
||||
// For is the only loop statement in Go, but it has alternate forms.
|
||||
// `for`는 Go에서 유일한 루프 구문이지만 다양한 형태로 조건을 주거나 while
|
||||
// for 는 Go에서 유일한 루프 구문이지만 다양한 형태로 조건을 주거나 while
|
||||
// 처럼 쓸 수도 있다.
|
||||
for { // 무한루프
|
||||
break // 여기서 곧바로 break를 한 건 단지
|
||||
continue // break, continue를 루프 안에서 쓸 수 있다는 것을 보여주기 위함.
|
||||
}
|
||||
// `for`에서처럼 `if`에서 `:=`를 사용하는 것은 y에 먼저 값을 대입하고,
|
||||
// for 에서처럼 if 에서 := 를 사용하는것은 y에 먼저 값을 대입하고,
|
||||
// 그리고 y > x를 검사한다는 의미.
|
||||
if y := expensiveComputation(); y > x {
|
||||
x = y
|
||||
@ -177,7 +177,7 @@ func learnFlowControl() {
|
||||
return x > 100 // 위 switch 문 바로 위에 있는 x를 참조한다.
|
||||
}
|
||||
fmt.Println("xBig:", xBig()) // true (x에 1e6를 대입했었다.)
|
||||
x /= 1e5 // x는 10이 된다.
|
||||
x /= 1e5 // x는 10이 된다.
|
||||
fmt.Println("xBig:", xBig()) // 이제 xBig()의 결과는 false가 된다.
|
||||
|
||||
// `goto`가 필요하다면, 좋아하게 될지도...
|
||||
@ -197,7 +197,6 @@ type pair struct {
|
||||
x, y int
|
||||
}
|
||||
|
||||
// Define a method on type pair. Pair now implements Stringer.
|
||||
// pair 타입에 메서드 String을 정의하자.
|
||||
// 이제 pair는 Stringer 인터페이스를 구현(implement)한 것이 되었다.
|
||||
func (p pair) String() string { // 여기서 p는 리시버(receiver)라고 부른다.
|
||||
@ -232,7 +231,6 @@ func learnErrorHandling() {
|
||||
} else {
|
||||
fmt.Print(x) // 만일 1이 map에 있었다면 x는 키 1의 값이 들어가게 된다.
|
||||
}
|
||||
// An error value communicates not just "ok" but more about the problem.
|
||||
|
||||
// Go에서는 함수가 복수 개의 리턴 값을 줄 수 있다는 점을 활용해 함수의 두 번째 리턴
|
||||
// 값으로 error를 리턴해주고 그 error가 nil 인지 아닌지 확인하는 관례가 있다.
|
||||
@ -251,40 +249,40 @@ func inc(i int, c chan int) {
|
||||
c <- i + 1 // 채널이 <- 이 연산자 왼쪽에 온다면 그 채널로 데이터를 보낸다는 의미다.
|
||||
}
|
||||
|
||||
// We'll use inc to increment some numbers concurrently.
|
||||
// 우리는 어떤 숫자들을 동시에 증가시키기 위해 inc 함수를 사용할 것이다.
|
||||
func learnConcurrency() {
|
||||
// Same make function used earlier to make a slice. Make allocates and
|
||||
// initializes slices, maps, and channels.
|
||||
// make는 slice, map, channel 타입들에 대해 메모리를 할당하고 초기화를 한다.
|
||||
// Go에는 메모리 할당 방법으로 new와 make가 있다.
|
||||
c := make(chan int)
|
||||
// Start three concurrent goroutines. Numbers will be incremented
|
||||
// concurrently, perhaps in parallel if the machine is capable and
|
||||
// properly configured. All three send to the same channel.
|
||||
go inc(0, c) // go is a statement that starts a new goroutine.
|
||||
// 3개의 동시에 실행되는 goroutine를 시작한다. 만약 실행하고 있는 머신이
|
||||
// 멀티코어 CPU를 가지고 있고 올바르게 설정되어(GOMAXPROCS) 있다면
|
||||
// 숫자가 정말로 병렬적으로 증가하게 될 것이다.
|
||||
go inc(0, c) // go는 새로운 goroutine을 시작하는 구문이다.
|
||||
go inc(10, c)
|
||||
go inc(-805, c)
|
||||
// Read three results from the channel and print them out.
|
||||
// There is no telling in what order the results will arrive!
|
||||
fmt.Println(<-c, <-c, <-c) // channel on right, <- is "receive" operator.
|
||||
// 채널로부터 3개의 결과를 읽어 출력한다.
|
||||
// 결과가 어떤 순서로 오는지는 알 수 없다.
|
||||
fmt.Println(<-c, <-c, <-c) // 채널이 <- 연산자 오른쪽에 있는 건, 채널로부터 데이터를 받는 연산이다.
|
||||
|
||||
cs := make(chan string) // another channel, this one handles strings.
|
||||
cc := make(chan chan string) // a channel of string channels.
|
||||
go func() { c <- 84 }() // start a new goroutine just to send a value
|
||||
go func() { cs <- "wordy" }() // again, for cs this time
|
||||
// Select has syntax like a switch statement but each case involves
|
||||
// a channel operation. It selects a case at random out of the cases
|
||||
// that are ready to communicate.
|
||||
cs := make(chan string) // string을 다루는 또 다른 채널
|
||||
cc := make(chan chan string) // string 채널의 채널
|
||||
go func() { c <- 84 }() // c 채널로 값을 보내는 goroutine 시작.
|
||||
go func() { cs <- "wordy" }() // cs 채널로 값을 보내느 goroutine 시작.
|
||||
// select 구문은 switch 문과 비슷하지만, case에서 채널 연산에 관한 일을 한다.
|
||||
// select의 case들은 채널통신을 할 준비가 된 case 하나가 무작위로 선택되어
|
||||
// 그 부분이 실행된다.
|
||||
select {
|
||||
case i := <-c: // the value received can be assigned to a variable
|
||||
case i := <-c: // 채널로부터 받아진 값은 변수에 대입할 수 있다.
|
||||
fmt.Printf("it's a %T", i)
|
||||
case <-cs: // or the value received can be discarded
|
||||
case <-cs: // 또는 받은 값을 그냥 버릴 수도 있다.
|
||||
fmt.Println("it's a string")
|
||||
case <-cc: // empty channel, not ready for communication.
|
||||
case <-cc: // 통신할 준비가 되어 있지 않은 비어있는 채널.
|
||||
fmt.Println("didn't happen.")
|
||||
}
|
||||
// At this point a value was taken from either c or cs. One of the two
|
||||
// goroutines started above has completed, the other will remain blocked.
|
||||
// 여기서는 c나 cs 채널로부터 값 하나를 받을 수 있다. 위에서 실행한 두 개의
|
||||
// goroutine 중 하나가 완료되면 다른 하나는 블락된 상태로 있게 된다.
|
||||
|
||||
learnWebProgramming() // Go does it. You want to do it too.
|
||||
learnWebProgramming() // Go에서는 웹 서버쪽 개발도 쉽게 할 수 있다.
|
||||
}
|
||||
|
||||
// http 패키지의 함수 하나로 웹 서버를 실행시킨다.
|
||||
@ -304,15 +302,13 @@ func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
## 더 읽어볼 것들
|
||||
|
||||
The root of all things Go is the [official Go web site](http://golang.org/).
|
||||
There you can follow the tutorial, play interactively, and read lots.
|
||||
Go에 대한 모든 것들은 [Go 공식 웹 사이트](http://golang.org/)를 참고하자.
|
||||
여기에는 따라해볼 튜토리얼, 웹 기반의 인터랙티브 실행환경과 많은 읽을거리들이 있다.
|
||||
|
||||
The language definition itself is highly recommended. It's easy to read
|
||||
and amazingly short (as language definitions go these days.)
|
||||
|
||||
On the reading list for students of Go is the [source code to the standard
|
||||
library](http://golang.org/src/pkg/). Comprehensively documented, it
|
||||
demonstrates the best of readable and understandable Go, Go style, and Go
|
||||
idioms. Or you can click on a function name in [the
|
||||
documentation](http://golang.org/pkg/) and the source code comes up!
|
||||
Go 언어 자체에 대한 스펙도 읽어보기를 적극 추천한다. 읽기 쉽게 되어있고
|
||||
그리 길지는 않다.
|
||||
|
||||
Go 소스코드에 대해 좀더 알아보고 싶다면 [Go 표준 라이브러리](http://golang.org/src/pkg/)를
|
||||
분석해보기 바란다. 이해하기 쉽게 문서화되어 있고, Go 스타일 그리고 Go에서의
|
||||
관례 배우기에 가장 좋은 방법일 것이다. 또는 [문서](http://golang.org/pkg/) 안에서
|
||||
함수 이름 하나를 클릭해보면 소스코드를 브라우저에서 살펴볼 수도 있다.
|
||||
|
Loading…
Reference in New Issue
Block a user