✅ 포스트 목차 ✅
➡️ Go를 향한 여행 여기서 공부중
(1) 인자가 없는 return 문 = 'naked' return.
이름이 주어진 값을 반환한다.
(2) 함수 내에서는 := 라는 짧은 변수 선언이 가능
e.g. ) c,python,java := true,false,"no"
(3) 기본 자료형
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8의 별칭
rune // int32의 별칭
// 유니코드에서 code point를 의미합니다.
float32 float64
complex64 complex128
특정한 이유로 크기를 정해야하거나,
unsigned 정수 type을 사용해야하는 게 아니라면
int 사용
(4) zero value
숫자 = 0, boolean = false, string = ""
(1) for
sum := 0
for i:=0; i<10; i++ {
sum+=i
}
i:=0 초기화 구문
✔️ i<10 조건 표현 << 필수
i++ 사후 구문
// ;를 생략할 수 있기에 while문 = go에서 for문
sum :=1
for sum<1000{
sum+=sum
}
for{} <- 무한 루프
(2) if
if v:=math.Pow(x,n); v<lim{
return v
}
v:=math.Pow(x,n)은 if문의 끝까지만 스코프가 존재
실습 : 반복문과 함수
함수와 반복문을 가지고 노는 방법으로서 제곱근 함수를 도입해봅시다: x라는 숫자가 주어졌을 때, 우리는 z²이 x에 가장 가까운 숫자 z를 찾아낼 것입니다.
컴퓨터는 주로 x의 제곱근을 반복문을 사용해 연산합니다. 어떠한 추측 값 z로부터 시작해, 우리는 z²가 x에 얼마나 가까운 가를 근거로 z의 더 좋은 값을 추정합니다.
z -= (z*z - x) / (2*z)
이러한 조정을 반복함으로써 우리가 최대한 실제 제곱근에 가까운 정답에 도달할 때까지 추측은 점점 더 정확해집니다.
주어진 func Sqrt 에 이것을 도입하십시오. 입력값이 어떻든 간에 z = 1이라는 괜찮은 가정에서 시작합니다. 시작과 함께 계산을 10회 반복하고 그에 따른 각각의 z의 값을 출력하세요. 당신이 x의 다양한 값(1, 2, 3, ...)에 얼마나 가까워지는 지 그리고 얼마나 빠르게 추측이 개선되는 지 보세요.
package main
import (
"fmt"
"math"
)
func Sqrt(x float64) float64 {
z := 1.0
for i:=0;i<10;i++{
z-=(z*z-x)/(2*z)
}
return z
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(math.Sqrt(2))
}
(3) switch
모든 케이스를 실행X, 첫 번째로 선택된 케이스만 실행한다
다른 언어는 case에 break가 필요하지만, Go는 자동으로 주어진다. case가 상수일 필요 X, 그 값이 정수일 필요도 X
하나의 케이스라도 성공하면 멈춘다
// 만약 i==0이라면 f 호출 X
switch i {
case 0:
case f():
}
조건이 없는 Switch는 switch true와 동일
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}
(4) defer
특정 문장 혹은 함수를 나중에 (defer를 호출하는 함수가 리턴하기 직전에) 실행하게 한다.
함수 하나에 defer 키워드를 여러 개 사용하면 defer로 지정한 각 구문은 stack에 쌓였다가 가장 나중에 쌓인 defer 구문부터 수행
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
결과
counting
done
9
8
7
...
package main
import "fmt"
func main() {
f1()
}
func f1() {
fmt.Println("f1-start")
// 만약 defer가 없다면 바로 f2-deferred가 출력되었을 것
defer f2()
fmt.Println("f1-end")
}
func f2() {
fmt.Println("f2-deferred")
}
실행 결과
f1 - start
f1 - end
f2 -deferred