대표 사진!

golang에 대한 기본적인 내용에 대해서 설명합니다. 간단한 내용이니 빠르게 진행하겠습니다.

GO의 기본 타입

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // alias for uint8

rune // alias for int32
     // represents a Unicode code point

float32 float64

complex64 complex128

 사용자가 go에서 기본으로 사용할 수 있는 타입을 입니다.

문자열 

 문자열 리터럴은 ` `(Back Quote) 또는 " "를 통해서 표현 할 수 있습니다.

` `(Back Quote)은 여러 줄을 표현할 수 있습니다.

str1 := `나의 살던 고향은
꽃피는 산골`
fmt.Println(str1)

str2 := "학교종이 땡땡땡\n" +
"어서 모이자 \n"

fmt.Println(str2)

결과 화면

변 수

// go에서 변수 사용하기
// <var> <변수명> <타입> 순서대로 
var ia int
ia = 10
var i, j, k int = 1, 2, 3

 go에서 변수를 선언하는 기본적인 방식은 var <변수명> <타입> 입니다.

 예를 들면 var ia int"int형 변수 ia"를 뜻합니다. 

 변수의 초기값을 지정하지 않으면 Zero값로 설정됩니다. 

// ia는 정수형으로 추론
var ia = 10
// s는 string으로 추론됩니다.
var s = "string"

fmt.Printf("ia = %d, s = %s\n", ia, s)

 var는 c++의 auto와 비슷해서 타입 추론이 가능합니다. var로 선언하고 변수명 초기값을 설정하면 초기값에 의해서

 타입이 추론되서 사용할 수 있습니다.

// 함수밖에서 선언하는건 에러!
ss := "outer string"

fun innerfun(){
    // ia는 정수형으로 추론
    ia := 10
    // s는 string으로 추론됩니다.
    s := "string"
}

 :=를 통해서 함수내에서는 var를 생략할 수 있습니다. 함수내에서는 대부분 이 형식을 통해서 선언하는 것이

 가독성면이나 작성 비용면에서 유리합니다. 

상 수

 go에서 문자열, 문자, boolean, 숫자 값은 상수가 될 수 있습니다. 

// const PI float = 3.14 동일
const PI = 3.14

 상수는 변수와 비슷하게 선언 할 수 있는데 변수와 다른 점은 const 키워드를 붙여야 합니다. 

const (
    Visa = "Visa"
    Master = "MasterCard"
    Amex = "American Express"
)

 여러개의 상수를 선언 할때는 ( )로 묶어서 관리할 수 있습니다.

형 변환

i := 42
// i -> float64 변환
f := float64(i)
// f -> uint로 변환
u := uint(f)

 위와 같은 형식으로 형변환을 할 수 있습니다. 

함수

  golang에서 함수의 선언은 c++과는 순서가 다릅니다.

// func 함수라는 선언
// func 함수명(파라미터) 리턴값 {
// }
func add(x int, y int) int {
	return x + y
}

// 파라미터 : x int, y int
func add(x, y int) int {
	return x + y
}

 우선 함수를 선언할 때는 func 키워드를 통해서 함수라고 알린 후 "함수명 (파라미터) 리턴값"의 순서대로 선언합니다. 

 밑에서 배우겟지만 go는 리턴 값도 파라미터를 가질 수 있으며 여러개의 리턴값을 가질 수 있습니다. 

// 값에 의한 전달 
func ByValue(msg string) {
	println("ByValue =", &msg)
}

// 참조에 의한 전달 
// c++과는 호출쪽에서도 명시적으로 값을 넘김
func ByReference(msg *string) {
	println("ByReference =", msg)
}

func main() {
	str := "hello"
	println("origin str :", &str)
	ByValue(str)
	ByReference(&str)
}

결과

 c++과 마찬가지로 함수 파라미터를 통해서 값으로의 전달, 참조로의 전달이 가능합니다. 

 호출쪽에서도 명시적으로 참조에 의한 호출인지 인지 할 수 있습니다. 

가변인자 함수

func main() {

    // 하나의 인자를 사용
    variadicFunc("one")
    // 4개의 인자를 사용
    variadicFunc("one", "two", "three", "four")
}

