方法使用的深度剖析(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)

相关文章
|
存储 算法 编译器
【C++ 泛型编程 入门篇】C++模板类精讲:探索通用编程的魅力与实战应用
【C++ 泛型编程 入门篇】C++模板类精讲:探索通用编程的魅力与实战应用
67 0
|
3月前
|
存储 Java 程序员
|
8天前
|
编译器 C++
【C++进阶(八)】C++继承深度剖析
【C++进阶(八)】C++继承深度剖析
|
8天前
|
存储 C++
【C++进阶(九)】C++多态深度剖析
【C++进阶(九)】C++多态深度剖析
|
5月前
|
SQL Kubernetes Java
深度剖析FlinkX(纯钧)源码
深度剖析FlinkX(纯钧)源码
84 0
|
7月前
|
机器学习/深度学习 人工智能 算法
这篇科普让你Get所有大模型的基础核心知识点
本文介绍了AI大模型的概念和发展历程。AI大模型是指具有1亿以上参数的机器学习模型,通过在大规模数据集上进行预训练,可以直接支撑各类应用。大模型的发展经历了从萌芽期到AI1.0时期,再到AI2.0时期的飞跃,目前最新发布的大模型参数已经达到了千亿甚至万亿级别。国内外的公司都在积极研发和应用大模型,如OpenAI、Google、Facebook、Microsoft等。国内也有百度、阿里巴巴、万维、商汤科技等公司发布了自己的大模型产品。大模型的建造离不开算力资源、算法人才、数据积累等核心要素。此外,文章还列举了一些与大模型相关的专业名词,如算法、模型参数、训练数据、Token等。
|
11月前
|
存储 安全 编译器
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)(一)
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)
|
11月前
|
存储 编译器 Linux
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)(三)
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)
|
11月前
|
安全 编译器 C++
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)(二)
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)
|
编译器 调度 C++
C++从入门到精通(第四篇) :C++的基础和灵魂:类和对象(下篇)
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值
88 0
C++从入门到精通(第四篇) :C++的基础和灵魂:类和对象(下篇)