Golang 기본(1) - 변수, 상수, 데이터 타입, 문자열, 형변환, 연산자, 조건문
*본문은 <예제로 공부한 go 프로그래밍>(http://golang.site/go/basics) 사이트를 참고하여 공부하면서 정리한 내용입니다. Tip 위주로 간략하게 정리했으며, 보탬 내용은 <Go 디스커버리>(염재현 저, 한빛미디어, 2016)을 참고하여 작성되었습니다.
1. 변수
var a, b, c, d int = 1, 2, 3
var f float32 = 11. // 초기값할당
d = 10
단, 선언된 변수가 쓰이지 않으면 에러
변수 선언하면서 초기값 할당 안하면 0 value 할당. 0, false, "" 등
var e = 1 // 타입 알아서 해줌
g := 1 // var 생략하고 사용.함수 내이서만 사용가능하고, 밖에선 var를 사용해야!
2. 상수
const c int = 10
// 아래는 여러 개의 상수를 묶어 지정하는 방법
const (
Visa = "Visa"
Master = "master"
amex = "amex"
)
<IOTA IDENTIFIER>
iota가 지정된 변수에 0 할당, 나머지 상수들은 순서대로 1씩 증가된 값을 부여
const (
apple = iota
grape
orange
)
3. 데이터 타입
bool, string,
int int8/16/32/64
uint ~ uintptr
float32/64
byte: uint8과 동일하며 바이트 코드에 사용
rune: int32와 동일, 유니코드 코드포인트에 사용
4. 문자열
`: Raw String Literal. 해석되지 않고 그대로의 값을 갖는다. 예를 들어, 문자열 안에 \n 이 있을 경우 이는 NewLine으로 해석되지 않는다. 복수라인 사용가능
"": Interpreted String Literal. 복수라인에 걸쳐 사용 불가, escape 문자열들이 해석이 됨. + 연산자를 결합해 사용
func one() {
rawLiteral := `arirang\n
arirang\n
arariyo`
interLiteral1st := "arirang\narariyo"
interLiteral2nd := "ari\n" +
"arariyo"
fmt.Println(rawLiteral)
fmt.Println(interLiteral1st)
fmt.Println(interLiteral2nd)
}
5. 형변환
T(v)
T: type conversion이란 뜻
v: value
예: float32(100), []byte("ABC")
go는 암묵적 변환 개념 없음. 명시적으로 해주어야만 한다! 아님 에러남!
i := 100
var u uint = uint(i)
var f float32 = float32(i)
str := "abc"
bytes := []byte(str)
str2 := string(bytes)
6. 연산자
산술: +, -, *, /, %
관계: ==, !=, >=
논리: &&, ||, !
bitwise: &, |, ^, <<, >>
할당: =, *=, >>=, |=
사칙, 비트연산을 축약한 표현들이다
포인터: &, *
ex)
var k int = 10
var p = &k // k 주소 할당
println(*p) // p가 가리키는 주소에 있는 실제 내용 출력
7. 조건문
작성 양식, 즉 줄바꿈 등의 형식이 더 중요
if k == 1 {
println("one")
} else if k==2 {
println("two")
} else {
println("other")
}
아래와 같이 간단한 문장(Optional Statement)을 함께 실행할 수 있다. 단, val은 if 조건문 범위 내에서만 사용할 수 있다는 것이다. 즉, 조건문을 작성하는 공간 혹은 그 안의 실행문. Optional Statement는 switch, for 문 등에서도 사용 가능
if val := i * 2; val < max {
println(val)
}
// 아래 처럼 사용하면 Scope 벗어나 에러
val++
// switch문
var name string
var category = 1
switch category {
case 1:
name = "paper"
case 2:
name = "ebook"
case 3, 4:
name = "blog"
default:
name = "other"
}
Go의 switch문은 다른 언어와 다른 특징을 갖는다. 훨씬 유연하다.
- switch 뒤에 아무 표현이 없을 수 있다. 그럼 그냥 true로 생각하고 바로 case를 계산
- 복잡한 표현을 쓸 수도 있다.
- break를 쓰지 않아도 다음 case로 자동 패스하지 않는다. go 컴파일러가 자동으로 break문을 각 case 블럭마다 추가하기 때문이다. 그래서 밑의 문장들을 실행하고 싶다면 'fallthrough'를 추가하면 된다.
- 다른 언어가 변수 값을 기준으로 case를 분기하는 것과 달리 go는 그 변수의 type에 따라 case로 분기할 수 있다
// Expression을 사용한 경우
switch x := category << 2; x - 1 {
// ...
}