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) {...}
수신기 유형
컴퓨터에서 작은 대상은 값을 복제할 때 속도가 빨라서 비지침 수신기를 사용하기에 적합하고, 큰 대상은 복제 성능이 비교적 낮기 때문에 지침 수신기를 사용하기에 적합하며, 수신기와 파라미터 간에 전달할 때 복제하지 않고 지침만 전달한다.
// 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.a
와 two1,b
의 값12
과 10
을 설정한다.이름two2
을 사용하여 실례화TwoInts
구조체, 구성원 변수 설정 구조체TwoInts
AddThem
, 설정 방법의 수신기 유형은 지침*TwoInts
, 반환tn.a + tn.b
의 정형값;따라서 구성원 값을 수정할 수 있으며 퇴출 방법에도 유효하다.다른 구성원 변수를 구성하는 방법AddToParam
, 설정 방법의 수신기 유형은 지침*TwoInts
, 반환tn.a + tn.b + param
의 정형값이다.main
함수를 각각 fmt.Println
와 AddThem
방법으로 호출하여 구성원 변수의 값을 얻는다.//
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
점 구조를 정의하고 Point
와 X
두 개의 정형화된 구성원 변수Y
구조에 대해 비지침 수신기의 Point
방법을 정의했다. 전송과 반환은 모두 Add
의 구조로 여러 점의 연속적인 효과를 편리하게 실현할 수 있다. 예를 들어Point
P4 := P1.Add( P2 ).Add( P3 )
과 p1
실례화 두 점p2
및 p1
두 점을 합한 후 결과를 반환하여 p2
result
와 result
와 X
를 더한 값은 예에서 비지침 수신기를 사용했기 때문에 Add () 방법은 읽기만 하는 방법과 유사해졌고 Add () 방법은 내부에서 구성원에 대해 어떠한 수정도 하지 않았다.### 함수와 방법의 차이
함수는 변수를 매개변수로 지정합니다:Function(recv).변수에서 방법이 호출되었습니다:recv.Method1()
참조 링크: 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}
*/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.