Programming Language/Golang(Go)

Golang 기본(1) - 변수, 상수, 데이터 타입, 문자열, 형변환, 연산자, 조건문

dr.meteor 2019. 10. 12. 00:01

*본문은 <예제로 공부한 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 {
// ...
}