反射 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的一些笔记的更多相关文章

  1. canvas学习之API整理笔记(二)

    前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...

  2. 学习Logistic Regression的笔记与理解(转)

    学习Logistic Regression的笔记与理解 1.首先从结果往前来看下how logistic regression make predictions. 设我们某个测试数据为X(x0,x1, ...

  3. 转载-《Python学习手册》读书笔记

    转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html

  4. python学习第五次笔记

    python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...

  5. 前端学习:JS(面向对象)代码笔记

    前端学习:JS(面向对象)代码笔记 前端学习:JS面向对象知识学习(图解) 创建类和对象 创建对象方式1调用Object函数 <body> </body> <script ...

  6. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记

    <Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...

  7. Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板

    原文:Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...

  8. Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer

    原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

  9. Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍

    原文:Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本 ...

  10. Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)

    原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

随机推荐

  1. bluecms v1.6 代码审计

    0x01 使用seay源代码审计系统进行审计 扫描到了很多个可疑漏洞,不过工具都有一定的误报,下面我们就逐个进行验证 0x02 /ad_js.php SQL注入漏洞 查看源码,我们发现程序通过GET方 ...

  2. Could not create an acl object: Role '16'

    解决方案: (1) 用rm命令一个一个的清除var/cache, var/page_cache, var/di, generated/文件夹下的所有文件 (2) run setup:upgradeco ...

  3. beego 快速入门

    原文链接:https://beego.me/quickstart 1.安装依赖 git clone http://github.com/astaxie/beego.git git clone http ...

  4. kubeadm安装kubernetes(v18.8.8)

    1. 前言 kubernetes版本更新迭代非常快,上一篇写kubernetes搭建时,版本还是v1.15.0,现在已经更新到v1.18.看kubernetes在github的官方仓库,8月14日小版 ...

  5. pandas电子表格的读取(pandas中的read_excel)

    上面那篇文章中,初步介绍了一个文本文件的读取:接下来介绍另外一种常见的本地数据格式,那就是Excel电子表格,如果读者在学习或者工作中需要使用Python分析某个Excel表格数据,改如何完成第一个的 ...

  6. python读文件出现错误解决方法

    python读文件经常会出现 UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 764: illegal multi ...

  7. Spring编程式注解使用不当导致其他事务无法正常提交

    1.事故背景 原本在使用的是注解式事务,后面因为需要在事务中增加异步推送机制,所以需要将推送机制放到事务之外,修改后发现系统经常出现事务长时间无法提交导致回滚. 2.排查流程 (1)一开始重启应用是能 ...

  8. 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发

    智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...

  9. 【Pod Terminating原因追踪系列之一】containerd中被漏掉的runc错误信息

    前一段时间发现有一些containerd集群出现了Pod卡在Terminating的问题,经过一系列的排查发现是containerd对底层异常处理的问题.最后虽然通过一个短小的PR修复了这个bug,但 ...

  10. layaair 物理

    box2d http://box2d.org Box2D JS https://sourceforge.net/projects/box2d-js/ Box2D一:基础知识 https://www.c ...