Go 方法和接口
转自:http://studygolang.com/topics/549
Go 没有类,但可以在结构体类型上定义方法。
package main
import (
"fmt"
"math"
) type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 {
return math.Sqrt(v.Xv.X + v.Y*v.Y)
} func main() {
v := &Vertex{, } fmt.Println(v.Abs())
}
可以对包中的 任意 类型定义任意方法,而不仅仅是针对结构体。但是,不能对来自其他包的类型或基础类型定义方法。 接收者为指针的方法:方法可以与命名类型或命名类型的指针关联。有两个原因需要使用指针接收者:避免在每个方法调用中拷贝值(如果值类型是大的结构体的话会更有效率);方法可以修改接收者指向的值。
package main import (
"fmt"
"math"
) type MyFloat float64 func (f MyFloat) Abs() float64 {
if f <
{
return float64(-f)
}
return float64(f)
} func main() {
f := MyFloat(-math.Sqrt2)
fmt.Println(f.Abs())
}
接口:接口类型是由一组方法定义的集合。接口类型的值可以存放实现这些方法的任何值。
package main
import ( "fmt" "math" )
type Abser interface { Abs() float64 }
func main() {
var a Abser f := MyFloat(-math.Sqrt2)
v := Vertex{, }
a = f // a MyFloat 实现了 Abser
a = &v // a *Vertex 实现了 Abser
// 下面一行,v 是一个 Vertex(而不是 *Vertex)
// 所以没有实现 Abser。
a = v
fmt.Println(a.Abs())
}
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f <
{
return float64(-f)
}
return float64(f)
}
type Vertex struct { X, Y float64 }
func (v Vertex) Abs() float64
{
return math.Sqrt(v.Xv.X + v.Y*v.Y)
}
隐式接口:解藕了实现接口的包和定义接口的包:互不依赖。因此,也就无需在每一个实现上增加新的接口名称,这样同时也鼓励了明确的接口定义。
package main
import ( "fmt" "os" )
type Reader interface { Read(b []byte) (n int, err error) }
type Writer interface { Write(b []byte) (n int, err error) }
type ReadWriter interface { Reader Writer }
func main() {
var w Writer
// os.Stdout 实现了 Writer
w = os.Stdout
fmt.Fprintf(w, "hello, writer\n")
}
下面列举几个go标准包的接口:
type Stringer struct { String() string }
type error interface { Error() string }
io.Reader 接口有一个 Read 方法:
func (T) Read(b []byte) (n int, err error)
Read 用数据填充指定的字节 slice,并且返回填充的字节数和错误信息。
在遇到数据流结尾时,返回 io.EOF 错误。
package main
import (
"fmt"
"io"
"strings"
) func main() {
r := strings.NewReader("Hello, Reader!") b := make([]byte, )
for {
n, err := r.Read(b)
fmt.Printf("n = %v err = %v b = %v\n", n, err, b)
fmt.Printf("b[:n] = %q\n", b[:n])
if err == io.EOF {
break
}
}
}
Web服务器: 包 http 通过任何实现了 http.Handler 的值来响应 HTTP 请求:
type Handler interface { ServeHTTP(w ResponseWriter, r *Request) }
package main import (
"fmt"
"log"
"net/http"
) type Hello struct{} func (h Hello) ServeHTTP( w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello!")
} func main() {
var h Hello err := http.ListenAndServe("localhost:4000", h)
if err != nil
{
log.Fatal(err)
}
}
图片:
type Image interface { ColorModel() color.Model Bounds() Rectangle At(x, y int) color.Color }
Go 方法和接口的更多相关文章
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- GoLang之方法与接口
GoLang之方法与接口 Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的this指针等. 方法 Go 语言中同时有函数和方法.方法就是一个包含了接受者的函数 ...
- jbuilder的set!方法重构接口
https://github.com/rails/jbuilder 的set!方法重构接口, 因为grape没法使用 jBuilder 的缓存,所以直接用 Rails 写 API (1)多个图片 i ...
- 使用 highchart 绘制柱状图的通用方法与接口
本文给出使用 highchart 绘制柱状图的通用方法与接口, 只要指定相应的数据结构和配置, 就可以直接拿来使用. 一. 数据结构与基本接口 一般绘制图形, 会涉及到较复杂的数据结构, 比如使 ...
- JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明
1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...
- 初识 go 语言:方法,接口及并发
目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接 ...
- Mock Server 实现post方法的接口(三)
Mock Server 实现post方法的接口(三) 1.mock server实现的接口,当request中未设置"method"时,会自动将所有method试一次,所以一定要指 ...
- mock server 实现get方法的接口(二)
mock server 实现get方法的接口(二) 下面是实现查询品牌的接口demo: 1.当response数据量小的时候,可以直接使用json, mock会自动设置headers为applicat ...
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
- Go 入门 - 方法和接口
方法和接口 方法的接受者 Go中没有类,取而代之的是在结构体上定义的方法 为了将方法(函数)绑定在某一类结构体上,我们在定义函数(方法)时引入"接受者"的概念. 方法接受者在它自己 ...
随机推荐
- Sqlite 设置默认时间为本地时间
Sqlite 设置默认时间为本地时间 先设置字段类型为datetime, 再把缺省值设置为datetime( 'now', 'localtime' ) 代码查看如下 Time DATETIME DEF ...
- EasyPlayerPro Windows播放器本地快照抓拍截图功能实现方法
背景描述 作为一个播放器,截图功能必不可少; 下面主要记录一下截图功能的实现: 实现流程 将解码后的帧进行格式转换(目标格式为RGB24); 采用独立的线程进行截图处理; 截图可保存为BMP或JPG两 ...
- 使用Scrapy采集
1.有些站点通过robot协议,防止scrapy爬取,就会出现如下问题: DEBUG: Forbidden by robots.txt: <GET http://baike.baidu.com/ ...
- 九度OJ 1021:统计字符 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5418 解决:3146 题目描述: 统计一个给定字符串中指定的字符出现的次数. 输入: 测试输入包含若干测试用例,每个测试用 ...
- mysql系列之9.mysql日志&存储引擎
mysqlbinlog 是什么? 数据目录下的如下文件: mysql-bin.xxxxxx 作用? 记录数据库内部增删改查对mysql数据库有更新的内容的记录 三种模式? statement leve ...
- 【题解】CF989C A Mist of Florescence
[题解]CF989C A Mist of Florescence 题目大意: 让你构造一个\(n∗m\)矩阵,这个矩阵由4种字符填充构成,给定4个整数,即矩阵中每种字符构成的四联通块个数,\(n,m\ ...
- Linux安装mariadb详细步骤
1.安装mariadb yum和源码编译安装的区别? 1.路径区别-yum安装的软件是他自定义的,源码安装的软件./configure --preifx=软件安装的绝对路径 2.yum仓库的软件,版本 ...
- Java图像处理最快技术:ImageJ 学习第一篇
ImageJ是世界上最快的纯Java的图像处理程序. 它能够过滤一个2048x2048的图像在0.1秒内(*). 这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Ima ...
- BeginPaint和GetDC有什么区别
windows编程问题 第一种情况显示出来的字很正常. case WM_PAINT: gdc = BeginPaint (hwnd, &ps); TextOut (gdc, 0, 0, s, ...
- CentOS 7 设置自定义开机启动,添加自定义系统服务
详细文档,http://www.linuxidc.com/Linux/2015-04/115937.htm 摘自: http://www.centoscn.com/CentOS/config/2015 ...