방법 :( 중요한 대중 참여 메커니즘과 원칙을 불러!)
설명 : 메소드 호출과 대중 참여 메커니즘과 기능은 기본적으로 동일하지 같은 장소는 메서드에 전달 또한 인수로, 메소드를 호출, 변수 메소드 호출이다. 우리가 설명하자 :
사례 1 : 실행의 방법은 전면 getSum에 도시되고 설명 +
설명 :
1) 상기 호출기구를 호출하고이를 작동 변수를 채택.
변수가 변수 자체도 길을 갈 수있는 인자로 전달 될 때 2)하지 같은 장소, 방법을 호출합니다. (변수 값 유형 인 경우, 변수 참조 형식 인 경우, 값은 어드레스 복사, 복사)
사례 2 : 프로그램을 작성, 다음과 같은 :
1) 선언 구조 Cirle 필드 반경
2) 방법 선언 영역 Cirle 바인딩,이 영역으로 복귀 할 수있다.
3) 팁 : 그리기 프로세스 영역 수행 + 설명
사용 된 방법의 깊이 분석 :
메소드 선언 (정의)
FUNC (recevier 형) methodName로 (매개 변수 목록) (반환 된리스트) {
메서드 본문의
반환 반환 값
}
파라미터 1) 목록 : 입력 표현
2) recevier 유형 : 방법이 유형이 결합, 또는 방법 이동형의 유형 것을 나타낸다
3) recevier 타입 : 타입의 구조 일 수 있고, 사용자의 다른 형태 일 수있다
4) recevier 타입 :) 실시 예 (가변 인 구조 : 변수 (실시 예)와 같은 형이며
5) 값들의 목록을 반환 : 반환을 나타내는 값이 복수 일 수있다
도 주 6)에있어서, 해당 소정의 기능 블록을 실현하기 위해서
7) return 문은 필요하지 않습니다
방법 고려 사항 및 세부 사항을 토론
1) 구조 유형 값 유형 메소드 호출에서, 컴플라이언스 값 형 변속기구는 값 전송 모드 복사된다
프로그래머가 처리하고자하는 경우 2), 가변 구조물의 값을 수정 구조 포인터에 의해 처리 될 수있다
사례 발표 :
원형 구조체 {입력
반경을 float64
}
@ 일반적으로 바인딩 유형과 구조 포인터 우리의 방법의 효율성을 향상시키기 위해
FUNC를 (ㄴ * 원) 에리어 () float64 {
C 포인터이며, 그 분야의 때문에 접근이 우리의 표준이기 때문에 //을 (* C). RADIUS는
3.14 * (* C)의 .radius * (* C) .radius 리턴 //
//(*c).radius 등가 c.radius의
c.radius = 10.0
3.14 c.radius 복귀 * c.radius
}
FUNC 메인 () {
서클 C의 VAR의
c.radius = 7.0
// RES2 = (c) .area2 ()
RES2 : c.area2 = ()
// 바닥 최적화 컴파일러 (c) .area2 () 등가 c.ares2 ()
// 컴파일러는 자동적으로 C 및 추가되므로
fmt.Println ( "= 면적"RES2)
fmt.Println ( "c.radius ="c.radius) // 10
}
3)는 지정된 데이터 유형에 Golang 동작에있어서 (즉 :) 바인딩 지정된 데이터 유형, 따라서 정의 된 유형 int와 같은 구조체보다 오히려 방법을 가질 수 있으므로있을 수 float32 방법
케이스 :
주에 대한 패키지 페널티
가져 오기 (
"FMT"
)
형 정수 INT
FUNC (I 정수) 출력 () {
fmt.Println ( "I ="I)
}
// 방법을 쓰고 난 값 변경
{FUNC (나는 정수 *) 변경 ()
내가 * + * = I. (1)
}
FUNC 주 () {
VAR 정수 I = 10
i.print ()
i.change ()
fmt.Println ( "I ="I)
}
액세스 범위 룰 4) 제어 방법, 및 기능. 메소드의 이름 첫 글자를 소문자는 전용 액세스 방법을 대문자로 할 수있는이 패키지는,이 패키지와 다른 패키지에 액세스 할 수 있습니다.
형식 문자열 ()이 메소드를 구현하는 경우 5) 다음 fmt.Println는 기본 문자열이 변수 ()를 호출 출력
케이스 :
형 학생 구조체 {
이름 문자열
나이 INT
}
FUNC (STU * 학생) 문자열 () 문자열 {
STR : = fmt.Sprintf ( "이름 = [%의 V] 나이 = [%의 V]"stu.Name, stu.Age)
반환 STR
}
FUNC 메인 () {
STU : 학생 = {
이름 : "톰",
나이 : 20
}
당신이 방법 * 학생 문자열 유형을 구현하는 경우 // 자동으로 호출
fmt.Println (STU)를
}
메소드와 함수의 차이 :
1) 다른 방법으로 전화
함수가 호출된다 (인수리스트) 함수명
메소드 호출 : 메소드 이름 변수 (인수리스트)
2) 일반 함수를 들면, 수신자가 치형 포인터 타입 데이터를 직접 전송 될 수 없다
案例:
Person 형 구조체 {
이름 문자열
}
FUNC의 test01 (P 사람) {
fmt.Println (p.Name)
}
FUNC의 test02 (P는 * 사람) {
fmt.Println (p.Name)
}
FUNC 메인 () {
P- 형 다음 이용시 = { "톰"}
값이 복사되기 때문에 test01 (P- 형)이 //는 어드레스 test01 (* P)를 통과 할 수 있도록 기록이 불평
이 사본이기 때문에, (P) test02을 // 어드레스는 직접적 값이 아닌 복사, test02 (P) 그래서 오류가 기록됩니다.
}
3) 방법 (예를 들어, 구조체에있어서), 상기 수신기는, 값 유형이 방법은 다시 동일해도 입력 포인터의 변수에 의해 직접 호출 될 수있다.
案例:
Person 형 구조체 {
이름 문자열
}
FUNC (p 사람) test03 () {// 메인 중계 어드레스로서 기능하지만, 비록 오직 다음 방법이 있으므로, P의 값은 단자의 수신 된 사본 때 여기서 메인 함수 값 값은 변경되지 않습니다.
= p.Name "잭"
fmt.Println ( "TEST03 () =", p.Name) // 잭
}
FUNC (p * 이용시) test04는 ( ) {// 포인터 타입 때문에, 상기 수신 된 어드레스에 대한 포인터 일 것이다 메소드의 이름 값의 변화의 주된 기능은 값을 변경하는 것이다.
= p.Name "마리아"
fmt.Println ( "test04 () =", p.Name) // 메리
}
FUNC 메인 () {
P = {인격 "톰"}
p.test03 ()
fmt.Println ( "주 () = p.name", p.Name) // 톰
(P &) .test03 () 양식에서 전달됩니다 // 주소는 있지만 본질은 복사본의 값 유지
fmt.Println ( "메인 p.name ="p.Name) // 톰
(P- 형 및) .test04 ()
fmt.Println ( "메인 () p.name ="의 P-. 이름) // 메리
p.test04 () // 상당 (& P) .test04는 () 양식에서 값 유형을 통과하지만, 여전히 본질적으로 주소를 복사한다
}
요약 :
1) 상관없이 호출의 형태의 실제 결정은이 방법이 주로 볼과 결합하는 형태이다 복사본의 값 또는 주소를 복사한다.
2) 값)와 같은 P 사람 (AS, 결합 유형 값이 복사되고, 포인터는 P * 이용시 (구속력의 일종) 인 경우, 어드레스를 복사 한 경우.