首页 > 其他分享 >golang 方法( method )

golang 方法( method )

时间:2023-03-07 18:45:35浏览次数:40  
标签:test1 Name fmt t1 golang func main 方法 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)
}

执行结果

张三

标签:test1,Name,fmt,t1,golang,func,main,方法,method
From: https://www.cnblogs.com/LI-XinYu/p/17153886.html

相关文章

  • golang 结构体(struct)
    1.结构体定义Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Gelang是基于struct来实现OOP特性的。结构体由一系列命名的......
  • 计算字符串多少bytes方法
    /*@param{String}str*@param{String}charsetutf-8,utf-16*@return{Number}*/varsizeof=function(str,charset){vartotal=0,char......
  • shell常用的方法
    Shell数组:关联数组使用declare命令来声明,语法格式如下:declare-Asitesite["google"]="www.google.com"site["runoob"]="www.runoob.com"site["taobao"]="www.taobao.......
  • 360安全浏览器使用IE7内核打开网站的设置方法
    1、首先打开电脑中的360安全浏览器,在浏览器右上角可以看到一个由三条横线组成“打开菜单”图标,使用鼠标点击该图标2、点击之后后弹出360安全浏览器的菜单窗口,在窗口中点......
  • HTMLReport使用2 | HTMLReport使用方法详解
    (2|HTMLReport的使用)注:以下实例来源于官网。1日志为测试报告中添加过程日志;多线程下,在报告中会分别记录每个线程的日志,同时会产生与测试报告同名的测试log文件。......
  • Docker启动RabbitMQ访问15672连接超时解决方法
    docker成功启动rabbitmq后访问15672端口报连接超时原因:rabbitmq默认web界面管理插件是关闭的,需要通过命令开启解决办法:1、查看rabbit的容器id:dockerps2、进入......
  • Java函数(方法)的默认值问题
    Java函数(方法)的默认值问题 Java不能为函数(方法)设置默认参数。原因是“默认参数”和“方法重载”同时支持的话有二义性的问题,但使用“方法重载”可以间接地实现”默认......
  • 创建型:工厂模式-工厂方法、抽象工厂
    问题简单工厂中我们通过参数来返回不同的产品对象,如果管理的对象过多,这个工厂函数会比较庞大,且当我们需要增加一个新的产品时,需要修改这个工厂方法,违反开闭原则(对拓展开......
  • uni-app 组件传值 props 对象中传有方法, 小程序上被过滤
    uni-app组件传值props对象中传有方法,微信小程序上会被过滤,uniapp小程序props传值丢失uniapp中父组件向子组件传递prop时,如果prop是对象,对象内部不能包含function属......
  • 财务软件打开乱码问题处理方法(自然人报税扣缴、etax3.0、鼎信诺等)
    1、首先保证电脑的系统区域、输入法区域、时区都处于中国,日期格式为yyy/MM/dd格式,设置完成后重启计算机。系统区域、输入法区域和时区可以根据这篇文章的方法查询:命令查看......