方法使用的深度剖析(2)|学习笔记

简介: 快速学习方法使用的深度剖析(2)

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:方法使用的深度剖析(2)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9679


方法使用的深度剖析(2)

 

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

举例说明:

新建一个文件夹 methoddetails,新建文件 main.go,输入共用部分:

package main

import (

"fmt"

)

写入主函数 func main( ){}

现有一个自定义的 integerint 做了一个自定义,相当于 int 就是 integer 别名。为其绑定一个方法,输入 func(i integer) print()

输入 fmt.Print1n("i=",i)打印出他的值。定义一个 integer,比如此时个变量叫i integer给他一个值,例如是十,代码为(var integer= 10),然后用i来调用这个方法,也就是说 print 这个方法其实是作用integer 上的而 integer 就是 int 类型的,所以大家不要认为方法一定要与一个结构体绑定方法也可以是一个 int、float32 的这种自定义的类型。运行一下,输入 cd..,cd到methoddetails,然后 go run main.go发现这个时候输出 i=10与理论效果一致。而且还可以通过这个方法来修改文件,比如一个方法,可以改变i的值。可以利用指针的方式来变更地址,输入 func (i*integer)change(){

*i=*i+1},意思是*i取出来再重新进行赋值,相当于改变i本身值,而且因为是指针,因此出来的时候就可以更改。输入 i.change() 进行调用,这个时候进行地址拷贝,并不是值拷贝,所以change里面i的修改会直接影响到main函数中i的值也就是说这个时候i应该在10的基础上加。输入 fmt.Print1n("i=",i) 完成打印,这时会发现打印的是11。

核心代码:

type integer int

func (i integer) print(){

fmt.Print1n("i=",i)

}

func main() {

var i integer = 10

i.print()

i.change()

fmt.Println("i=",i)

}

2. 方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。

不过多赘述,之前章节已进行过将讲解。例如如果方法 print 是小写的,那么他只能在该包中使用,不可以在其他包进行使用,而改为 Print 后,变成了公开方法,可以在其他包中完成使用。

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

举例说明:

现有一个结构体叫 Student,学生里面有名字还有年龄,代码如下:type Student struct {Name string Age int}。假设给 Student 实现 String 方法,输入 func (stu*Student) String() string{},将 stu 与*student 完成绑定,直接将 stu 与*student 指针绑定,更改起来就会十分方便。输入 str :=fmt.sprintf("Name=[%v] Age=[%v]",stu.Name,stu.Age),将 student 的信息提取出来,其原理与 Java 中的too string 相似,注意通过 return str 将值返回。这个时候当我们去输出一个student 的信息时,它就会默认调用上述方法来进行。定义一个 student 的变量,stu :=Student{},给他进行赋值,代码为 Name"tom" Age : 20,输入fmt.Println(&stu) 完成调用并测试,由于是指针类型,注意不要将&忘记,如果不加&,不会对上述string方法进行调用,只会将定义的内容输出。执行后发现结果为Name=[tom] Age=[20],与理论结果一致。即如果实现了 *Student 类型的 String方法,就会自动调用。如果没有实现,输出结果为地址。

核心代码:

type Student struct {

Name string

Age int

}

func (stu Student string() string{

str :fmt.Sprintf("Name=[%v] Age=[%v]",stu.Name,stu.Age)

return str

}

Stu := Student{

Name:"tom",

Age: 20,

}

fmt.Print1n(&stu)

相关文章
|
7月前
|
存储 Java 程序员
|
7月前
|
XML Java 数据库连接
谈谈Java反射:从入门到实践,再到原理
谈谈Java反射:从入门到实践,再到原理
136 0
|
7月前
|
存储 关系型数据库 MySQL
由浅入深:数据库编程概念与实战
由浅入深:数据库编程概念与实战
177 1
|
存储 Kubernetes 负载均衡
K8S原理和实践
K8S原理和实践
227 0
|
缓存 Java
认真阅读完这篇文章熟练掌握阿里巴巴规范创建Java线程池
认真阅读完这篇文章熟练掌握阿里巴巴规范创建Java线程池
821 0
|
人工智能 分布式计算 Java
【C++初阶】前言——C++的发展简述及学习方法分享
之前我们一直分享C语言和使用C语言完成数据结构的初阶的文章,今天我们正式进入C++的学习,这篇文章主要是给大家带来的是C++的由来、以及和C语言的区别、更主要的是和大家分享自己的学习方法,给一些我的建议。
|
1月前
|
自然语言处理 安全 PHP
深入浅出PHP编程:从基础到实战
【10月更文挑战第36天】本文将带你走进PHP的奇妙世界,无论你是初学者还是有一定经验的开发者,都将从中获益。文章首先介绍PHP的基础概念和语法,然后通过实际代码示例,展示如何利用PHP进行高效的Web开发。最后,我们将探讨一些高级主题,如面向对象编程、数据库操作以及安全性问题。让我们一起开启PHP的学习之旅吧!
|
6月前
|
编解码 网络协议 Java
技术笔记:Mina框架(实战详解)
技术笔记:Mina框架(实战详解)
|
7月前
|
编译器 C++
【C++进阶(八)】C++继承深度剖析
【C++进阶(八)】C++继承深度剖析
|
7月前
|
程序员 Python
类的设计奥秘:从代码到架构的科普全解
类的设计奥秘:从代码到架构的科普全解
98 2