陶瓷网站源码,网站关键字选择标准,服装外包加工网,wordpress可视化编辑插件方法#xff1a; 方法是绑定在自定义类型上的#xff0c;常用在结构体上 方法只能通过绑定的自定义类型的变量来调用#xff0c;方法不能直接调用#xff0c;因为方法是和类型作关联的 方法是值拷贝的传递方式#xff0c;如果希望改变结构体变量的值#xff0c;需要通过…方法 方法是绑定在自定义类型上的常用在结构体上 方法只能通过绑定的自定义类型的变量来调用方法不能直接调用因为方法是和类型作关联的 方法是值拷贝的传递方式如果希望改变结构体变量的值需要通过结构体指针实现 方法名首字母大写为公共小写为私有与函数一致
创建格式
func (对象 类型) 方法名 (参数列表) (返回值列表){}调用
对象.方法名演示方法是值拷贝在方法中修改是不会影响原数据的
type Student struct {name string
}// 创建了一个StudentMethod方法绑定了Student可以称为Student的方法
// s是Student的变量可以用来调用Student的成员
func (s Student) StudentMethod() {fmt.Println(我是Student的方法)fmt.Println(StudentMethod修改前, s.name)s.name 韩信fmt.Println(StudentMethod修改后, s.name)
}func main() {stu : Student{itzhuzhu}stu.StudentMethod() // 调用方法fmt.Println(main运行修改后, stu.name)
}输出
我是Student的方法
StudentMethod修改前 itzhuzhu
StudentMethod修改后 韩信
main运行修改后 itzhuzhu三种不同调用的方式
type Student struct {name stringage int
}func (s *Student) StudentMethod() {fmt.Println(*s)
}func main() {// 普通方式调用s : Student{name: 韩信, age: 99}s.StudentMethod()// 方法值调用x : s.StudentMethodx()fmt.Printf(查看数据类型%T, x)// 方法表达式调用要和方法对象的类型保持一致方法对象是指针类型这里也要加上*y : (*Student).StudentMethody(s)
}带参数的方法
type Count struct{}func (c Count) count(n int) {result : 0for i : 0; i n; i {result i}fmt.Println(result)
}func main() {c : Count{}c.count(100)
}带参数和返回值的方法返回xy的和
type Count struct{}func (c Count) CountMethod(x, y int) int {return x y
}func main() {c : Count{}// 调用的时候要先有一个变量接收否则接收不到返回值countMethod : c.CountMethod(10, 20)fmt.Println(countMethod)
}变量调用方法时该变量也会作为一个参数传递到方法如果是引用类型则进行地址拷贝否则为值拷贝
type Test struct{}func (t Test) TestMethod(x, y int) int {/*这里的变量t和main方法中的变量t不是同一个t因为是值拷贝所以main栈调用TestMethod方法时会将main栈的t拷贝一份到TestMethod方法中如果是指针那么拷贝的是内存地址*/return x y
}func main() {t : Test{}testMethod : t.TestMethod(1, 2)fmt.Println(testMethod)
}指针类型使用方法
type Test struct {num int
}func (t *Test) TestMethod(x, y int) int {t.num 2fmt.Println(TestMethod修改为2, t.num)return x y
}func main() {t : Test{}t.num 1fmt.Println(传递TestMethod方法前, t.num)testMethod : (t).TestMethod(1, 2)fmt.Println(调用完方法后, t.num)fmt.Println(t)// 也可以简写成以下模式因为编译器在底层做了优化在编译时会自动加上()testMethod2 : t.TestMethod(1, 2)fmt.Println(testMethod)fmt.Println(testMethod2)
}输出
传递TestMethod方法前 1
TestMethod修改为2 2
调用完方法后 2
{2}
TestMethod修改为2 2
3
3方法可以作用在指定的数据类型上所有的自定义类型都可以有方法除struct外int、float也可以有方法
type integer intfunc (i integer) print() {fmt.Println(print方法, i)
}func (i *integer) change() {fmt.Println(change方法, i)
}
func main() {var i integer 10i.print()i.change()fmt.Println(main方法, i)
}输出
print方法 10
change方法 0x14000124008
main方法 10如果一个类型实现了String()方法那么输出时会默认调用String()
type Student struct {name stringage int
}func (stu *Student) String() string {return String方法执行
}func main() {stu : Student{不知火舞, 99}fmt.Println(stu)
}输出
String方法执行方法重写
方法重写是父类中的方法与子类方法重名的问题默认调用子类的方法如果需要使用父类的需要使用子类.父类.方法名调用
// 父类
type Person struct {name stringage int
}func (p *Person) Show() {fmt.Println(我是Person的show方法)
}// 子类
type Student struct {Person
}func (s *Student) Show() {fmt.Println(我是Student的show方法)
}func main() {s : Student{Person{name: 韩信,age: 99,}}s.Show() // 优先使用自己的//如果需要使用父类的需要明示使用父类调用s.Person.Show()
}方法和函数的区别
方法有接受者而函数无接受者函数不可以重名而方法可以重名调用方式不一样
函数函数名(实参列表)
方法变量.方法名(实参列表)函数参数为值类型时不能传递指针类型为指针类型时不能传递值类型。不管方法是值类型还是指针类型都可以使用值或指针调用
注意判断方法是否为指针类型不应该从调用者出发 s.Test03()是由方法关联类型决定的(h Hero) test03()、(h *Hero) test04()
type Hero struct {name string
}// 值类型函数
func test01(h Hero) {fmt.Println(test01, h.name) //不知火舞
}// 指针类型函数
func test02(h *Hero) {fmt.Println(test02, h.name) //不知火舞
}// 普通方法
func (h Hero) test03() {h.name 干将莫邪 //值拷贝,不影响主函数Namefmt.Println(test03, h.name) // 干将莫邪
}// 指针类型方法
func (h *Hero) test04() {h.name 干将莫邪 // 指针会直接修改原数据fmt.Println(test04, h.name) // 干将莫邪
}func main() {h : Hero{不知火舞}test01(h)test02(h)h.test03()fmt.Println(main调用test03后, h.name)(h).test04()fmt.Println(main调用test04后, h.name) // 干将莫邪h.test04()// 等价 (p).test04 , 从形式上是传入值类型但是本质仍然是地址拷贝面试的时候会留坑让误以为传递的是指针联想到是指针类型的方法fmt.Println(main调用test04后, h.name) // 干将莫邪
}输出
test01 不知火舞
test02 不知火舞
test03 干将莫邪
main调用test03后 不知火舞test04 干将莫邪
main调用test04后 干将莫邪
test04 干将莫邪
main调用test04后 干将莫邪练习方法
键盘录入数据判断是奇数还是偶数
type TestMethod struct{}func (t *TestMethod) JudgeNumber() {var num intfmt.Println(请输入一个整数)fmt.Scan(num)if num%2 0 {fmt.Println(num, 是偶数)} else {fmt.Println(num, 是奇数)}
}func main() {t : TestMethod{}t.JudgeNumber()
}编写一个计算机方法实现加减乘除
type Calculator struct {Num1 float64Num2 float64
}func (c *Calculator) result() float64 {fmt.Println()fmt.Println(——————————开始计算——————————)fmt.Println(请输入第1个数字)c.Num1 0fmt.Scan(c.Num1)fmt.Println()c.Num2 0fmt.Println(请输入第2个数字)fmt.Scan(c.Num2)fmt.Println()var operator bytefmt.Println(请按数字选择运算符)fmt.Println(1.加 2.减 3.乘 4.除)fmt.Scan(operator)fmt.Println()var res float64switch operator {case 1:res c.Num1 c.Num2case 2:res c.Num1 - c.Num2case 3:res c.Num1 * c.Num2case 4:res c.Num1 / c.Num2default:fmt.Println(运算符输入有误)}return res
}func main() {c : Calculator{}result : c.result()fmt.Println(结果为, result)
}输出
——————————开始计算——————————
请输入第1个数字
10请输入第2个数字
20请按数字选择运算符
1.加 2.减 3.乘 4.除
1结果为 30