(Go : basic) 2. 기초문법

Posted by : at

Category : Go


변수 및 상수

// 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

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links