1688网站,在印度做外贸需要什么网站,网络市场调研的五个步骤,access 可以做网站不#x1f337;#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨#x1f341; #x1f984; 博客首页——猫头虎的博客#x1f390; #x1f433;《面试题大全专栏》 文章图文并茂#x1f995;生动形象#x1f996;简单易学#xff01;欢迎大家来踩踩~#x1… 博主猫头虎 带您 Go to Golang Language.✨✨ 博客首页——猫头虎的博客 《面试题大全专栏》 文章图文并茂生动形象简单易学欢迎大家来踩踩~ 《IDEA开发秘籍专栏》学会IDEA常用操作工作效率翻倍~ 《100天精通Golang(基础入门篇》学会Golang语言畅玩云原生走遍大小厂~ 希望本文能够给您带来一定的帮助文章粗浅敬请批评指正 100天精通Golang基础入门篇 方法摘要 引言 ️导语 ️ 1.1 什么是方法1.2 方法的语法1.3 方法和函数1.4 变量作用域1.5 method继承1.6 method重写1.7 接口与方法1.8 方法的签名1.9 方法值和方法表达式方法值方法表达式 1.10 方法的可见性总结参考资料 结语 方法
深入剖析Go语言第19天专注方法Method的妙用与实践
摘要
掌握Go语言的方法Method️不仅能让你的代码更加有序✅也能实现更多功能和更高的可维护性。本篇博客是我们100天精通Golang系列的第19篇将深入解释Go中方法的语法、用法、作用范围以及与函数的区别等。
引言 ️
你好亲爱的读者我是猫头虎博主Go语言因其简洁️、高效⚡而日益受到开发者的喜爱。然而要想充分利用Go语言的强大功能理解其方法Method的概念是非常必要的。在本篇博客中我们将一同探讨Go语言中的方法概念️♀️看看它是如何使我们的编程生活变得更美好。
导语 ️
本篇博文将覆盖以下几个方面
1️⃣ 方法的基本语法和定义方式 2️⃣ 值接收者和指针接收者的区别 3️⃣ 方法与函数的对比 4️⃣ 局部变量和全局变量在方法中的应用 5️⃣ 方法的继承与重写
无论你是Go语言的新手还是有经验的开发者我相信这篇文章都能给你带来一些新的见解。
这样的格式更加吸引人并且能在视觉上快速传达重要信息。希望这能帮助你
1.1 什么是方法
Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集
方法只是一个函数它带有一个特殊的接收器类型它是在func关键字和方法名之间编写的。接收器可以是struct类型或非struct类型。接收方可以在方法内部访问。
方法能给用户自定义的类型添加新的行为。它和函数的区别在于方法有一个接收者给一个函数添加一个接收者那么它就变成了方法。接收者可以是值接收者也可以是指针接收者。
在调用方法的时候值类型既可以调用值接收者的方法也可以调用指针接收者的方法指针类型既可以调用指针接收者的方法也可以调用值接收者的方法。
也就是说不管方法的接收者是什么类型该类型的值和指针都可以调用不必严格符合接收者的类型。
1.2 方法的语法
定义方法的语法
func (t Type) methodName(parameter list)(return list) {}
func funcName(parameter list)(return list){}实例代码
package mainimport ( fmt
)type Employee struct { name stringsalary intcurrency string
}/*displaySalary() method has Employee as the receiver type
*/
func (e Employee) displaySalary() { fmt.Printf(Salary of %s is %s%d, e.name, e.currency, e.salary)
}func main() { emp1 : Employee {name: Sam Adolf,salary: 5000,currency: $,}emp1.displaySalary() //Calling displaySalary() method of Employee type
}可以定义相同的方法名
示例代码
package mainimport (fmtmath
)type Rectangle struct {width, height float64
}
type Circle struct {radius float64
}func (r Rectangle) area() float64 {return r.width * r.height
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) area() float64 {return c.radius * c.radius * math.Pi
}
func main() {r1 : Rectangle{12, 2}r2 : Rectangle{9, 4}c1 : Circle{10}c2 : Circle{25}fmt.Println(Area of r1 is: , r1.area())fmt.Println(Area of r2 is: , r2.area())fmt.Println(Area of c1 is: , c1.area())fmt.Println(Area of c2 is: , c2.area())
}运行结果
Area of r1 is: 24
Area of r2 is: 36
Area of c1 is: 314.1592653589793
Area of c2 is: 1963.4954084936207虽然method的名字一模一样但是如果接收者不一样那么method就不一样method里面可以访问接收者的字段调用method通过.访问就像struct里面访问字段一样
1.3 方法和函数
既然我们已经有了函数为什么还要使用方法
示例代码
package mainimport ( fmt
)type Employee struct { name stringsalary intcurrency string
}/*displaySalary() method converted to function with Employee as parameter
*/
func displaySalary(e Employee) { fmt.Printf(Salary of %s is %s%d, e.name, e.currency, e.salary)
}func main() { emp1 : Employee{name: Sam Adolf,salary: 5000,currency: $,}displaySalary(emp1)
}在上面的程序中displaySalary方法被转换为一个函数而Employee struct作为参数传递给它。这个程序也产生了相同的输出Salary of Sam Adolf is $5000.。 为什么我们可以用函数来写相同的程序呢?有以下几个原因
Go不是一种纯粹面向对象的编程语言它不支持类。因此类型的方法是一种实现类似于类的行为的方法。相同名称的方法可以在不同的类型上定义而具有相同名称的函数是不允许的。假设我们有一个正方形和圆形的结构。可以在正方形和圆形上定义一个名为Area的方法。这是在下面的程序中完成的。
1.4 变量作用域
作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。
Go 语言中变量可以在三个地方声明
函数内定义的变量称为局部变量函数外定义的变量称为全局变量函数定义中的变量称为形式参数
局部变量
在函数体内声明的变量称之为局部变量它们的作用域只在函数体内参数和返回值变量也是局部变量。
全局变量
在函数体外声明的变量称之为全局变量首字母大写全局变量可以在整个包甚至外部包被导出后使用。
package mainimport fmt/* 声明全局变量 */
var g intfunc main() {/* 声明局部变量 */var a, b int/* 初始化参数 */a 10b 20g a bfmt.Printf(结果 a %d, b %d and g %d\n, a, b, g)
}结果
结果 a 10, b 20 and g 30形式参数
形式参数会作为函数的局部变量来使用
指针作为接收者
若不是以指针作为接收者实际只是获取了一个copy而不能真正改变接收者的中的数据
func (b *Box) SetColor(c Color) {b.color c
}示例代码
package mainimport (fmt
)type Rectangle struct {width, height int
}func (r *Rectangle) setVal() {r.height 20
}func main() {p : Rectangle{1, 2}s : pp.setVal()fmt.Println(p.height, s.height)
}结果
20 2如果没有那个*则值就是2 2
1.5 method继承
method是可以继承的如果匿名字段实现了一个method那么包含这个匿名字段的struct也能调用该method
package mainimport fmttype Human struct {name stringage intphone string
}
type Student struct {Human //匿名字段school string
}
type Employee struct {Human //匿名字段company string
}func (h *Human) SayHi() {fmt.Printf(Hi, I am %s you can call me on %s\n, h.name, h.phone)
}
func main() {mark : Student{Human{Mark, 25, 222-222-YYYY}, MIT}sam : Employee{Human{Sam, 45, 111-888-XXXX}, Golang Inc}mark.SayHi()sam.SayHi()
}运行结果
Hi, I am Mark you can call me on 222-222-YYYY
Hi, I am Sam you can call me on 111-888-XXXX1.6 method重写
package mainimport fmttype Human struct {name stringage intphone string
}
type Student struct {Human //匿名字段school string
}
type Employee struct {Human //匿名字段company string
}//Human定义method
func (h *Human) SayHi() {fmt.Printf(Hi, I am %s you can call me on %s\n, h.name, h.phone)
}//Employee的method重写Human的method
func (e *Employee) SayHi() {fmt.Printf(Hi, I am %s, I work at %s. Call me on %s\n, e.name,e.company, e.phone) //Yes you can split into 2 lines here.
}
func main() {mark : Student{Human{Mark, 25, 222-222-YYYY}, MIT}sam : Employee{Human{Sam, 45, 111-888-XXXX}, Golang Inc}mark.SayHi()sam.SayHi()
}运行结果
Hi, I am Mark you can call me on 222-222-YYYY
Hi, I am Sam, I work at Golang Inc. Call me on 111-888-XXXX方法是可以继承和重写的存在继承关系时按照就近原则进行调用
1.7 接口与方法
在 Go 语言中接口定义了一组方法但这些方法不包含实现代码。它们没有被绑定到特定的类型。接口的方法可以通过任何类型来实现这样该类型就满足了接口。
type Sayer interface {Say() string
}type Dog struct {
}func (d Dog) Say() string {return Woof!
}type Cat struct {
}func (c Cat) Say() string {return Meow!
}func AnimalTalk(s Sayer) {fmt.Println(s.Say())
}func main() {var d Sayer Dog{}var c Sayer Cat{}AnimalTalk(d)AnimalTalk(c)
}在这个例子里Sayer 接口包含了一个 Say 方法。我们定义了两个结构体类型 Dog 和 Cat然后使它们都满足 Sayer 接口。最后在 AnimalTalk 函数中使用接口作为参数实现了多态。
1.8 方法的签名
每个方法都有一个方法签名这告诉我们方法接受哪种类型的接收者。这非常重要因为这决定了哪些方法属于接口类型或者更通用地说它决定了一组方法以及它们的签名如何形成一个接口。
type Geometry interface {Area() float64Perimeter() float64
}type Square struct {side float64
}func (s Square) Area() float64 {return s.side * s.side
}func (s Square) Perimeter() float64 {return 4 * s.side
}在这里Geometry 接口包含 Area 和 Perimeter 方法这两个方法都没有参数并返回一个浮点数。因此任何具有这两个方法的类型都满足 Geometry 接口。
1.9 方法值和方法表达式
在 Go 中方法不仅可以作为接收者类型的一部分来调用还可以作为独立的值和表达式。
方法值
当你保存方法作为值时接收者也会被保存。
type Greeter struct {Name string
}func (g Greeter) Greet() {fmt.Println(Hello, g.Name)
}func main() {greet : Greeter{Name: John}.Greetgreet()
}方法表达式
方法表达式返回一个函数该函数接受一个接收者和原方法的其他参数。
type Adder struct {Base int
}func (a Adder) Add(x int) int {return a.Base x
}func main() {add : Adder{Base: 2}.Addfmt.Println(add(3)) // Output: 5
}1.10 方法的可见性
和字段或函数一样如果方法的第一个字母是大写的那么这个方法可以被这个包以外的代码访问。这是 Go 的导出规则。
package geometrytype Rectangle struct {Length, Width float64
}func (r Rectangle) Area() float64 {return r.Length * r.Width
}func (r Rectangle) perimeter() float64 {return 2 * (r.Length r.Width)
}在上面的例子中Area 方法是导出的因为它以大写字母开头而 perimeter 则不是因为它以小写字母开头。
通过这些主题的讨论希望能够增加你对 Go 语言中方法的深入理解。接下来我们将探讨更高级的主题以帮助你成为一名更出色的 Go 程序员。敬请期待
总结
掌握Go语言中的方法Method不仅是基础学习的重要一环而且对于高级编程和实际应用也有着至关重要的作用。通过这篇文章我希望你能对Go语言的方法有一个更全面和深入的理解从而能够更加灵活和高效地使用这一强大的编程语言。
在这篇博客中我详细讲解了Go语言中“方法”Method的重要性和应用。该博客是100天精通Golang系列的第19篇文章。主要内容围绕方法在Go语言中的基础语法、与函数的区别以及方法的用法和应用范围进行了全面而深入的介绍。
1️⃣ 基础语法和定义方式: 方法是Go语言编程中的一个关键概念理解它有助于写出更有序和可维护的代码。
2️⃣ 值接收者和指针接收者: 文章解释了这两种接收者的区别和各自适用的场合。
3️⃣ 方法与函数的对比: 了解这两者的不同能帮助你更准确地应用它们。
4️⃣ 局部变量和全局变量的应用: 在方法中如何使用这两种变量也是一个需要注意的点。
5️⃣ 方法的继承与重写: 在面向对象编程中了解如何继承和重写方法是非常重要的。
无论你是Go语言初学者还是经验丰富的开发者这篇文章都提供了有价值的信息和见解。
通过这篇博客你可以更全面地理解Go语言中的“方法”从而更有效地使用Go进行编程。
参考资料
“The Go Programming Language” by Alan A. A. Donovan Brian W. KernighanGo官方文档Methods - The Go Programming Language“Go语言高级编程” by Chai2010Go by Example: MethodsUnderstanding Go Interfaces
感谢大家的阅读如果你觉得这篇文章有用不妨分享给你的朋友和同事也别忘了关注猫头虎博主的更多精彩内容我们下篇文章见 结语
通过今天的学习您已经踏上了Golang的学习之旅。在未来的日子里您将探索Golang的各个方面从基础概念到高级技巧从实际应用到性能优化。 学习一门编程语言是一个持续的过程每一天都是您向Golang的精通迈进的重要一步。我鼓励您坚持每天学习保持热情和好奇心解决挑战并享受成功的喜悦。
在您的学习旅程中不要忘记参与社区和与其他Golang开发者交流。分享您的见解和经验向他人学习并在开源项目或实际应用中展示您的技能。
如果您在学习过程中遇到困难或有任何问题不要犹豫向社区和专家寻求帮助。持续学习勇敢探索您将在Golang领域取得令人瞩目的成就。
最后感谢您的阅读和支持祝愿您在未来的每一天中都能够成为一名精通Golang的开发者
期待听到您在学习过程中的进展和成就。如果您需要进一步的帮助请随时告诉我。祝您在学习Golang的旅程中取得巨大成功 点击下方名片加入IT技术核心学习团队。一起探索科技的未来共同成长。 如果您在学习过程中有任何疑惑请点击下方名片带您一对一快速入门 Go语言 的世界 ~