方法的声明(定义)
- furie (recevier type) methodName (参数列表) (返回值列表){
- 方法体
- return返回值
- }
1)参数列表:表示方法输入
2) recevier type:表示这个方法和type这个类型进行绑定,或者说该方法作用于type类型
3) receiver type:type可以是结构体,也可以其它的自定义类型 type integer int
4) receiver:就是type类型的一个变量(实例),比如:Person结构体的一个变量(实例)
5)返回值列表:表示返回的值,可以多个
6)方法主体:表示为了实现某一功能代码块
7)return语句不是必须的。
1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
2)如果希望在方法中,修改结构体变量的值,可以通过结构体指针的方式来处理
为了提高效率,通常方法和结构体的指针类型绑定
- type person struct {
- name string
- }
-
- func (p *person) Test() {
- fmt.Printf("%p\n", p)
- }
-
- func main() {
- var p person
- fmt.Printf("%p\n", &p)
- p.Test()
-
- }
3)Golang中的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct,比如int,float32等都可以有方法
- package main
-
- import "fmt"
-
- type integer int
-
- func (i *integer) Test() {
- fmt.Println("i的地址为:", i, "i的值为:", *i)
- *i = 100
- }
-
- func main() {
- a := 9
- b := integer(a)
- fmt.Println("b的地址为:", &b, "b的值为:", b)
- b.Test()
- fmt.Println("修改过后的值为:",b)
-
- }
-
-
- b的地址为: 0xc0000180a8 b的值为: 9
- i的地址为: 0xc0000180a8 i的值为: 9
- 修改过后的值为: 100
4)方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。
5)如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出
如果实现了*person类型的String()方法,那么就会自动调用。
- type person struct {
- name string
- age int
- }
-
- func (p *person) String() string {
- str := fmt.Sprintf("name=%v age=%v", p.name, p.age)
- return str
- }
-
- func main() {
- p := &person{
- name: "lucas",
- age: 29,
- }
- fmt.Println(p)
- }
-
- name=lucas age=29
如果这里不是指针类型,而是值类型那么就不会调用
- package main
-
- import "fmt"
-
- type person struct {
- name string
- age int
- }
-
- func (p *person) String() string {
- str := fmt.Sprintf("name=%v age=%v", p.name, p.age)
- return str
- }
-
- func main() {
- p := person{
- name: "lucas",
- age: 29,
- }
- fmt.Println(p)
-
- }
-
- {lucas 29}