변수 및 상수
// variable1.go
// 변수1
package main
import "fmt"
func main() {
// 변수 선언 및 초기화
var a int = 4 // var 변수명 자료형 = 초기화값
var b string
var c, d, e int
var f, g, h int = 1, 2, 3
var i float32 = 11.4
var j string = "Hi Golang!"
var k = 475 // float으로 자동 선언
var l = "Hi Seoul!" // string 자동 선언
var m bool = true
fmt.Println("a : ", a)
// 출력은 생략
}
- 빌드 :
Ctrl + Shift + b
- 참고로 go에서는 변수를 선언만하고 사용하지 않으면 빌드가 되지않음(에러처리됨)
package main
import "fmt"
func main() {
// 여러 개 선언
var (
// 변수명 자료형 = 초기값
name string = "machine"
height int32
weight float32
isRunning bool
)
// 사용은 이렇게
height = 250
fmt.Println("name : ", name, "height : ", height, "weight : ", weight, "isRunning : ", isRunning)
}
package main
import "fmt"
func main() {
// 짧은 선언
// 함수 내에서 사용가능, 선언 후 변수값 변경불가
// 변수명 := 초기값
shortVar1 := 3
shortVar2 := "Test"
shortVar3 := false
fmt.Println("shortVar1 : ", shortVar1, "shortVar2 : ", shortVar2, "shortVar3 : ", shortVar3)
// Example
if i := 10; i < 11 {
fmt.Println("Short Variable Test")
}
}
상수사용하기
package main
import "fmt"
func main() {
const a string = "Test1"
const b = "Test2" // Okay
const c int32 = 10 * 10
// const d = getHeight() // 런타임은 불가능
const e = 35.6
const f = false
// 출력은 생략
}
package main
import "fmt"
func main() {
const a, b int = 10, 99
const c, d, e = true, 0.84, "test"
const (
x, y int16 = 50, 90
i, k = "Data", 7776
)
// 출력은 생략
}
열거형(enum)
package main
import "fmt"
func main() {
// 이렇게 하면 될까?
const (
Jan = 1
// Jan = 1이후에 2, 3 ... 라는것을 아는데 굳이 다 적어야하나?
Feb = 2
Mar = 3
Apr = 4
// ...
)
fmt.Println(Jan)
// ...
}
해결해보자
package main
import "fmt"
func main() {
// 이렇게 하면 될까?
const (
Jan = iota + 1 // 시작은 0으로 시작함.
Feb
Mar
Apr
// ...
)
fmt.Println(Jan)
// ...
}
package main
import "fmt"
func main() {
const (
_ = iota // 0은 생략해 주세요
A
B
_ // C도 생략해 주세요
D
)
// 출력생략
}
if
package main
import "fmt"
func main() {
// if문의 특징은 소괄호 사용이 안되며, boolean만을 써야한다(0, 1 사용하면 안됨)
var a int = 20
b := 20
if a >= 15 {
fmt.Println("a")
}
if b >= 25 {
fmt.Println("b")
}
// 이러면 안된다1
if b >= 25 // 괄호가 아래로 내려가면 안됨
{
}
// 이러면 안된다2
if b >= 25
fmt.Println("b") // 괄호를 생략하면 안된다.
// 이러면 안된다3
if c := 1; c { // boolean만 써야한다
fmt.Println("True")
}
// 이러면 안된다4
if c := 40; c >=35 {
// Okay
}
c += 20 // 이런건 안됨
}
package main
import "fmt"
func main() {
var a int = 50
b := 70
if a >= 65 {
fmt.Println("65 이상")
} else { // 괄호 위치 주의
fmt.Println("65 이하")
}
if b >= 70 {
fmt.Println("70 이상")
} else {
fmt.Println("70 이하")
}
}
package main
import "fmt"
func main() {
var a int = 50
b := 70
if a >= 65 {
} else if a >= 60 && a < 120 {
}
else {
}
}
switch
//Switch문(1)
package main
import "fmt"
func main() {
//예제1
a := -7
switch {
case a < 0:
fmt.Println(a, "는 음수")
case a == 0:
fmt.Println(a, "는 0")
case a > 0:
fmt.Println(a, "는 양수")
}
//예제2
switch b := 27; {
case b < 0:
fmt.Println(b, "는 음수")
case b == 0:
fmt.Println(b, "는 0")
case b > 0:
fmt.Println(b, "는 양수")
}
//예제3
switch c := "go"; c {
case "go":
fmt.Println("Go!")
case "java":
fmt.Println("Java!")
default:
fmt.Println("일치하는 값 없음")
}
//예제4
switch c := "go"; c + "lang" {
case "golang":
fmt.Println("GoLang!")
case "java":
fmt.Println("Java!")
default:
fmt.Println("일치하는 값 없음")
}
//예제5
switch i, j := 20, 30; {
case i < j:
fmt.Println("i는 j보다 작다")
case i == j:
fmt.Println("i와 j는 같다")
case i > j:
fmt.Println("i는 j보다 크다")
}
}
//Switch문(2)
package main
import "fmt"
func main() {
//예제1
a := 30 / 15
switch a {
case 2, 4, 6: // a가 2, 4, 6일 때
fmt.Println("a -> ", a, "짝수")
case 1, 3, 5: // a가 1, 3, 5일 때
fmt.Println("a -> ", a, "홀수")
}
//예제2
switch i := 75; {
case i >= 50 && i < 100:
fmt.Println("i -> ", i, "50 이상, 100 미만")
case i >= 0 && i < 05:
fmt.Println("i -> ", i, "0 이상, 50 미만")
}
//예제3 : break
c := "success"
d := 2
switch d {
case 1:
fmt.Println(1)
case 2:
if c == "success" {
fmt.Println("Login Success")
//break //break 필요한 경우
}
fmt.Println("Pass")
}
//예제4 : fallthrough
switch e := "go"; e {
case "java":
fmt.Println("Java")
fallthrough
case "go":
fmt.Println("Go")
fallthrough
case "python":
fmt.Println("Python")
fallthrough
case "ruby":
fmt.Println("Ruby")
fallthrough
case "c":
fmt.Println("C")
//fallthrough //마지막 라인 fallthrough 사용 불가
}
}
Example
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
//예제1
rand.Seed(time.Now().UnixNano())
switch i := rand.Intn(100); {
case i >= 50 && i < 100:
fmt.Println("i -> ", i, " 50 이상 100미만")
case i >= 25 && i < 50:
fmt.Println("i -> ", i, " 25 이상 50미만")
default:
fmt.Println("i -> ", i, " 기본 값")
}
}
for
package main
import "fmt"
func main() {
//반복문 - For
//Go에서 유일한 반복문
//다양한 사용법 숙지
//예제1
for i := 0; i < 5; i++ {
fmt.Println("ex1 : ", i)
}
//에러 발생1 : 괄호 위치
for i := 0; i < 5; i++
{
fmt.Println("ex1 : ", i)
}
//에러 발생2 : 괄호 없음
for i := 0; i < 5; i++
fmt.Println("ex1 : ", i)
//예제2 (무한 루프)
for {
fmt.Println("ex2 : Hello, Golang!")
fmt.Println("ex2 : Infinite loop!")
}
//예제3 (Range용법)
loc := []string{"Seoul", "Busan", "Incheon"}
for index, name := range loc {
fmt.Println("ex3 :", index, name)
// 0 Seoul
// 1 Busan
// 2 Incheon
}
for name := range loc {
fmt.Println("ex3 :", name)
// Seoul
// Busan
// Incheon
// 첫 번째 인자를 없애면 데이터만 나온다
}
}
package main
import "fmt"
func main() {
//예제1
sum1 := 0
for i := 0; i <= 100; i++ {
sum1 += i
}
fmt.Println("ex1 : ", sum1)
//예제2
sum2, i := 0, 0
for i <= 100 {
sum2 += i
i++
//i := i++ //에러 발생 (go에서 후치 연산 반환 값 없음 에러 발생)
}
fmt.Println("ex2 : ", sum2)
//예제3
sum3, i := 0, 0
for {
if i > 100 {
break
}
sum3 += i
i++
}
fmt.Println("ex3 : ", sum2)
//예제4
// 보통 이렇게 쓰지는 않음, i, j = i+1, j+10를 for문 내로 넣는다
for i, j := 0, 0; i <= 10; i, j = i+1, j+10 {
fmt.Println("ex3 : ", i, j)
}
//에러 발생 : i++ 후치 연산 불가
for i, j := 0, 0; i <= 10; i++, j += 10 {
fmt.Println("ex3 : ", i, j)
}
}
package main
import "fmt"
func main() {
//예제1
sum, i := 0, 0
for {
if i > 100 {
break
}
sum += i
i++
}
fmt.Println("ex1 : ", sum)
//예제2
Loop1: // (주의) Loop: 레이블 아래에는 무조건 for문이 있어야 함
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
if i == 2 && j == 4 {
break Loop1 // break 후 Loop1의 for문을 벗어나라
}
fmt.Println("ex2 : ", i, j)
}
}
//예제3
for i := 0; i < 10; i++ {
if i%2 == 0 {
continue
}
fmt.Println("ex3 : ", i)
}
//예제4
Loop2:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 2 {
continue Loop2
}
fmt.Println("ex4 : ", i, j)
}
}
}
go 문법의 특징
//GO 특징(1)
package main
import "fmt"
func main() {
//모호하거나 애매한 문법 금지
//후치 연산자 허용 , 전치 연산자 비허용
//증감연산 반환 값 없음
//포인터(Pointer 허용, 연산 비허용)
//주석 사용법 숙지( //, /**/)
//예제1
sum, i := 0, 0
for i <= 100 {
//sum += i++ //예외 발생(증감 연산 반환 값)
sum += i
i++
//++i //예외 발생(전위 증감)
}
fmt.Println("ex1 : ", sum)
}
//GO 특징(2)
package main
import "fmt"
func main() {
//문장 끝 세미콜론(;)주의
//자동으로 끝에 세미콜론 삽입
//두 문장을 한 문장에 표현할 경우 명시적으로 세미콜론 사용
//반복문 및 제어문(if, for) 사용할 경우 주의
//예제1
for i := 0; i <= 10; i++ {
//fmt.Print("ex1 : ");fmt.Println(i)
fmt.Print("ex1 : ")
fmt.Println(i)
}
}
//GO 특징(3)
package main
import "fmt"
func main() {
//코드 서식 지정
//한 사람이 코딩 한 것같은 일관성 유지
//코드 스타일 유지
//gofmt -h : 사용법
//gofmt -w : 원본파일에 반영
// 빌드시 자동 사용됨.
//예제1
for i := 0; i <= 100; i++ {
fmt.Print("ex1 : ", i)
}
}
# 커멘드 라인에서 사용할때는 이런식으로 쓴다
$ gofmt -w hello.go