学习go的一些笔记
反射 reflect
type CfgSt struct{
Match *int64 `ini:"match"`
Desc string `ini:"desc"`
Level *int64 `ini:"level"`
}
如果结构体不是指针:
typ := reflect.TypeOf(c)
val := reflect.ValueOf(c)
如果结构体是指针:
typ := reflect.TypeOf(c).Elem()
val := reflect.ValueOf(c).Elem()
结构体成员数:
val.NumField()
结构体成员名:
val.Type().Field(idx).Name
结构体成员tag名:
typ.Field(idx).Tag.Get("ini")
成员值:
val.Field(idx).Interface()
值得类型断言
switch v := val.Field(idx).Interface().(type) {
case *int64:
if val.Field(idx).IsNil() {
continue
}
log.Println(*v)
case string:
log.Println(v)
}
接口 interface
- 如果对象实现了接口的所有方法,那么可以把对象的实例赋值给该接口;但是接口不能调用对象中接口没有定义的方法。
- 可以在编译时检查接口是否被实现,利用下面两种中的一种即可
- var _ face = (*rabbit)(nil) // 推荐用这种方式
- var _ face = new(rabbit)
- 传值的方法会默认实现传引用的方法,反之不成立
- 比如 func (r rabbit) Sayhi() 默认实现 func (r *rabbit) Sayhi(),但是反之不成立
- 不能直接对内嵌类型添加方法
package main
import (
"log"
)
type face interface {
Sayhi()
Bye()
}
type rabbit struct {}
func (r rabbit) Sayhi() {
log.Println("rabbit say hi")
}
func (r rabbit) Do() {
log.Println("rabbit do something")
}
func (r rabbit) Bye() {
log.Println("rabbit say bye")
}
type ty int64
func (r ty) Sayhi() {
log.Println("ty say hi")
}
func (r ty) Bye() {
log.Println("ty say bye")
}
func (r ty) Do() {
log.Println("ty do something")
}
// 类似于assert断言,在编译时候检查是否实现了接口
// 类型断言是在运行时动态检查
var _ face = (*rabbit)(nil)
var _ face = new(rabbit) // 不推荐,因为为对象会分配空间
var _ face = (*ty)(nil)
func main() {
var i face
i = rabbit{}
i.Sayhi()
//i.Do()
i.Bye()
var a ty // 不可少不能直接用 i = ty{}
i = a
i.Sayhi()
i.Bye()
}
类型断言
- 指定类型typename断言
if v, ok := i.(typename);ok {
log.Println(v)
} else {
log.Println("invalid")
}
- 不指定类型断言
switch i.(type) {
case int:
...
case int64:
...
...
}
判断map是否包含成员
类似于类型断言
m := make(map[string]int, 0)
if v, ok := m["asd"];ok {
log.Println(v)
} else {
log.Println("invalid")
}
流控语句
- fallthrough
go 中switch每个分支默认执行完毕break,这与c语言不一样。
可以通过添加 fallthrough来实现类似c的效果
switch {
case false:
log.Println(0)
fallthrough
case true:
log.Println(1)
fallthrough
case false:
log.Println(2)
fallthrough
default:
log.Println("default cannot use fallthrough")
//fallthrough
}
- break
go 中break可以指定退出的循环,默认只退出最内层循环
mark:
for {
for idx := 0; idx < 10; idx++ {
log.Println("for ", idx)
if idx == 5 {
break mark
}
}
}
学习go的一些笔记的更多相关文章
- canvas学习之API整理笔记(二)
前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...
- 学习Logistic Regression的笔记与理解(转)
学习Logistic Regression的笔记与理解 1.首先从结果往前来看下how logistic regression make predictions. 设我们某个测试数据为X(x0,x1, ...
- 转载-《Python学习手册》读书笔记
转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html
- python学习第五次笔记
python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...
- 前端学习:JS(面向对象)代码笔记
前端学习:JS(面向对象)代码笔记 前端学习:JS面向对象知识学习(图解) 创建类和对象 创建对象方式1调用Object函数 <body> </body> <script ...
- 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
<Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...
- Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板
原文:Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...
- Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer
原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...
- Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍
原文:Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本 ...
- Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)
原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
随机推荐
- linux下免密登录配置
1.首先大家先开三台虚拟机 2.回到首层. 2.1:编辑文件: vim /etc/ssh/sshd_config 3:在master的linux上生成ssh密钥: ssh-keygen -t r ...
- 关于python中Enum的个人总结
关于python中Enum的个人总结 初识 可以通过enum模块导入 语法 初始化: 可以通过enum_ = Enum('class_name', names,start = 1)来创建,其中name ...
- win10下使用AIDA64建立副屏监控
写在前面: 最近刚攒了一台台式机,但是苦于没有太喜欢的温度监控插件,在贴吧里面看到有人用AIDA64做了一个副屏监控,感觉非常6,于是就开始了折腾之路. 需要的设备和软件: windows系统电脑一台 ...
- 极简 Node.js 入门 - 3.3 文件写入
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- 结合Excel批量操作网页,模拟登陆
有这样一个场景,客户的一批账户密码保存在Excel中,需要逐一登录,进行某些操作 从头开始来的话很麻烦,读取Excel,安装Web控件,主要是控件操作没有很方便,有没有类似原始js调用.jqurey调 ...
- 【转】python调用youtube-dl实现视频下载
youtube-dl是一个命令行程序,用于从YouTube.com和更多网站下载视频.它需要Python解释器,版本2.6,2.7或3.2+,并且支持Unix,Windows或Mac OS X中运行. ...
- 手写一个简单版的SpringMVC
一 写在前面 这是自己实现一个简单的具有SpringMVC功能的小Demo,主要实现效果是; 自己定义的实现效果是通过浏览器地址传一个name参数,打印“my name is”+name参数.不使用S ...
- MapReduce 的 shuffle 过程中经历了几次 sort ?
shuffle 是从map产生输出到reduce的消化输入的整个过程. 排序贯穿于Map任务和Reduce任务,是MapReduce非常重要的一环,排序操作属于MapReduce计算框架的默认行为,不 ...
- iOS多线程之GCD、OperationQueue 对比和实践记录
[toc] 简介 在计算的早期,计算机可以执行的最大工作量是由 CPU 的时钟速度决定的.但是随着技术的进步和处理器设计的紧凑化,热量和其他物理约束开始限制处理器的最大时钟速度.因此,芯片制 ...
- 揭秘 Kubernetes attach/detach controller 逻辑漏洞致使 pod 启动失败
前言 本文主要通过深入学习k8s attach/detach controller源码,了解现网案例发现的attach/detach controller bug发生的原委,并给出解决方案. 看完本文 ...