Languages/Go

[Go] Go의 특징과 기능

MOONCO 2022. 2. 28. 14:59

return(반환) 형식을 함수 생성시 지정한다.

// 대소문자 변경을 위한 모듈 불러오기
import (
  "strings"
)

// 인자로 name을 받아, length와 uppercase를 반환하는 함수 만들기
func lenAndUpper(name string) (length int, uppercase string){
  length = len(name)
  uppercase = strings.ToUpper(name)
  // 반환하는 변수를 이미 위에서 지정했기 때문에, 다시 지정할 필요가 없다!
  return
}

 

defer를 함수내에 사용해, 콜백함수를 만들 수 있다.

// 사용할 모듈 불러오기
import (
  "fmt"
  "strings"
)

func lenAndUpper(name string) (length int, uppercase string){
  // defer는 함수가 종료된 뒤에 실행 된다. (콜백)
  defer fmt.Println("It's done!")
  length = len(name)
  uppercase = strings.ToUpper(name)
  return
}

 

for를 사용해, 반복함수를 만들 수 있다. - range와 콜론(;)방식 사용

numbers := [1,2,3,4,5,6]
total := 0

// for는 index와 value를 반환한다
for _, number := range numbers {
  total += number
}

fmt.Println(total)

// 1 ~ 6을 더해서 화면에 출력해준다.
numbers := [1,2,3,4,5,6]
total := 0

for i:=0; i < len(numbers); i++ {
  total += number[i]
}

fmt.Println(total)

 

if로 조건문을 사용할 때, 조건문 전용 변수를 만들 수 있다.

// 조건문으로 성인인지, 아닌지 검증하기
age := 20

// usAge는 조건문 내부에서만 사용가능하다.
if usAge := age - 2; usAge < 18 {
  fmt.Println("children")
}
fmt.Println("adult")

 

 

case로 조건문의 반복을 줄일 수 있다. - 전용 변수도 생성 가능

age := 20

switch usAge := age - 2; usAge {
  case < 18:
    return false
  case == 18:
    return true
  case > 50:
    return false
}
return true
usAge := 18

switch {
  case usAge < 18:
    return false
  case usAge == 18:
    return true
  case usAge > 50:
    return false
}
return true

 

포인터를 만들 수 있다! - low level programing

변수(a) 앞에 &를 붙이면, 변수의 메모리 주소(&a)를 반환하고,

다른 변수(b)에 메모리 주소(&a)를 저장하면, 포인터(b)를 만들 수 있다

포인터 변수(b) 앞에 *를 붙이면, 포인터 변수에 저장된 메모리 주소(&a)에 접근 할 수 있다!
- a에 저장된 데이터 수정 가능
// 포인터 사용하지 않는 기존 방식

a := 2
b := a
b := 5
fmt.Println(a, b)

/*
  출력 결과 : 2 5
  
  a메모리 공간 : 2
  b메모리 공간 : 5
*/



// 포인터 사용하는 방식

a := 2
b := &a
*b := 5
fmt.Println(a, *b)

/*
  출력 결과 : 5 5
  
  a메모리 공간 : 5
  b메모리 공간 : a메모리 주소
*/

* 포인트 사용시 장점

동일한 데이터를 저장할때, 데이터를 복사하여 저장하는 기존의 방식보다 메모리를 적게 사용한다.

 

 

Array를 만들기 ( 범위 지정하는 Array )

// 5칸짜리의 문자열 Array만들기 - 범위를 벗어나면 오류를 반환한다.
names := [5]string{"jinho", "nico", "anna"}

// Array에 새로운 요소 추가하기
names[3] = "woo"

fmt.Println(names)

// 출력결과 : [jinho noco anna woo ]

 

Slice만들기 ( 범위 지정안하는 Array )

// 범위 제한없는 문자열 Slice 만들기
names := []string{"jinho", "nico", "anna"}

// Slice에 새로운 요소 추가하기
names = append(names, "woo")

fmt.Println(names)

// 출력결과 : [jinho noco anna woo]

 

map으로 객체(object) 만들기 - 타입이 제한 적임

import (
  "fmt"
)

func main(){
  // map[key형식]value형식 형태로 정의한다.
  // *주의 : {}로 초기화 해주지 않으면, 나중에 값을 저장할 수 없다.
  jinho := map[string]string{"name":"jinho", "age":"26"}
  // var jinho = make(map[string]string) 도 가능하다.

  // for문으로 map형식의 데이터에서 key값과 value값 하나씩 가져오기
  for key, value := range jinho{
    fmt.Println(key, value)
  }
}

 

struct로 객체만들기 - 타입이 자유로움

import (
  "fmt"
)

// 새로운 person struct 만들기
type person struct{
  name string
  age int
  favFood []string
}

func main(){
  favFood := []string{"kimchi", "ramen"}
  // struct 사용해서 person 데이터 만들기
  jinho := person{name:"jinho", age:26, favFood:favFood}
  fmt.Println(jinho)
}

 

객체의 특정 값 제거하기

// go 내부에 존재하는 delete 메서드를 사용하면, 간단히 객체 요소를 삭제할 수 있다.

// 과일을 저장하는 객체
fruits := map[string]string{"orange":"orange", "grape":"purple"}

// fruits 객체에서 "orange"값 제거
delete(fruits, "orange")

/*
  결과 : fruits: {"grape":"purple"}
*/

 

반응형