>백엔드 개발 >Golang >Go 언어에서 구조 메소드를 정의하는 방법

Go 언어에서 구조 메소드를 정의하는 방법

青灯夜游
青灯夜游원래의
2023-01-17 14:06:412631검색

Go 언어에서 구조 메서드를 정의하는 방법: 1. "type point struct {....}" 구문으로 구조를 정의합니다. 2. "func( 수신자 변수 수신자 유형) 메소드 이름(매개변수 목록) (반환 값 목록) {//메소드 본문}". Go 언어에서 수신자의 유형은 구조체뿐만 아니라 구조체 유형이 아닌 모든 유형이 될 수 있습니다.

Go 언어에서 구조 메소드를 정의하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

구조 방식

Go 언어에는 함수와 메서드가 모두 있습니다. 메서드의 본질은 함수이지만 메서드와 함수는 서로 다른 점을 가지고 있습니다.

함수는 코드 재사용을 위해 여러 번 호출할 수 있는 독립적인 함수가 포함된 코드 조각입니다.

메서드(Method)는 클래스의 동작 함수로, 이 클래스의 객체에 의해서만 호출될 수 있습니다.

Go 언어의 메소드는 특정 유형의 변수에 작용하는 함수입니다. 이러한 특정 유형의 함수를 Receiver수신기의 개념은 객체 지향 언어의 this 또는 self 키워드와 유사합니다.

Go 언어 수신자는 메소드에는 액션 객체가 있고 함수에는 액션 객체가 없다는 점을 강조합니다.

Go 언어에서 수신자의 유형은 구조체뿐만 아니라 구조체 유형이 아닌 모든 유형이 될 수 있습니다. (정수, 문자열, 슬라이스, 맵, 심지어 함수 등)

수신자가 다른 한 메서드 이름은 동일할 수 있습니다.

오버라이드된 메소드는 있지만 오버로드된 메소드는 없습니다(오버로드된 메소드는 지원되지 않습니다. 즉, 이름은 같지만 매개변수가 다른 메소드는 정의할 수 없습니다.)

구조 메소드 정의

수신자는 다음을 수행할 수 있습니다. 구조체 유형이거나 비구조체 유형입니다. 는 포인터 유형일 수도 있고 포인터가 아닌 유형일 수도 있습니다.

수신기에서 변수 이름을 지정할 때 수신기 유형의 첫 번째 소문자를 사용하는 것이 공식적으로 권장됩니다.

// 定义方法的语法格式:
func (接收者变量 接收者类型) 方法名(参数列表) (返回值列表){
    //方法体
}

// 定义结构体
type point struct {
    X int
    Y int
}

// 定义结构体方法
func (p point) print() {
    fmt.Println(p.X, p.Y)
}

포인터 수신기

go 함수는 각 인수 변수를 복사합니다. 인수가 너무 커서 전체 인수를 복사하지 않으려면 포인터를 사용하여 변수의 주소를 전달할 수 있습니다. .

포인터 수신기가 메서드를 호출하면 컴파일러는 변수의 암시적 변환을 수행합니다.

type point struct {
    X int
    Y int
}
func (p point) Print() {
    fmt.Println(p.X, p.Y)
}
func (p *point) ScaleBy(factor int) {
    p.X *= factor
    p.Y *= factor
}
func main() {
    p := point{1,1}
    ptr := &p
    p.Print()   //1. 正确
    ptr.Print() //2. 正确
    p.ScaleBy(2)      //3. 正确
    ptr.ScaleBy(2)    //4. 正确
    point{1,1}.Print()    //5. 正确
    (&point{1,1}).Print() //6. 正确
    (&point{1,1}).ScaleBy( 2) //7. 正确
    point{1,1}.ScaleBy( 2)    //8. 错误
}

nil은 합법적인 수신자입니다. 일부 함수가 실제 매개변수로 nil 포인터를 허용하는 것처럼, 메소드의 수신자는 nil 포인터를 허용합니다

// 定义结构体
type A struct {
    Data int
}

// 定义结构体方法
func (a *A) FunPtrA() {
    fmt.Println("FunPtrA")
}

func main() {
    
    // 声明结构体变量
    var ptrA *A
    
    // 将 nil 赋值给结构体变量
    ptrA = nil
    
    // 调用结构体方法
    ptrA.FunPtrA()  //FunPtrA
}

메서드의 상속 및 재정의

// 声明 human 结构体
type human struct {
	name, phone string
	age         int8
}
 
// student 继承 human 结构体 所以继承 human 的方法
type student struct {
	human
	school string
}
 
// employee 继承 human 结构体 所以继承 human 的方法
type employee struct {
	human
	company string
}
 
// human 定义 sayHi 方法
func (h human) sayHi() {
	fmt.Printf("我是%s,年龄%d,联系方式%s \n", h.name, h.age, h.phone)
}


// 方法的继承
func testMethod11(){
        // student 继承 human 所以有 sayHi 方法, employee 同理
	s1 := student{human{"s1","138001",13},"第一中学"}
	e1 := employee{human{"e1","138002",30},"第一企业"}
	s1.sayHi()    //我是s1,年龄13,联系方式138001
	e1.sayHi()    //我是e1,年龄30,联系方式138002
}


// 方法的重写 此为重写 非重载
func (s student) sayHi(){
	fmt.Printf("我是%s,年龄%d,我在%s上学,联系方式%s \n", s.name, s.age, s.school,s.phone)
}
 
func testMethod12(){
	s1 := student{human{"s1","138001",13},"第一中学"}
	s1.sayHi()    //我是s1,年龄13,我在第一中学上学,联系方式138001
}

프로세스 -지향 및 객체 지향

//面向过程
func Add01(a, b int) int {
	return a + b
}
 
//面向对象,方法:给某个类型绑定一个函数
type long int
 
//tmp叫接收者,接收者就是传递的一个参数
func (tmp long) Add02(other long) long  {
	return tmp + other
}
 
func main() {
	var result int
	result = Add01(1, 2) //普通函数调用方式
	fmt.Println("result = ", result)
 
	//定义一个变量
	var a long = 2
	//调用方式格式: 变量名,函数(所需参数)
	r := a.Add02(2)
	fmt.Println("r = ", r)
 
}

[관련 추천: Go 비디오 튜토리얼, 프로그래밍 교육]

위 내용은 Go 언어에서 구조 메소드를 정의하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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