Golang의 함수, 메서드, 구조체 및 인터페이스

4512 단어 go
우리는 이전 단원에서 If/Else, Switch Case, Looping, Pointers in Golang을 배웠습니다. 이 강의에서는 Golang의 함수, 메소드, 구조체 및 인터페이스에 대해 배웁니다.

Golang의 기능



실행할 go 프로그램의 진입점은 기본 패키지에 지정된 기본 기능입니다. 더 많은 기능을 정의하고 사용할 수 있습니다. 간단한 예를 살펴보겠습니다.

func add(a int, b int) int {
  c := a + b
  return c
}
func main() {
  fmt.Println(add(2, 1))
}
//=> 3


Go 함수는 위의 예에서 볼 수 있듯이 func 키워드와 함수 이름을 사용하여 정의됩니다. 함수의 인수는 함수 자체의 데이터 유형에 따라 지정되어야 하며 그 뒤에 반환 데이터 유형이 옵니다.

함수의 반환은 함수 내에서 사전 정의될 수도 있습니다.

func add(a int, b int) (c int) {
  c = a + b
  return
}
func main() {
  fmt.Println(add(2, 1))
}
//=> 3


여기서 c로 지정된 반환 변수는 다음과 같습니다. 결과적으로 결론에서 return 문 앞에 변수 c를 정의할 필요가 없습니다.

반환 값을 쉼표로 구분하면 단일 함수에서 여러 반환 값을 반환할 수도 있습니다.

func add(a int, b int) (int, string) {
  c := a + b
  return c, "successfully added"
}
func main() {
  sum, message := add(2, 1)
  fmt.Println(message)
  fmt.Println(sum)
}


Go는 완전히 객체 지향적이지는 않지만 구조체, 인터페이스 및 메서드를 사용하기 때문에 많은 객체 지향 지원과 느낌을 가지고 있습니다.

Golang의 구조체



구조체는 다양한 필드의 형식화된 그룹입니다. 데이터는 구조체를 사용하여 함께 그룹화됩니다. 이름, 나이 또는 성별과 같은 개인의 속성은 Person 유형의 데이터를 그룹화하려는 경우 정의됩니다. 아래 제공된 구문을 사용하여 구조체를 정의할 수 있습니다.

type person struct {
  name string
  age int
  gender string
}


사람 유형 구조가 정의되었으므로 이제 사람을 만들어 봅시다.

//way 1: specifying attribute and value
p = person{name: "Bob", age: 42, gender: "Male"}
//way 2: specifying only value
person{"Bob", 42, "Male"}


점을 사용하면 이러한 사실(.)에 빠르게 액세스할 수 있습니다.

p.name
//=> Bob
p.age
//=> 42
p.gender
//=> Male


구조체의 포인터를 사용하여 속성에 직접 액세스할 수도 있습니다.

pp = &person{name: "Bob", age: 42, gender: "Male"}
pp.name
//=> Bob


Golang의 메소드



리시버가 있는 고유한 함수 클래스는 메서드입니다. 수신기는 포인터 또는 값일 수 있습니다. 이전 예제의 리시버 유형 person을 리시버로 사용하는 describe라는 메서드를 빌드해 보겠습니다.

package main
import "fmt"

// struct defination
type person struct {
  name string
  age int
  gender string
}

// method defination
func (p *person) describe() {
  fmt.Printf("%v is %v years old.", p.name, p.age)
}
func (p *person) setAge(age int) {
  p.age = age
}

func (p person) setName(name string) {
  p.name = name
}

func main() {
  pp := &person{name: "Bob", age: 42, gender: "Male"}
  pp.describe()
  // => Bob is 42 years old
  pp.setAge(45)
  fmt.Println(pp.age)
  //=> 45
  pp.setName("Hari")
  fmt.Println(pp.name)
  //=> Bob
}


이제 위의 예에서 볼 수 있듯이 점 연산자를 pp.describe로 사용하여 메서드를 호출할 수 있습니다. 수신자는 포인터이므로 기록해 두십시오. 포인터와 함께 값에 대한 참조를 제공하므로 메서드에 대한 모든 변경 사항이 수신자의 응답에 반영됩니다. 또한 항목의 새 복사본을 만드는 것을 방지하여 메모리를 절약합니다.

setName 메서드는 수신자 유형이고 setAge는 포인터 유형이므로 위의 예에서 age 값은 변경되었지만 name 값은 변경되지 않은 상태로 유지된다는 점에 유의해야 합니다.

Golang의 인터페이스



Go의 인터페이스는 메서드 그룹입니다. 인터페이스는 유형의 속성을 구성하는 데 도움이 됩니다. 인터페이스 동물을 예로 들어 보겠습니다.

type animal interface {
  description() string
}


이 경우 Animal은 인터페이스 유형입니다. 이제 동물 인터페이스 유형을 사용하는 두 가지 다른 동물 유형을 설계해 보겠습니다.

package main

import (
  "fmt"
)

type animal interface {
  description() string
}

type cat struct {
  Type string
  Sound string
}

type snake struct {
  Type string
  Poisonous bool
}

func (s snake) description() string {
  return fmt.Sprintf("Poisonous: %v", s.Poisonous)
}

func (c cat) description() string {
  return fmt.Sprintf("Sound: %v", c.Sound)
}

func main() {
  var a animal
  a = snake{Poisonous: true}
  fmt.Println(a.description())
  a = cat{Sound: "Meow!!!"}
  fmt.Println(a.description())
}

//=> Poisonous: true
//=> Sound: Meow!!!


우리는 동물 유형의 변수를 생성하고 이를 주 함수에 배치합니다. 동물에는 뱀과 고양이 유형이 지정되고 Println은 동물의 설명을 인쇄하는 데 사용됩니다. 우리는 고양이와 뱀 유형에 대해 두 가지 다른 방식으로 설명된 접근 방식을 사용했기 때문에 인쇄된 동물의 설명을 얻습니다.

좋은 웹페이지 즐겨찾기