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]
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) } } // ㅌ ㅔ ㅅ ㅡ ㅌ ㅡ 를 테스트로 바꺼줌
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 { } } // 무한 루프
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
고언어의 케이스에는 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!
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
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의 값에 입력
`포인터는 가르키는것이다.`