function - 자바스크립트 - 이동의 함수와 메소드의 차이점은 무엇입니까?



자바스크립트 객체 배열 (2)

나는 Go를 시작하려고 노력하고 있으며, 문서 는 매우 훌륭합니다. 문서에서 찾지 못한 것은 함수와 메소드의 차이입니다.

지금까지 내가 이해하는 한 : 함수는 "전역"이며, 이는 함수를 사용하기 위해 패키지를 가져올 필요가 없다는 것을 의미합니다. 항상 사용합니다. 메소드는 패키지에 바인드됩니다. 이 올바른지?


지금까지 내가 이해하는 한 : 함수는 "전역"이며, 이는 함수를 사용하기 위해 패키지를 가져올 필요가 없다는 것을 의미합니다. 항상 사용합니다. 메소드는 패키지에 바인드됩니다. 이 올바른지?

아니, 맞지 않아. 항상 사용할 수있는 builtin 패키지의 몇 가지 기능 만 있습니다. 다른 모든 것은 수입해야합니다.

"방법"이라는 용어는 객체 지향 프로그래밍과 함께 등장했습니다. OOP 언어 (예 : C ++)에서는 함께 속하는 데이터와 함수를 캡슐화하는 "클래스"를 정의 할 수 있습니다. 클래스 내의 함수를 "메소드"라고 부르며 그러한 메소드를 호출하려면 해당 클래스의 인스턴스가 필요합니다.

Go에서는 비록 Go가 고전적인 의미에서 OOP 언어가 아니지만 용어는 기본적으로 동일합니다. Go에서는 수신자를 취하는 함수를 일반적으로 메서드라고 부릅니다 (아마도 사람들이 OOP의 용어에 익숙하기 때문일 수도 있습니다).

예를 들면 다음과 같습니다.

func MyFunction(a, b int) int {
  return a + b
}
// Usage:
// MyFunction(1, 2)

그러나

type MyInteger int
func (a MyInteger) MyMethod(b int) int {
  return a + b
}
// Usage:
// var x MyInteger = 1
// x.MyMethod(2)

Tux의 답변은 훌륭하지만 struct 사용하여 Go의 메서드를 사용하여 기능을 늘리고 싶습니다 (자주 사용했기 때문에). 따라서 삼각형에 대한 다양한 방법을 계산할 무언가를 만들고 싶다고 가정 해 봅시다. struct 시작합니다.

type Triangle struct {
    a, b, c float64
}

주변 및 사각형을 계산하는 함수를 추가하고 싶습니다.

func valid(t *Triangle) error {
    if t.a + t.b > t.c && t.a + t.c > t.b && t.b + t.c > t.a {
        return nil
    }
    return errors.New("Triangle is not valid")
}

func perimeter(t *Triangle) (float64, error) {
    err := valid(t)
    if err != nil {
        return -1, err
    }

    return t.a + t.b + t.c, nil
}

func square(t *Triangle) (float64, error) {
    p, err := perimeter(t)
    if err != nil {
        return -1, err
    }

    p /= 2
    s := p * (p - t.a) * (p - t.b) * (p - t.c)
    return math.Sqrt(s), nil
}

이제 작업 프로그램에 Play Playground가 생겼습니다 . 이 경우 함수는 매개 변수 (삼각형에 대한 포인터)를 취해 무엇인가합니다. OOP 단어에서는 사람들이 클래스를 만든 다음 메서드를 추가했을 수 있습니다. 우리는 우리의 구조체를 필드를 가진 클래스의 종류로 볼 수 있으며 이제 메소드를 추가합니다.

func (t *Triangle) valid() error {
    if t.a + t.b > t.c && t.a + t.c > t.b && t.b + t.c > t.a {
        return nil
    }
    return errors.New("Triangle is not valid")
}

func (t *Triangle) perimeter() (float64, error) {
    err := t.valid()
    if err != nil {
        return -1, err
    }

    return t.a + t.b + t.c, nil
}

func (t *Triangle) square() (float64, error) {
    p, err := t.perimeter()
    if err != nil {
        return -1, err
    }

    p /= 2
    s := p * (p - t.a) * (p - t.b) * (p - t.c)
    return math.Sqrt(s), nil
}

우리는 완전히 작동하는 예제를 가지고 있습니다.

그것은 객체를위한 메소드와 매우 흡사하게 보입니다.





go