golang Methods on structs
原文:http://golangtutorials.blogspot.com/2011/06/methods-on-structs.html
snmp 下载,有空学习一下!
https://sourceforge.net/projects/net-snmp/
--------------------------------------------------------------------------------------------------------
Methods on structs
A normal function that we name my_func that takes no parameters and returns an int
would be defined similar to that shown below.
Partial code
- func my_func() int {
- //code
- }
A function or method that we name my_func that takes no parameters and returns an int
, but which is associated with a type we name my_type would be defined similar to that shown below.
Partial code
- type my_type struct { }
- func (m my_type) my_func() int {
- //code
- }
Let’s extend our earlier Rectangle
struct to add an Area
function. This time we will define that the Area
function works explicitly with the Rectangle
type with func (r Rectangle) Area() int
.
Full code
- package main
- import "fmt"
- type Rectangle struct {
- length, width int
- }
- func (r Rectangle) Area() int {
- return r.length * r.width
- }
- func main() {
- r1 := Rectangle{4, 3}
- fmt.Println("Rectangle is: ", r1)
- fmt.Println("Rectangle area is: ", r1.Area())
- }
Rectangle area is: 12
Many object oriented languages have a concept of this
or self
that implicitly refers to the current instance. Go has no such keyword. When defining a function or method associated with a type, it is given as a named variable - in this case (r Rectangle)
and then within the function the variable r
is used.
In the above call to Area
, the instance of Rectangle
is passed as a value. You could also pass it by reference. In calling the function, there would be no difference whether the instance that you call it with is a pointer or a value because Go will automatically do the conversion for you.
Full code
- package main
- import "fmt"
- type Rectangle struct {
- length, width int
- }
- func (r Rectangle) Area_by_value() int {
- return r.length * r.width
- }
- func (r *Rectangle) Area_by_reference() int {
- return r.length * r.width
- }
- func main() {
- r1 := Rectangle{4, 3}
- fmt.Println("Rectangle is: ", r1)
- fmt.Println("Rectangle area is: ", r1.Area_by_value())
- fmt.Println("Rectangle area is: ", r1.Area_by_reference())
- fmt.Println("Rectangle area is: ", (&r1).Area_by_value())
- fmt.Println("Rectangle area is: ", (&r1).Area_by_reference())
- }
Rectangle area is: 12
Rectangle area is: 12
Rectangle area is: 12
Rectangle area is: 12
In the above code, we have defined two similar functions, one which takes the Rectangle
instance as a pointer and one that takes it by value. We have called each of the functions, via a value r1
and once as an address &r1
. The results however are all the same since Go performs appropriate conversions.
Just to extend the example, let’s do one more function that works on the same type. In the below example, we ‘attach’ a function to calculate the perimeter of the Rectangle
type.
Full code
- package main
- import "fmt"
- type Rectangle struct {
- length, width int
- }
- func (r Rectangle) Area() int {
- return r.length * r.width
- }
- func (r Rectangle) Perimeter() int {
- return 2* (r.length + r.width)
- }
- func main() {
- r1 := Rectangle{4, 3}
- fmt.Println("Rectangle is: ", r1)
- fmt.Println("Rectangle area is: ", r1.Area())
- fmt.Println("Rectangle perimeter is: ", r1.Perimeter())
- }
Rectangle area is: 12
Rectangle perimeter is: 14
You might be tempted now to see if you can attach methods and behavior to any type, say like an int
or time.Time
- not possible. You will be able to add methods for a type only if the type is defined in the same package.
Partial code
- func (t time.Time) first5Chars() string {
- return time.LocalTime().String()[0:5]
- }
However, if you absolutely need to extend the functionality, you can easily use what we learnt about anonymous fields and extend the functionality.
Full code
- package main
- import "fmt"
- import "time"
- type myTime struct {
- time.Time //anonymous field
- }
- func (t myTime) first5Chars() string {
- return t.Time.String()[0:5]
- }
- func main() {
- m := myTime{*time.LocalTime()} //since time.LocalTime returns an address, we convert it to a value with *
// m := myTime{time.Now()} 这行是对的!!!!!!!!!!- fmt.Println("Full time now:", m.String()) //calling existing String method on anonymous Time field
- fmt.Println("First 5 chars:", m.first5Chars()) //calling myTime.first5Chars
- }
First 5 chars: Tue N
Methods on anonymous fields
There was another item that we slipped into the previous program - method calls on anonymous fields. Since time.Time
was an anonymous field within myTime
, we were able to refer to a method of Time
as if it were a method of myTime
. i.e. we were able to do myTime.String()
. Let’s do one program using an earlier example.
In the following code we go back to our house where we have a Kitchen
as an anonymous field in House
. As we learnt with member fields, we can also access methods of anonymous fields as if they belong directly to the composing type. So House
has an anonymous Kitchen
which in turn has a method totalForksAndKnives()
; so now House.totalForksAndKnives()
is a valid call.
Full code
- package main
- import "fmt"
- type Kitchen struct {
- numOfForks int
- numOfKnives int
- }
- func(k Kitchen) totalForksAndKnives() int {
- return k.numOfForks + k.numOfKnives
- }
- type House struct {
- Kitchen //anonymous field
- }
- func main() {
- h := House{Kitchen{4, 4}} //the kitchen has 4 forks and 4 knives
- fmt.Println("Sum of forks and knives in house: ", h.totalForksAndKnives()) //called on House even though the method is associated with Kitchen
- }
golang Methods on structs的更多相关文章
- 【转】java jawin api 中文 invoke方法
org.jawin Class FuncPtr java.lang.Object org.jawin.FuncPtr ----------------------------------------- ...
- Inheritance and subclassing in Go - or its near likeness
原文: http://golangtutorials.blogspot.com/2011/06/inheritance-and-subclassing-in-go-or.html ---------- ...
- golang embedded structs
golang 中把struct 转成json格式输出 package main import ( "encoding/json" "fmt" ) type Pe ...
- 从OOP的角度看Golang
资料来源 https://github.com/luciotato/golang-notes/blob/master/OOP.md?hmsr=toutiao.io&utm_medium=tou ...
- [转]50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs
http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/ 50 Shades of Go: Traps, Gotc ...
- Go语言(golang)开源项目大全
转http://www.open-open.com/lib/view/open1396063913278.html内容目录Astronomy构建工具缓存云计算命令行选项解析器命令行工具压缩配置文件解析 ...
- [转]Go语言(golang)开源项目大全
内容目录 Astronomy 构建工具 缓存 云计算 命令行选项解析器 命令行工具 压缩 配置文件解析器 控制台用户界面 加密 数据处理 数据结构 数据库和存储 开发工具 分布式/网格计算 文档 编辑 ...
- golang路上的小学生系列--使用reflect查找package路径
本文同时发布在个人博客chinazt.cc 和 gitbook 今日看到了一个有趣的golang项目--kolpa(https://github.com/malisit/kolpa). 这个项目可以用 ...
- Golang 知识点总结
Golang 知识点总结 目录 [−] 各种类型复制的时候的花费 可使用内建函数的类型 (len.cap.close.delete.make) 内建容器类型的值比较 组合类型T{...}的值比较 零值 ...
随机推荐
- 智能指针.Qt测试
1.Qt598x64vs2017(或 Qt598x86vs2015[配置使用vs2017]).Win10x64 2.测试代码: 2.1.MainWindow.h class MainWindow : ...
- xadmin自定义菜单、增加功能、富文本编辑器
xadmin功能:https://www.cnblogs.com/derek1184405959/p/8682250.html#blogTitle7
- activeMq学习应用
一.下载 ActiveMQ 5.15.0下载地址 二.安装 解压apache-activemq-5.15.0-bin.zip D:\apache-activemq-5.15.7-bin\apache- ...
- java生成验证码结合springMVC
在用户登录的时候,为了防止机器人攻击都会设置输入验证码,本篇文章就是介绍java如何生成验证码并使用在springMVC项目中的. 第一步:引入生成图片验证码的工具类 import java.awt. ...
- git config命令详解
Git有一个工具被称为git config,它允许你获得和设置配置变量:这些变量可以控制Git的外观和操作的各个方面. 一. 配置文件的存储位置 这些变量可以被存储在三个不同的位置: 1./etc/ ...
- WUSTOJ 1336: Lucky Boy(Java)博弈
题目链接:1336: Lucky Boy 参考博客:LUCKY BOY 博弈--HandsomeHow Description Recently, Lur have a good luck. He i ...
- 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)
登录 保存密码 安全 加密 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而我前一段时间正好稍微研究了一下,所以把我知道的告诉大家,节约大家查找资料的时间. 你 ...
- App功能测试点总结
1.手机操作系统android(谷歌).ios(苹果).Windows phone(微软).Symbian(诺基亚).BlackBerry OS(黑莓).windows mobile(微软),目前主流 ...
- Windows下的Android Studio环境搭建、安装使用
https://jingyan.baidu.com/article/20b68a88ff2ca4796cec6232.html https://blog.csdn.net/jklinux/articl ...
- css 点击样式,水波纹(记录备用)
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...