// 가변인자 함수 
// ...를 사용해서 가변인자인지 알립니다.
func variadicFunc(args ...string) {
    for _, s := range args {
        println(s)
    }
}

 함수 호출시 고정된 갯수의 인자가 아닌 다양한 갯수의 인자를 전달 하려면 가변인자를 알리는 ... 를 사용해서

 인수를 선언합니다. 예제에서는 string을 가변인자로 받는 variadicFun 함수를 보여줍니다.

함수의 리턴값

 go는 c++과는 다르게 함수의 리턴 값이 여러개 일 수도 있습니다. 

func variadicFunc(args ...string) (int, string) {
    ret := ""
    for _, s := range args {
        ret += s
    }

    return len(args), ret
}

 추가적으로 여러개의 리턴 값을 리턴하게 되면 사용자는 코드가 복잡해 지는 것을 방지하기 위해서 

 Named Return Parameter기능을 지원합니다. 

// nums와 ret가 Named return parameter로 지정되었음 
func variadicFunc(args ...string) (nums int, ret string) {
	nums = len(args)
    for _, s := range args {
		ret += s
	}
	// return시 nums, ret 자동으로 리턴!!!
	return
}


func main() {
	nums, strings := variadicFunc("one ", "two ", "three ")
	println(nums, strings)
}

결과

 Named Return Parameter기능은 간단하게 리턴 값에 파라미터를 지정해서 함수내에서 해당 파라미터를 사용할 수

 있게 합니다.

 이미 리턴값에 대해서 상단에서 명시했기 때문에 함수 수행이 끝날 때 사용자는 빈 return을 호출 하게 되면

 Named Return Parameter로 지정된 파라미터 값이 자동으로 리턴됩니다. 

반복문 

 go의 반복문은 for를 통해서 모두 구현되어 있습니다.

sum := 0
for i := 1; i <= 100; i++ {
    sum += i
}
println(sum)

 c++의 기본 for문과 비슷한 스타일의 반복문입니다.

 ";"를 기준으로 (초기값; 반복조건; 다음행 시작시 수행동작)으로 셋팅됩니다.

// c++ while문과 같은 반복문 
n := 1
for n < 100 {
	n *= 2
}
println(n)

  c++의 while문과 비슷한 스타일의 반복문입니다. for 다음의 조건문이 충족될 때까지 수행합니다.

for {
    fmt.Println("무한 루프 동작!!!")
}

 무한 루프 조건문입니다. 행을 빠져 나오지 못하기 때문에 추가적인 작업으로 루프를 빠져나오는 구문을

 구현 해야 합니다.

stocks := []string{"Apple", "Amajon", "Google"}
for index, name := range stocks {
    println(index, name)
}

 c++의 foreach와 같이 컬렉션에서 데이터를 추출하여 반복 수행문을 수행하는 로직입니다. 

 range를 통해서 for을 수행하면 행마다 인덱스와 value를 전달 받습니다. 

stocks := []string{"Apple", "Amajon", "Google"}
for _, name := range stocks {
    println( name)
}

 만약에 인덱스를 사용하지 않는다면 인덱스 위치에 "_"를 통해서 해당 변수를 받지 않도록 설정할 수 있습니다. 

 추가적으로 for문 내에서는 c++과 동일하게 continue, break문을 사용할 수 있습니다.

 c++에 익숙하지 않은 신분들을 위해서 간단하게 키워드 설명을 드립니다.

키워드  
continue 반복문에서 현재 수행을 멈추고 다음 수행문으로 넘어갑니다.
break 반복문을 빠져 나옵니다.

 참고 사이트

http://golang.site/go/basics

 

예제로 배우는 Go 프로그래밍 - Go 프로그래밍 언어 소개

1. Go 개발자들 GO 프로그래밍 언어는 2007년 구글에서 개발을 시작하여 2012년 GO 버젼 1.0을 완성하였다. GO는 이후 계속 향상된 버젼을 내 놓았으며 2015년 말에는 1.5.2 버젼에 이르렀다. 흔히 golang 이라고도 불리우는 Go 프로그래밍 언어는 구글의 V8 Javascript 엔진 개발에 참여했던 Robert Griesemer, Bell Labs에서 유닉스 개발에 참여했던 Rob Pike, 그리고 역시 Bell Labs에서 유닉

golang.site

https://tour.golang.org/

 

A Tour of Go

 

tour.golang.org

 

+ Recent posts