>백엔드 개발 >Golang >Go 언어의 함수와 메소드의 차이점은 무엇입니까?

Go 언어의 함수와 메소드의 차이점은 무엇입니까?

王林
王林원래의
2021-02-07 11:56:355420검색

Go 언어의 함수와 메소드의 차이점: 일반 함수의 경우 수신자가 값 유형인 경우 포인터 유형 데이터를 메소드에 직접 전달할 수 없으며, 수신자가 값 유형인 경우 메소드를 직접 호출할 수 있습니다. 포인터 유형 변수로.

Go 언어의 함수와 메소드의 차이점은 무엇입니까?

이 기사의 운영 환경: windows10 시스템, Go 1.11.2, thinkpad t480 컴퓨터.

함수와 메소드의 차이점에 대한 공식 설명: 메소드는 수신자를 포함하는 함수입니다. 수신자는 명명된 값이나 구조 유형 또는 포인터일 수 있습니다. 특정 유형의 모든 메소드는 해당 유형의 메소드 세트에 속합니다.

차이점:

1. 일반 함수의 경우: 수신자(함수 매개변수)가 값 유형인 경우 포인터 유형 데이터를 직접 전달할 수 없으며 그 반대도 마찬가지입니다.

func function_name([parameter list]) [return_types] {
   函数体
}

2. 메서드(예: 구조체 메서드): 수신자가 값 형식인 경우 포인터 형식 변수를 사용하여 메서드를 직접 호출할 수 있으며 그 반대도 가능합니다.

func (variable_name variable_data_type) function_name() [return_type]{
   /* 函数体*/
   }

메서드와 함수의 차이점을 확인할 수 있습니다. 메소드는 func 키워드에 있습니다. 마지막은 함수 이름 대신 수신자입니다. 수신자는 스스로 정의한 유형일 수 있으며, 이 유형은 구조체, 인터페이스일 수도 있고 기본 데이터 유형을 재정의할 수도 있습니다.

Go 함수

함수는 작업을 수행하는 기본 코드 블록입니다.

Go 언어에는 최소한 main() 기능이 있습니다.

기능을 통해 다양한 기능을 나눌 수 있습니다. 논리적으로 각 기능은 지정된 작업을 수행합니다.

함수 선언은 컴파일러에게 함수의 이름, 반환 유형 및 매개 변수를 알려줍니다.

Go 함수는 여러 값을 반환할 수 있습니다.

Go 언어 표준 라이브러리는 사용할 수 있는 다양한 내장 기능을 제공합니다. 예를 들어, len() 함수는 다양한 유형의 인수를 허용하고 해당 유형의 길이를 반환할 수 있습니다. 문자열을 전달하면 문자열의 길이가 반환되고, 배열을 전달하면 배열에 포함된 요소의 개수가 반환됩니다.

1. 값 전송: 값 전송은 함수 호출 시 실제 매개변수의 복사본을 함수에 복사하는 것을 의미하므로, 함수에서 매개변수가 수정되더라도 실제 매개변수는 영향을 받지 않습니다.

2. 참조로 전달한다는 것은 함수를 호출할 때 실제 매개변수의 주소를 함수에 전달하는 것을 의미합니다. 그런 다음 함수의 매개변수를 수정하면 실제 매개변수에 영향을 미칩니다.

Go 메소드

Go 언어에는 함수와 메소드가 모두 있습니다. 메소드는 명명된 값이나 구조 유형 또는 포인터일 수 있는 수신자를 포함하는 함수입니다. 특정 유형의 모든 메소드는 해당 유형의 메소드 세트에 속합니다.

다음은 이 유형의 구조 유형과 메소드를 정의합니다.

package mainimport (   "fmt"  )/* 定义结构体 */type Circle struct {
  radius float64
}func main() {  var c1 Circle
  c1.radius = 10.00
  fmt.Println("Area of Circle(c1) = ", c1.getArea())
}//该 method 属于 Circle 类型对象中的方法func (c Circle) getArea() float64 {  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}

(동영상 공유 학습: 프로그래밍 입문)

위 코드의 실행 결과는 다음과 같습니다.

Area of Circle(c1) =  314

Example

 package structTest  
      
    //普通函数与方法的区别(在接收者分别为值类型和指针类型的时候)  
    //Date:2014-4-3 10:00:07  
      
    import (  
        "fmt"  
    )  
      
    func StructTest06Base() {  
        structTest0601()  
        structTest0602()  
    }  
      
    //1.普通函数  
    //接收值类型参数的函数  
    func valueIntTest(a int) int {  
        return a + 10  
    }  
      
    //接收指针类型参数的函数  
    func pointerIntTest(a *int) int {  
        return *a + 10  
    }  
      
    func structTest0601() {  
        a := 2  
        fmt.Println("valueIntTest:", valueIntTest(a))  
        //函数的参数为值类型,则不能直接将指针作为参数传递  
        //fmt.Println("valueIntTest:", valueIntTest(&a))  
        //compile error: cannot use &a (type *int) as type int in function argument  
      
        b := 5  
        fmt.Println("pointerIntTest:", pointerIntTest(&b))  
        //同样,当函数的参数为指针类型时,也不能直接将值类型作为参数传递  
        //fmt.Println("pointerIntTest:", pointerIntTest(b))  
        //compile error:cannot use b (type int) as type *int in function argument  
    }  
      
    //2.方法  
    type PersonD struct {  
        id   int  
        name string  
    }  
      
    //接收者为值类型  
    func (p PersonD) valueShowName() {  
        fmt.Println(p.name)  
    }  
      
    //接收者为指针类型  
    func (p *PersonD) pointShowName() {  
        fmt.Println(p.name)  
    }  
      
    func structTest0602() {  
        //值类型调用方法  
        personValue := PersonD{101, "Will Smith"}  
        personValue.valueShowName()  
        personValue.pointShowName()  
      
        //指针类型调用方法  
        personPointer := &PersonD{102, "Paul Tony"}  
        personPointer.valueShowName()  
        personPointer.pointShowName()  
      
        //与普通函数不同,接收者为指针类型和值类型的方法,指针类型和值类型的变量均可相互调用  
    }

관련 권장 사항 : golang 튜토리얼

위 내용은 Go 언어의 함수와 메소드의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.