Go 언어 - 함수와 구조체

.


Background

  필자는 작년 SW마에스트로 활동을 하면서 처음으로 Terraform을 접하게 되었다. Terraform이란 클라우드 인프라 관리 도구로 이는 Go 언어로 작성되어 있어, 늘 흥미를 가지고 있던 언어 중 하나였다. 관심만 가지고 있다가 최근에 졸업 작품을 진행하면서 Go 언어에 대한 관심이 더욱 깊어졌고, 그 활용 범위가 클라우드 인프라 관리뿐만 아니라 마이크로서비스, 네트워크 프로그래밍, DevOps 도구 개발 등 다양한 분야로 확장되어 있음을 알게 되었다. 이에 Go 언어의 기초부터 실제 활용까지 체계적으로 학습하고 공유하고자 본 포스트를 작성하게 되었다.


Function & Struct

  Go에서 함수와 구조체는 프로그램의 구조를 형성하는 핵심 요소이다. 이들은 Go의 간결성과 강력함을 잘 보여주는 동시에, 효율적이고 모듈화된 코드 작성을 가능하게 한다.

Function

  기본적인 함수 선언은 다음과 같다.

func 함수명(매개변수) 반환타입 {
    // 함수 내용
}

Multiple return values

  Go는 다중 반환값을 지원하는 특징이 있다. 이는 함수에서 여러 값을 동시에 반환할 수 있게 해주며, 특히 오류 처리에 매우 유용하다.

func divide(a, b float64) (float64, error) {
  if b == 0 {
    return 0, errors.New("0으로 나눌 수 없습니다")
  }
  return a / b, nil
}

  이 예제에서 divide 함수는 나눗셈의 결과와 함께 에러 여부를 반환한다. 이를 통해 호출하는 쪽에서 명시적으로 오류를 처리할 수 있다.

  Go에서 함수는 일급 시민(first-class citizen)으로 취급된다. 이는 함수를 하거나, 다른 함수의 인자로 전달하거나, 함수를 반환할 수 있음을 의미한다. 이에 대한 개념은 JS와 동일하기 때문에 러닝 커브가 적을 것으로 예상된다.

func applyOperation(a, b int, op function(int, int) int {
  return op,(a, b)
}

func main() {
  add := func(x, y int) int {return x + y }
  result := applyOperation(5, 3, add)
  fmt.Println(result) // 출력: 8
}

  이러한 특성은 함수형 프로그래밍 패러다임을 지원하며, 코드의 재사용성과 모듈성을 높여준다.

Struct

  구조체는 Go에서 사용자 정의 타입을 만드는 주요 방법이다. 여러 필드를 하나의 단위로 묶어 복잡한 데이터 구조를 표현할 수 있다.

type Person struct {
  Name      string
  Age       int
  Address   string
}

  또한 구조체는 메서드를 가질 수 있어, 객체 지향 프로그래밍과 유사한 방식으로 사용할 수도 있다.

func (p Person) SayHello() {
    fmt.Printf("안녕하세요, 제 이름은 %s이고 %d살입니다.\n", p.Name, p.Age)
}

func (p *Person) HaveBirthday() {
    p.Age++
}

func main() {
  person := Person{Name: "Jinwoo", Age: 27, Address: "Daegu"}
  person.SayHello()
  person.HaveBirthday()
  fmt.Printf("%s의 나이는 이제 %d살입니다.\n", person.Name, person.Age)
}

  여기서 SayHello는 값 리시버를, HaveBirthday는 포인터 리시버를 사용한다. 포인터 리시버를 통해 메서드 내에서 구조체의 필드를 변경할 수 있다.

  Go는 클래스와 상속 대신 구조체와 컴포니졋ㄴ을 사용하여 코드의 재사용성을 향상시키고자 한다. 이는 보다 유연하고 명확한 코드 구조를 만들 수 있게 해준다.

type Address struct {
    Street  string
    City    string
    Country string
}

type Employee struct {
    Person
    Address
    Salary float64
}

  위 예제에서 Employee 구조체는 PersonAddress 구조체를 포함(embed)하고 있다. 이를 통해 EmployeePersonAddress의 모든 필드와 메서드를 자동으로 사용할 . 수있게 된다.


Summary

  함수와 구조체는 Go 프로그래밍의 근간을 이루는 요소이다. 이들을 효과적으로 사용하면 깔끔하고 모듈화된 코드를 작성할 수 있으며, Go의 철학인 단순성과 실용성을 잘 구현할 수 있다. 함수의 다중 반환값과 일급 시민으로서의 특성, 그리고 구조체의 유연한 조합 능력은 Go를 효율적인 프로그래밍 언어로 만드는 핵심 요소이다.

  언어가 상당히 독특한 언어인 것 같다. 함수형 프로그래밍 언어이면서도 C언어를 떠올리게 한다.