struct,interface,method
struct类型,值传递的
声明
struct {
name string
age int
} //几种声明使用方式:
var P person // P现在就是person类型的变量了
P.name = "Astaxie" // 赋值"Astaxie"给P的name属性.
P.age = 25 // 赋值"25"给变量P的age属性 //按照顺序提供初始化值
P := person{"Tom", 25} //通过field:value的方式初始化,这样可以任意顺序
P := person{age:24, name:"Tom"} //当然也可以通过new函数分配一个指针,此处P的类型为*person
P := new(person)
struct的匿名字段
struct定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。
所有的内置类型和自定义类型都是可以作为匿名字段的
type Human struct {
age int
phone string // Human类型拥有的字段
} type Student struct {
Human // 匿名字段,struct
int // 内置类型作为匿名字段
phone string // 学生的phone字段
} //Student访问属性age的时候,就像访问自己所有用的字段一样
//匿名字段能够实现字段的继承。 // 初始化学生Jane jane := Student{Human:Human{35, "777-444-XXXX"},phone:"666-444-XXXX"} // 修改匿名内置类型字段
jane.int = 3 //最外层的优先访问
//访问student里面的phone字段
fmt.Println(jane.phone)
// 如果我们要访问Human的phone字段
fmt.Println(jane.Human.phone)
interface
定义interface
type interfaceName interface {
func1()
func2()
......
}
interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。因此任意的类型都实现了空interface。
如果我们定义了一个interface的变量,那么这个变量里面可以存实现这个interface的任意类型的对象。所以空interface可以存储任意类型的数值。
一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也就可以返回任意类型的值。
嵌入interface如果一个interface1作为interface2的一个嵌入字段,那么interface2隐式的包含了interface1里面的method。
面向对象
method
method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在func后面增加了一个receiver(也就是method所依从的主体)。语法如下:
func (**r ReceiverType)** funcName(parameters) (results)
虽然method的名字一模一样,但是如果接收者不一样,那么method就不一样
Receiver可以是值和指针, 两者的差别在于, 指针作为Receiver会对实例对象的内容发生操作,而普通类型作为Receiver并不对原实例对象发生操作。
method能作用在任何你自定义的类型、内置类型、struct等各种类型上面。
指针作为receiver
如果一个method的receiver是*T,你可以在一个T类型的实例变量V上面调用这个method,而不需要&V去调用这个method
如果一个method的receiver是T,你可以在一个*T类型的变量P上面调用这个method,而不需要 *P去调用这个method
func (b *Box) SetColor(c Color) {
b.color = c
}
//*b.Color=c和b.Color=c这两种方式都是正确的
//当你用指针去访问相应的字段时(虽然指针没有任何的字段)
//Go知道你要通过指针去获取这个值。 func (bl BoxList) PaintItBlack() {
for i := range bl {
bl[i].SetColor(BLACK)
}
}
//PaintItBlack里面调用SetColor的时候写成
//(&bl[i]).SetColor(BLACK)和bl[i].SetColor(BLACK)都可以
//因为SetColor的receiver是*Box都可以,因为Go知道receiver是指针,他自动帮你转了。
method继承
如果匿名字段实现了一个method,那么包含这个匿名字段的struct也能调用该method。让我们来看下面这个例子
type Human struct {
name string
age int
phone string
} type Student struct {
Human //匿名字段
school string
} type Employee struct {
Human //匿名字段
company string
} //在human上面定义了一个method
func (h *Human) SayHi() {a
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()
}
method重写
//如果Employee想要实现自己的SayHi
//我们可以在Employee上面定义一个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)
}
参考书籍:
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md
struct,interface,method的更多相关文章
- 异常:java.lang.LinkageError: loader constraint violation: when resolving interface method
异常:java.lang.LinkageError: loader constraint violation: when resolving interface method "javax. ...
- idea @Override is not allowed when implementing interface method
转自:http://blog.csdn.net/shenya2/article/details/50460447 在编码过程发现报错:@Override is not allowed when imp ...
- Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null
1.Android Studio报错 Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' ...
- Maven项目:@Override is not allowed when implement interface method
今天新建一个maven项目实现接口方法的时候报错编译不通过@Override is not allowed when implement interface method,要配置pom文件的compi ...
- Override is not allowed when implementing interface method Bytecode Version Overriding and Hiding Methods
java - @Override is not allowed when implementing interface method - Stack Overflow https://stackove ...
- Getting start with dbus in systemd (01) - Interface, method, path
Getting start with dbus in systemd (01) 基本概念 几个概念 dbus name: connetion: 如下,第一行,看到的就是 "dbus name ...
- IDEA @Override is not allowed when implementing interface method(转载)
近期研究idea,在编码过程发现报错:@Override is not allowed when implementing interface method .找到一个老外的回答,感觉挺有用的,记录下 ...
- golang 学习笔记 -- struct interface的使用
一个 interface 类型定义了一个方法集做接口. 区分goalng的方法和函数 func go() { fmt.Println('go to home') } 这是函数 type car str ...
- Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
尝试在一个空的对象引用上引用boolean java.util.List.add()这个方法: 错误例子: private ArrayList<String> classList; cla ...
随机推荐
- windbg命令行选项
我们不仅可以通过GUI的方式使用Windbg,还可以通过命令行的方式使用它,且在有些需求和使用场景下,只能使用命令行模式 windbg命令行使用以下语法: windbg [ -server Serv ...
- Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because ...
- 【loj2552】【CTSC2018】假面
题目 有\(n\)个敌方单位,初始生命值分别为\(m_1,\cdots,m_n\) : 假面可以释放\(Q\)个技能: $op = 0 , id , u , v $ 表示对\(id\)号敌人有\( ...
- GoCN每日新闻(2019-10-17)
GoCN每日新闻(2019-10-17) 通过go module管理go tool https://marcofranssen.nl/manage-go-tools-via-go-modules/ 使 ...
- Centos 7 更换为 阿里云 yum 源
地址: https://opsx.alibaba.com/ 操作步骤: 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentO ...
- EasyEarth三维可视化解决方案——智慧河长
EasyEarth—— 为河长装上“千里眼.顺风耳” 为各级河长办应急指挥.任务指派. 实绩考核提供快速直观的 高效.精准.智能化决策平台. 河长制背景 我国治水工作呈现出新老问题交织态势,河湖管理保 ...
- 如何在 Debian 9 上安装和使用 Docker
Docker 是一个容器化平台,允许您快速构建,测试和部署应用程序,作为便携式,自给自足的容器,几乎可以在任何地方运行. Docker 是容器技术的事实上的标准,它是 DevOps 工程师及其持续集成 ...
- 最新版-Python和Java实现Aes相互加解密
前情 需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然. Python实现 Python为3.6版本 # -*- coding: ...
- 【解决方案】Chrome崩溃问题解决
问题描述 出现异常之前做的操作就是,因为换工位的需要,所以关闭电脑,修改网络配置. 问题分析 Firefox和其他应用网络正常 Chrome设置.帮助等选项均打不开 分析,很可能是电脑重启后,Wind ...
- axios跨域请求报错:Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
在做项目时,用到axios,数据用post提交时,老是报错,错误提示为: Access to XMLHttpRequest at 'http://127.0.0.1:3000/api/add' fro ...