开发者学堂课程【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( ){}
现有一个自定义的 integer,即给 int 做了一个自定义,相当于 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
fun
c
(i integer) print
(){
fmt.Print1n("
i=
",i)
}
func main
() {
var i integer = 10
i
.
print
()
i.change
()
fmt.Print
l
n("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 strin
g() st
ring
{
str :fmt.Sprintf("Name=[
%
v] Age=[
%v
]",stu.Name,stu.Age)
return str
}
Stu
:= Student
{
Name
:
"
tom
"
,
Age: 20,
}
fmt.Print1n(
&
stu)