Golang 方法

★基本介绍

在某些情况下,我们需要声明方法,比如person结构体,除了有一些字段外,Person结构体还有一些行为,比如:可以说话、跑步等,这时候就要用方法才能实现。

Golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型都可以由方法,而不仅仅是struct。

★方法的声明和调用

type A struct {

  Num int

}

func (a A) test(){

  fmt。Println(a.Num)

}

package main

import (
    "fmt"
)

type Person struct {
    Name string
}

//给Person类型绑定一个方法
func (p Person) test() {
    fmt.Println("test()", p.Name)
}
func main() {
    var p Person
    p.test() //调用方法
}

★方法的调用和传参机制原理

说明:方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当做实参也传递给方法。

★方法注意事项和细节讨论

方法定义格式:

func (recevier type)methodName(参数列表) (返回值列表){
  方法体
  retutn 返回值
}

说明:

1)参数列表,表示方法输入

2)recevier type:表示这个方法和type这个类型进行绑定,或者说改方法作用于type类型

3)receiver type:type可以是结构体,也可以是其他的自定义类型

4)receiver:就是type类型的一个变量(实例),比如:Person结构体的一个变量

5)参数列表:表示方法输入

6)返回值类型:表示返回的值,可以多个

7)方法主体:表示为了实现某一功能代码块

8)return 语句不是必须的

注意事项:

1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式

2)如程序员希望在方法中,修改机构体变量的值,可以通过结构体指针的方式来处理

3)Golang中的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct,比如int,float32等都可以有方法

4)方法的访问范围控制的规则,和函数一样,方法名首字母小写,智能在本包访问,方法首字母大写,可以在本包和其他包访问

5)如果一个变量实现了string()这个方法,那么fmt.Pringtln默认会调用这个变量的String()进行输出

★方法和函数区别

1)调用方式不一样

  函数的调用方式:函数名(参数列表)

  方法的调用方式:变量.方法名(实参列表)

2)对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然

3)对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以

★创建结构体变量时指定字段值

Golang在创建结构体实例时,可以直接指定字段的值

方式1:

//定义一个结构体 Student
type Student struct{
    Name string
    Age int
}
func main(){
    
    var stu1 Student = Student{"tom",10}
    stu2 :=Student{"tom~",20}
    
    var stu3 Student = Student{
        Name: "mary",
        Age: 30,
    }
    stu4 := Student{
        Name: "mary~",
        Age: 30,
    }
    fmt.Println("stu1 = ",stu1)
    fmt.Println("stu2 = ",stu2)
    fmt.Println("stu3 = ",stu3)
    fmt.Println("stu4 = ",stu4)
}

方式2:

    var stu5 *Student = &Student{"smith",40}
    var stu6 *Student = &Student{
        Name:"scott",
        Age: 90,
    }
    fmt.Println("stu5 = ",stu5)
    fmt.Println("stu6 = ",stu6)

 

posted @ 2021-06-05 08:42  创客未来  阅读(316)  评论(0编辑  收藏  举报