转自: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 方法和接口的更多相关文章

  1. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  2. GoLang之方法与接口

    GoLang之方法与接口 Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的this指针等. 方法 Go 语言中同时有函数和方法.方法就是一个包含了接受者的函数 ...

  3. jbuilder的set!方法重构接口

    https://github.com/rails/jbuilder  的set!方法重构接口, 因为grape没法使用 jBuilder 的缓存,所以直接用 Rails 写 API (1)多个图片 i ...

  4. 使用 highchart 绘制柱状图的通用方法与接口

    本文给出使用 highchart 绘制柱状图的通用方法与接口, 只要指定相应的数据结构和配置, 就可以直接拿来使用. 一.  数据结构与基本接口   一般绘制图形, 会涉及到较复杂的数据结构, 比如使 ...

  5. JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明

    1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...

  6. 初识 go 语言:方法,接口及并发

    目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接 ...

  7. Mock Server 实现post方法的接口(三)

    Mock Server 实现post方法的接口(三) 1.mock server实现的接口,当request中未设置"method"时,会自动将所有method试一次,所以一定要指 ...

  8. mock server 实现get方法的接口(二)

    mock server 实现get方法的接口(二) 下面是实现查询品牌的接口demo: 1.当response数据量小的时候,可以直接使用json, mock会自动设置headers为applicat ...

  9. Go 语言中的方法,接口和嵌入类型

    https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...

  10. Go 入门 - 方法和接口

    方法和接口 方法的接受者 Go中没有类,取而代之的是在结构体上定义的方法 为了将方法(函数)绑定在某一类结构体上,我们在定义函数(方法)时引入"接受者"的概念. 方法接受者在它自己 ...

随机推荐

  1. Web大文件(夹)上传(断点续传)控件-Xproer.HttpUploader6

    版权所有 2009-2017荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  2. MyBatis做动态模糊查询时,like后面要不要加单引号??

    做项目遇到了个奇怪的问题,项目里面要对商品.账户.进行分别的多条件查询,于是我就采用动态多条件分页查询,起初在做账户部分的时候Mybatis是这样写的 <!-- 动态多条件分页查询 --> ...

  3. WebRTC for android ios开发官方指南

    The WebRTC native code package can be found at: https://chromium.googlesource.com/external/webrtc ht ...

  4. Oracle -- Create User

    CREATE USER hibernate IDENTIFIED BY "123" DEFAULT TABLESPACE "HIBERNATE" TEMPORA ...

  5. 兔子的晚会 2016Vijos省选集训 day1

    兔子的晚会 (xor.c/pas/cpp)============================= 很久很久之前,兔子王国里居住着一群兔子.每到新年,兔子国王和他的守卫总是去现场参加晚会来欢庆新年. ...

  6. 【BZOJ4167】永远的竹笋采摘 分块+树状数组

    [BZOJ4167]永远的竹笋采摘 题解:我们考虑有多少点对(a,b)满足a与b的差值是[a,b]中最小的.以为是随机数据,这样的点对数目可能很少,实测是O(n)级别的,那么我们已知了有这么多可能对答 ...

  7. Java 内存分配全面浅析(转)

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  8. 流畅python学习笔记:第十六章:协程

    通常在python进行编程一般都是使用多线程或者多进程来实现.这里介绍另外一种并发的方式,就是协程,但和多线程以及多进程不一样的是,协程是运行在单线程当中的并发.来看下具体的例子: def simpl ...

  9. cordova 实现拨打电话-只需两步(H5)

    cordova 实现拨打电话: 第一步配置conf.xml在cordova中所有的URL Schemes 都是服从于白名单的,所以a tel 在这无法正常使用.解决方法是在项目config.xml中添 ...

  10. [持续集成]Jenkins 自动化部署 Maven 工程

    一.Jenkins 持续部署原理图 基础服务: 1 SVN 服务 SVN是Subversion的简称,是一个开放源代码的版本控制系统.说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的 ...