#TIL GO 2회차

송정석·2022년 5월 12일
0
post-thumbnail

1. Data Type

func main() {

	str := "hello wo"
	fmt.Println(str)

	data := []byte(str)
	fmt.Println(data)

	unicode := []rune(str)
	fmt.Println(unicode)
}
// hello world
// [104 101 108 108 111 32 119 111 114 108 100]
// [104 101 108 108 111 32 119 111 114 108 100]

rune rune 어원?
rune 한글 및 UTF-8 처리 방법

func main() {

	str := "안녕 세상"
	unicode := []rune(str)
	fmt.Println(unicode)
	fmt.Println('안' == unicode[0])
}
// [50504 45397 32 49464 49345]
// true

위와 같은 파일 형태처럼 한글이 나눠져서 네이밍 되는 상황이 발생되는데
이유는 맥 과 윈도우의 한글처리 방식이 다름에 따라 발생됨 ( 재준님은 왜 제대로 나옴? )
func main() {
	nfd := "안녕 세상"
	nfc := "안녕 세상"
	fmt.Println(nfd)
	fmt.Println(nfc)
	fmt.Println(nfc == nfd)
}
// 안녕 세상  // ㅇ ㅏ ㄴ ㄴ ㅕ ㅇ  ㅅ ㅔ ㅅ ㅏ ㅇ 으로 깨져야하는대 왜 안꺠짐?
// 안녕 세상
// true 
func main() {
	nfd := "안녕 세상"
	nfc := "안녕 세상"
	fmt.Println(nfd)
	fmt.Println(nfc)
	fmt.Println(nfc == nfd)
}
// 안녕 세상  // ㅇ ㅏ ㄴ ㄴ ㅕ ㅇ  ㅅ ㅔ ㅅ ㅏ ㅇ 으로 깨져야하는대 왜 안깨짐?
// 안녕 세상
// true 
package main

import (
	"fmt"

	"golang.org/x/text/unicode/norm"
)

func main() {
	nfd := "안녕 세상"
	nfc := "안녕 세상"
	fmt.Println(nfd)
	fmt.Println(nfc)
	fmt.Println(nfc == nfd)

	nfd2nfc := norm.NFC.String(nfd)
	fmt.Println(nfd2nfc)
	fmt.Println(nfd2nfc == nfc)
}
// 안녕 세상
// 안녕 세상
// true
// 안녕 세상
// true
// 깨진다는 가정하에 위의 코드처럼 수정해서 바꿀수 있음
package main

import (
	"fmt"
	"os"

	"golang.org/x/text/unicode/norm"
)

func main() {
	filename := os.Args[1]
	tempName := filename + ".tmp"
	err := os.Rename(filename, tempName)
	if err != nil {
		panic(err)
	}

	toNFC := norm.NFC.String(filename)
	fmt.Println(toNFC)
	err = os.Rename(tempName, toNFC)
	if err != nil {
		panic(err)
	}
}
// ㅌ ㅔ ㅅ ㅡ ㅌ ㅡ 를 테스트로 바꺼줌 

2. For 문

func main() {
	sum := 1
	for ; sum < 1000 ; {
		sum += sum
	}
	fmt.Println(sum)
}

func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
	fmt.Println(sum)
}
// 조건식만 사용도 가능하다
func main() {
	for true{
		
	}
}

func main() {
	for {

	}
}
// 무한 루프

3. If 문


func pow(x, n, lim float64) float64 {
	v := math.Pow(x, n)
	if v < lim {
		return v
	}
	return lim
}

func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}

func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}
func main() {
	fmt.Println(
		pow(3, 2, 10),
		pow(3, 3, 20),
	)
}
// 9 20
// 위 아래 동일한 코드지만 다르게 표현도 가능하다

실습 반복문과 함수

import (
	"fmt"
)

const quality = 10

func Sqrt(x float64) (z float64) {
	z = 1
	for i := 0; i < quality; i++ {
		z -= (z*z - x) / (2 * x)
	}
	return
}
func main() {
	fmt.Println(Sqrt(2))
}
// 1.4142103896495881

4. Switch

고언어의 케이스에는 break 문이 자동으로 적용 된다
문자열 비교 가능
숫자 비교 가능
case에 값 수식을 넣을 수 있음 (함수도 가능)
조건식도 넣을 수 있음

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!")
	}
}
// Good morning!

5. defer

defer는 Stack형식으로 함수 콜이 쌓인다

func main() {
	fmt.Println("Counting")

	for i := 0; i < 10; i++ {
		defer fmt.Println(i)
	}
	fmt.Println("done")
}
// Counting
// done
// 9
// 8
// 7
// 6
// 5
// 4
// 3
// 2
// 1
// 0

6. Pointer

i , k := 42, 2701 // i와 j에 각각 42 , 2701을 선언하고 가상의 메모리에 저장
P := &i // P를 생성하고 i의 주소를 가르키게함
// *P 값을 출력해보면 21이 출력됨

*p의 값을 21로 변경
// *p 값을 출력해보면 21이 출력됨

p := &j // 다시 P를 j의 주소를 가르키게함

// *p 값인 2701 /37 을 다시 *p의 값에 입력


`포인터는 가르키는것이다.`
profile
Foot print

0개의 댓글