Golang 函数 方法 接口的简单介绍
函数
函数是基本的代码块,通常我们会将一个功能封装成一个函数,方便我们调用,同时避免代码臃肿复杂。
函数的基本格式
func TestFunc(a int, b string) (int, string) {
// body
}
函数基本在每种语言都经常使用,所以感觉没什么记录的。
方法
方法与对象绑定,简单的来讲只是将对象传递给函数使其成为一种特殊(只属于该对象)的函数,因为Golang是没有类这个概念(在Golang里,结构体是类的简化版),所以也可以将方法理解为类的成员函数,但需要注意的是,在Golang里几乎所有数据类型都可以与方法绑定。
方法的基本格式
func (a objectType) TestMethod(a int, b string) (int, string) {
// body
}
先定一个结构体
type Test1 struct {
aaa int
bbb int
}
func (t Test1) String() string {
res := fmt.Sprintf("aaa:%d, bbb:%d", t.aaa, t.bbb)
return res
}
指针或者值作为绑定对象的区别
指针和值都可以绑定方法,并且我们不需要手动区分,这是因为Golang会自动解引用。
只读对象的内部变量
指针和值是没有区别的,下面的代码分别使用了值和指针绑定:
func (t *Test1) Sum() int {
return t.aaa + t.bbb
}
func (t Test1) Mul() int {
return t.aaa * t.bbb
}
然后我们定义一个对象来分别调用上面的两个方法:
ttt := Test1{aaa: 5, bbb: 2}
fmt.Println("Sum:", ttt.Sum())
fmt.Println("Mul:", ttt.Mul())
// output:
// Sum: 7
// Mul: 10
修改对象的内部变量
如果需要修改对象的内部变量,就必须在对象的指针类型上定义该方法,下面的代码分别使用了值和指针绑定:
func (t *Test1) modifyByAddr(a int) {
t.aaa = a
}
func (t Test1) modifyByValue(a int) {
t.aaa = a
}
然后我们定义一个对象来分别调用上面的两个方法:
fmt.Println("old value:", ttt)
ttt.modifyByValue(222)
fmt.Println("modifyByValue:", ttt)
ttt.modifyByAddr(111)
fmt.Println("modifyByAddr:", ttt)
// output
// old value: aaa:5, bbb:2
// modifyByValue: aaa:5, bbb:2
// modifyByAddr: aaa:111, bbb:2
函数与方法的区别
通过上面的例子来说明
函数将变量当做参数传入Test1Sum(ttt)方法是被变量调用ttt.Mul()和ttt.Sum()
接口
接口定义了一组方法,但这些方法并没有实现,使用该接口的前提是对象实现了接口内部的方法,这里需要特别注意,对象必须实现接口里的所以方法,或者会报错。
下面我们定义了一个接口,包含两个方法,其中modify(int, int)我们没有在结构体Test1里实现。
type TestInterface interface {
Sum() int
modify(int, int)
}
我们将对象赋给接口的时候就会报错,代码如下:
ttt := new(Test1)
ttt.aaa = 5
ttt.bbb = 2
var test1Face TestInterface
test1Face = ttt
这时候就会报错如下信息:
src/test.go:44:14: cannot use ttt (variable of type Test1) as type TestInterface in assignment:
Test1 does not implement TestInterface (Sum method has pointer receiver)
完整代码
package main
import "fmt"
type TestInterface interface {
Sum() int
modify(int, int)
}
type Test1 struct {
aaa int
bbb int
}
func (t *Test1) modify(a, b int) {
t.aaa = a
t.bbb = b
}
func (t *Test1) Sum() int {
return t.aaa + t.bbb
}
func (t Test1) Mul() int {
return t.aaa * t.bbb
}
func Test1Sum(t *Test1) int {
return t.aaa + t.bbb
}
func (t *Test1) modifyByAddr(a int) {
t.aaa = a
}
func (t Test1) modifyByValue(a int) {
t.aaa = a
}
func (t Test1) String() string {
res := fmt.Sprintf("aaa:%d, bbb:%d", t.aaa, t.bbb)
return res
}
func main() {
ttt := new(Test1)
ttt.aaa = 5
ttt.bbb = 2
var test1Face TestInterface
test1Face = ttt
test1Face.modify(123, 456)
fmt.Println("Sum:", ttt.Sum())
fmt.Println("Mul:", ttt.Mul())
fmt.Println("Test1Sum:", Test1Sum(ttt))
fmt.Println("old value:", ttt)
ttt.modifyByValue(222)
fmt.Println("modifyByValue:", ttt)
ttt.modifyByAddr(111)
fmt.Println("modifyByAddr:", ttt)
}
Golang 函数 方法 接口的简单介绍的更多相关文章
- go 函数 方法 接口
概论 函数 方法 接口 概论 方法在编译时静态绑定,依托于具体的类型 接口对应的方法是在运行时动态绑定 进程内初始化顺序 初始化导入包的常量和变量(可以导出的变量)--->包的init函数,不同 ...
- C++虚函数之接口 最简单的功能
虚函数 ,接口,到底有什么用呢? 以前我都是在C++ 里面写C,只用到 简单的C++面对对象知识 #include<stdio.h> class IServerLogic{ virtual ...
- 【细说Java】方法重载的简单介绍
1. 什么是重载 方法名称相同,但它们的参数类型或个数不同,这样,方法在被调用时编译器就可以根据参数的类型与个数的不同加以区分,这就是方法的重载. 既然可以通过参数类型或参数个数来作为重载条件,那返回 ...
- 在线支付接口之PHP支付宝接口开发简单介绍
php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...
- 线程终止的四种方式,interrupt 方法使用的简单介绍。
一 正常结束. package com.aaa.threaddemo; /* 一 终止线程的四种方式? * 程序运行结束,线程终止. * */ public class ThreadTerminati ...
- 关于JQuery简单介绍
jQuery是一个兼容多浏览器的javascript库,核心理念是写得更少,做得更多.如今,jQuery已经成为最流行的javascript库,在世界前10000个访问最多的网站中,有超过55%在使用 ...
- UML简单介绍-如何看懂UML(一)
在计算复杂的数学题时,我们必然会打草稿计算 在绘画课中,我们可以素描出来看到的事物 那么在程序设计中呢? 如何描绘传达你脑海中的关于这个程序 ,设计的蓝图草稿? OOP的程序设计中,最多的自然 ...
- 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)
本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...
- HDFS简单介绍及用C语言訪问HDFS接口操作实践
一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...
随机推荐
- 学习FastDfs(三)
FASTDFS是什么 FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100 FastDFS是一个轻量级的开源分布式文件系统,主要解决了大容量的文 ...
- Markdown语法1
Markdown是一种轻量级标记语言. Markdown 编写的文档可以导出 HTML .Word.图像.PDF.Epub 等多种格式的文档. Markdown 编写的文档后缀为 .md, .mark ...
- CommonsCollection3
CommonsCollection3 1.前置知识 CommonsCollection3其实就是cc1和cc2的组合,不用再学那么多知识了,再学习另两个生面孔类 1.1.InstantiateTran ...
- CSDN博客步骤:
在SCDN看到喜欢的文章想转载又嫌一个一个敲太麻烦,干脆直接收藏.但有时候作者把原文章删除或设置为私密文章后又看不了.所以还是转载来的好.这篇博文为快速转载博客的方法,亲测有效,教程如下. 原博客原址 ...
- Creating a File Mapping Object
创建一个文件映射对象 映射一个文件的第一步是通过调用CreateFile函数来打开一个文件.为了确保其他的进程不能对文件已经被映射的那一部分进行写操作,你应该以唯一访问(exclusive acces ...
- Python输出数字金字塔
使用Python输出一个数字金字塔 运行结果: 源代码: ''' Python输出数字金字塔 ''' for x in range(1,10): print(' '*(15-x),end='') n= ...
- Linux_文件传输工具_FileZilla
什么是FileZilla? FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端版 ...
- Docker-操作容器1
->点击该链接:Linux(Centos7)安装Docker<- 前言 步骤: 软件镜像->运行镜像->产生一个容器 这就类似于我们在pc端下载微信时需要启动wechat.ex ...
- npm 和 Yarn 镜像站配置
Node.js 作为近年来非常受欢迎的 Web 开发运行环境,由于开发者众多,贡献开源代码的人也很多,所有这些凝结成了 npm 这个世界上最大的软件包仓库,但是受限于 npm 软件包的服务器在国外,国 ...
- 帝国CMS后台采集关键字的方法
小伙伴们知道帝国CMS后台的采集功能是不能采集关键字的,那么老墨今天给大家说一个变通方法,让后台能采集关键字!方法如下: 1.系统设置--管理数据表--管理字段--增加字段(字段名:keywords字 ...