TIL (2022.05.24)

ay.zip·2022년 5월 24일
0

TIL

목록 보기
43/47
post-thumbnail

✅ 포스트 목차 ✅

➡️ Go를 향한 여행 여기서 공부중

  1. 패키지와 변수, 함수
  2. 흐름 제어 구문 : for, if, else, switch 그리고 defer

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 = ""


흐름 제어 구문 : for,if,else,switch 그리고 defer

(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

0개의 댓글

관련 채용 정보