学习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 ...
随机推荐
- GaussDB基本操作
列出所有数据库 \l 切换数据库 \c ${databaseName} 列出当前数据库下的表 \d 列出表的所有字段 \d ${tableName} 查看指定表的基本情况 \d+ ${tableNam ...
- 二叉搜索树 [四边形不等式优化区间dp]
二叉搜索树 [四边形不等式优化区间dp] 题目描述 有 \(n\) 个结点,第 \(i\) 个结点的权值为 \(i\) . 你需要对它们进行一些操作并维护一些信息,因此,你需要对它们建立一棵二叉搜索树 ...
- 微信小程序自动化测试最佳实践(附 Python 源码)
本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版. 随着微信小程序的功能和生态日益完善,很多公司的产品业务形态逐渐从 App 延升到微信小程序.微信公众号等.小程 ...
- 微信DLL劫持反弹shell复现
(该文参考网络他人资料,仅为学习,不许用于非法用途) 一.操作环境 Windows7 : 微信 , Process Explorer(任务管理工具,本实验中用于查找微信程序调用的DLL文件) Ka ...
- 关于MapReduce默认分区策略
MapReduce默认分区策略 mapreduce 默认的分区方式是hashPartition,在这种分区方式下,KV对根据key的hashcode值与reduceTask个数进行取模,决定该键值对该 ...
- html+css知识点以及常见的坑
float 与 绝对定位 共同点:都脱离文档流,不占用原来的位置,后面的内容占有位置 不同点: float后者居上,补齐,且只能在父级盒子内活动,且不能浮动在照片上. 绝对定位脱离文档流后,直接漂浮到 ...
- Locust性能测试2--登录示例
无论是做接口自动化还是做压测,解决了登录就离成功进步了一大半,下面做个简单的登录案例,后续再说下数据依赖及参数化等问题 1. 登录 登录示例 from locust import HttpUser, ...
- JS事件——添加、移除事件
element.addEventListener(event, function, useCapture) 方法用于向指定元素添加事件句柄. event: 必须.字符串,指定事件名.注意: 例 使 ...
- 「Netty实战 02」手把手教你实现自己的第一个 Netty 应用!新手也能搞懂!
大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 很多小伙伴搞不清楚为啥要学习 Netty ,今天这篇文章开始之前,简单说一下自己的看法: @ 目录 服务端 创建服务端 自定义服务端 Cha ...
- openCV - 3. Mat对象
Mat对象与IplImage对象.Mat对象使用.Mat定义数组 Mat对象与IplImage对象 Mat对象OpenCV2.0之后引进的图像数据结构.自动分配内存.不存在内存泄漏的问题,是面向对象的 ...