Golang 복합 데이터 유형: 메서드

6535 단어 golang

전통적인 대상방향 프로그래밍


대상방향 프로그래밍(OOP)에서 클래스와 대상은 대상방향 프로그래밍의 두 가지 주요 부분이다.하나의 클래스 (Class) 는 새로운 유형 (Type) 을 만들 수 있으며, 그 중에서 대상 (Object) 은 클래스의 실례 (Instance) 이다.이렇게 유추할 수 있다. 당신은 유형int의 변수를 가지고 있다. 즉, 정수를 저장하는 변수는 int류의 실례(대상)이다.
대상은 그것에 속하는 일반 변수를 사용하여 데이터를 저장할 수 있다.객체 또는 클래스에 종속된 이러한 변수를 필드(Field)라고 합니다.대상은 클래스에 속하는 함수를 사용하여 일부 기능을 실현할 수 있는데, 이런 함수를 클래스의 방법(Method)이라고 부른다.이 두 용어는 매우 중요하다. 함수와 변수, 어떤 것이 독립적이고, 어떤 것이 클래스나 대상에 속하는지 구분하는 데 도움이 된다.한 마디로 하면 필드와 메소드 통칭 클래스의 속성(Attribute)이다.

메서드


Golang에서 방법은 수신자(receiver)에 작용하는 함수이고 수신자는 특정한 유형의 변수이다.수신자는 구조체 형식, 함수 형식, int,boll,string 또는 그룹 별명 형식을 포함하여 임의의 형식 (바늘, 인터페이스 제외) 이 될 수 있습니다.
  • 수신자는 하나의 인터페이스 유형이 될 수 없다. 인터페이스는 추상적인 정의이기 때문에 방법은 반드시 구체적으로 실현해야 한다
  • 수신자는 하나의 바늘 형식이 될 수 없지만 다른 종류가 허용하는 바늘
  • 일 수 있다

    방법 재부팅


    유형의 코드와 그 위에 연결된 방법의 코드는 함께 놓지 않을 수 있으며, 서로 다른 원본 파일에 존재할 수 있으며, 유일한 요구는 같은 가방이어야 한다는 것이다.방법은 함수이기 때문에 마찬가지로 방법의 재부팅을 허용하지 않습니다. 즉, 한 유형에 대해 주어진 이름의 방법만 있을 수 있지만, 수신기 유형을 바탕으로 하면 재부팅이 있습니다.아래의 예와 같이 같은 이름을 가진 방법Add은 2개 또는 여러 개의 다른 수신기 유형*denseMatrix*sparseMatrix에 존재할 수 있다. 예를 들어 같은 가방에 이렇게 하는 것은 허용된다.
    //a      ,*denseMatrix *sparseMatrix      ,Add   ,b Matrix     ,Matrix     
    func (a *denseMatrix) Add(b Matrix) Matrix
    func (a *sparseMatrix) Add(b Matrix) Matrix

    수신기의 표준 형식

  • recv는 수신기 이름이고, receiver_type는 수신기 유형(수신기의 매개 변수 이름이 명명될 때 수신기 유형 이름의 첫 번째 소문자를 사용하는 것을 공식적으로 권장한다. 예를 들어 Socket 유형의 수신기 변수는 s로 명해야 한다)
  • methodName는 방법명, paramater_list는 매개 변수 목록, return_value_list는 반환값 목록
  • func (recv receiver_type)methodName(paramater_list)(return_value_list) {...}

    수신기 유형


    컴퓨터에서 작은 대상은 값을 복제할 때 속도가 빨라서 비지침 수신기를 사용하기에 적합하고, 큰 대상은 복제 성능이 비교적 낮기 때문에 지침 수신기를 사용하기에 적합하며, 수신기와 파라미터 간에 전달할 때 복제하지 않고 지침만 전달한다.
  • 바늘 유형은 바늘의 특성 때문에 방법을 호출할 때 수신기 바늘의 임의의 구성원 변수를 수정하고 방법이 끝난 후에 수정하는 것이 유효하다.바늘 유형의 수신기는 하나의 구조체의 바늘로 구성되어 대상을 향한this나self에 더욱 가깝다.그러나 Go는 this와self라는 두 가지 키워드가 없기 때문에 this와self를 수신자의 실례화 이름으로 사용할 수 있다(this와self는 일반적인 실례화 이름과 다름없다).
    //  TwoInts   
    type TwoInts struct {
        a int
        b int
    }
    func main(){
        two1 := new(TwoInts)//   ,    *TwoInts
        two1.a = 12
        two1.b = 10
        //  AddThem  
        fmt.Println(two1.AddThem())
        //  AddToParam  
        fmt.Println(two1.AddToParam(20))
    
        two2 := TwoInts{3,4} //   ,     TwoInts{3,4}
        //  AddThem  
        fmt.Println(two2.AddThem())
    }
    //             
    func (tn *TwoInts)AddThem()int{
        return tn.a + tn.b
    }
    //             
    func (tn *TwoInts)AddToParam(param int)int{
        return tn.a + tn.b + param
    }
    
    /*
    22
    42
    7
    */
    코드 설명:
  • 하나TwoInts 구조를 정의하고 두 개의 정형적인 구성원 변수를 가진다.이름two1을 사용하여 실례화TwoInts 구조체를 사용하고 반환 바늘 유형*TwoInts을 각각 실례화 구성원 변수two1.atwo1,b의 값1210을 설정한다.이름two2을 사용하여 실례화TwoInts 구조체, 구성원 변수 설정 구조체TwoInts
  • 구성원 변수를 구성하는 방법AddThem, 설정 방법의 수신기 유형은 지침*TwoInts, 반환tn.a + tn.b 의 정형값;따라서 구성원 값을 수정할 수 있으며 퇴출 방법에도 유효하다.다른 구성원 변수를 구성하는 방법AddToParam, 설정 방법의 수신기 유형은 지침*TwoInts, 반환tn.a + tn.b + param의 정형값이다.
  • 함수에서 main 함수를 각각 fmt.PrintlnAddThem 방법으로 호출하여 구성원 변수의 값을 얻는다.

  • 비포인터 형식은 방법이 비포인터 수신기에 작용할 때 Go 언어는 코드가 실행될 때 수신기의 값을 복사하여 비포인터 수신기의 방법에서 수신기의 구성원 값을 얻을 수 있으나 수정된 후에 무효다.
    //      
    type Point struct {
        X int
        Y int
    }
    //           
    func (p Point) Add(other Point) Point {
        //                
        return Point{p.X + other.X, p.Y + other.Y}
    }
    func main() {
        //     
        p1 := Point{3, 4}
        p2 := Point{2, 5}
        //         
        result := p1.Add(p2)
        //     
        fmt.Println(result.X,result.Y,result)
    }
    
    /*
    5 9 {5 9}
    */
    코드 설명:
  • 하나의 AddToParam점 구조를 정의하고 PointX 두 개의 정형화된 구성원 변수
  • 를 보유한다.
  • Y 구조에 대해 비지침 수신기의 Point 방법을 정의했다. 전송과 반환은 모두 Add의 구조로 여러 점의 연속적인 효과를 편리하게 실현할 수 있다. 예를 들어Point
  • P4 := P1.Add( P2 ).Add( P3 )p1실례화 두 점
  • p2p1 두 점을 합한 후 결과를 반환하여 p2
  • 에 저장
  • 인쇄 결과resultresultX를 더한 값은 예에서 비지침 수신기를 사용했기 때문에 Add () 방법은 읽기만 하는 방법과 유사해졌고 Add () 방법은 내부에서 구성원에 대해 어떠한 수정도 하지 않았다.


  • ### 함수와 방법의 차이
    함수는 변수를 매개변수로 지정합니다:Function(recv).변수에서 방법이 호출되었습니다:recv.Method1()
  • 수신자가 지침일 때 방법은 수신자의 값과 상태를 바꿀 수 있다.(메서드의 경우)
  • 매개 변수가 바늘로 전달될 때, 즉 인용을 통해 호출될 때 함수도 매개 변수의 상태를 바꿀 수 있다.(함수에 대해서)
  • ### Golang 설계 모델의 공장 접근 방식
    참조 링크: Golang 디자인 모델의 공장 방법(굴금)
    대상방향 프로그래밍에서 구조자 방법을 통해 공장 모델을 실현할 수 있지만 Golang은 대상방향 프로그래밍 언어가 아니기 때문에 구조자 방법을 사용하여 디자인 모델을 실현할 수 없고 이에 상응하여 다른 방안을 제공했다.구조체를 예로 들면 구조체 유형에 따라 공장을 정의하는데 공장의 이름은 Y 또는new로 시작한다.
    //       ,     
    type File struct {
        fd int
        name string
    }
    
    //      
    func NewFile(fd int,name string) *File{
        if fd < 0 {
            return nil
        }
        return &File{fd,name}
    }
    
    func main() {
        //      NewFile
        f := NewFile(10,"./test.yxy")
        fmt.Println(f)
        //           
        size := unsafe.Sizeof(File{})
        fmt.Println(size)
    }
    
    /*
    &{10 ./test.yxy}
    24
    */

    코드 설명:
  • 이니셜을 대문자로 하고 구조 함수를 강제로 사용하지 않으며 구조체 생성New
  • 이 구조체를 위한 공장 방법File을 구축하고 구조체를 가리키는 지침NewFile
  • 으로 돌아간다.
  • 함수에서 이 공장 방법을 호출
  • 공장 방법을 강제적으로 사용하면 가시성을 적용함으로써 *File 함수를 사용하지 못하게 하고 사용자에게 공장 방법을 강제로 사용함으로써 유형을 사유로 전환시킬 수 있다.
    ### 포인터 또는 값을 받는 사람
    수신자의 데이터를 바꾸는 방법을 원한다면 수신자의 바늘 형식에 따라 이 방법을 정의합니다.그렇지 않으면 일반적인 값 형식에서 방법을 정의합니다.main 가리키는 지침new을 받고 내부 구성원을 바꾼다.change() 값을 복사하여 수신B하고 write()만 출력합니다.
      type B struct {
          thing int
      }
      
      func (b *B) change() {
          b.thing = 1
      }
      
      func (b B) write() string { 
          return fmt.Sprint(b) 
      }
      
      func main() {
          var b1 B // b1  
          b1.change()
          fmt.Println(b1.write())
      
          b2 := new(B) // b2   
          b2.change()
          fmt.Println(b2.write())
      }
      
      /* 
      {1}
      {1}
      */

    좋은 웹페이지 즐겨찾기