golang 方法( method )

1. 方法的定义

方法总是绑定对象实例,并隐式的将实例作为第一实参(receiver),receiver可以是基础类型,也可以是指针类型,这会关系到是否需要有可以修改对象实例的能力。

2. 方法的声明和调用

方法的创建语法:

func (recevier type) methodName(参数列表)(返回值列表){}

方法的调用

package main

import "fmt"

type People struct { //定义一个People的结构体,包含姓名,年龄,爱好
	SurName string
	Age     int
	hobby   string
}

func (p People) Play() { //创建一个方法,输出这个人的爱好
	fmt.Printf("%v,年龄为%v,爱好为%v", p.SurName, p.Age, p.hobby)
}

func (p People) login(name string, pwd int) bool { //创建一个登陆方法,绑定方法People,传入name和pwd,返回一个bool类型的登陆状态
	fmt.Printf("姓名为:%v,登陆账号为:%v,密码为:%v\n", p.SurName, name, pwd) //输出传入信息
	if name == "li" && pwd == 123456 { //判断传入进来的账号密码信息
		return true //正确返回true
	} else {
		return false //错误返回false
	}
}

func main() {
	li := People{ //创建一个People的实例
		"李",
		25,
		"玩游戏",
	}
	li.Play() //调用play方法
	fmt.Println()
	loginState := li.login("li", 123456) //调用login方法,并将登陆状态赋值到loginState
	fmt.Printf("登陆状态为:%v", loginState) //打印登陆状态
}

执行结果

李,年龄为25,爱好为玩游戏
姓名为:李,登陆账号为:li,密码为:123456
登陆状态为:true 

3. 指针接收器与非指针接收器

由于指针的特性,修改指针接收器的任意成员,在方法调用结束之后,会对原有的数据产生效果
而非指针接收器是值拷贝一份,方法内修改接收器的成员,在方法结束之后不影响原有值

package main

import "fmt"

type test1 struct {
	Name string
	Age  int
}

func (t test1) method1() { //传入结构体的值类型
	t.Name = "李四"
	fmt.Printf("method1中修改后的Name:%v\n", t.Name)
}

func (t *test1) method2() { //传入结构体的指针类型
	(*t).Name = "王五"                               //自动解引用,等价于t.Name = "王五"
	fmt.Printf("method2中修改后的Name:%v\n", (*t).Name) //(*t).Name可以省略为t.Name
}

func main() {
	t1 := test1{
		Name: "张三",
		Age:  30,
	}

	t2 := &test1{
		Name: "张三",
		Age:  30,
	}

	t1.method1()
	fmt.Printf("执行完method1后,t1实例的值:%v\n", t1)
	t2.method2()
	fmt.Printf("执行完method2后,t1实例的值:%v\n", *t2) 
}

执行结果

method1中修改后的Name:李四
执行完method1后,t1实例的值:{张三 30}
method2中修改后的Name:王五           
执行完method2后,t1实例的值:{王五 30}

4. 方法的注意事项

4.1 方法的receiver type并非一定要是struct类型,type定义的类型别名、slice、 map、channel、func类型等都可以。

package main

import "fmt"

type Newint int

func (i Newint) test1() {
	fmt.Println(i)
}

func main() {
	var t1 Newint = 10
	t1.test1()
}

执行结果

10

4.2 如果一个类型实现了String方法,那么fmt.Println默认会调用String进行输出。

package main

import "fmt"

type test1 struct {
	Name string
}

func (t test1) String() string { //定义一个方法名为String
	var str string
	str = t.Name
	//str = fmt.Printf("name=%v,age=%v", t.Name, t.Age)
	return str
}

func main() {
	t1 := test1{ //构件一个实例
		Name: "张三",
	}
	fmt.Println(t1)
}

执行结果

张三
posted @ 2023-03-07 18:30  XIN-0808  阅读(16)  评论(0编辑  收藏  举报