学习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 ...
随机推荐
- C语言编译过程以及Windows中的gcc编译程序(通过cmd、记事本)
C语言的编译过程 1)预处理:宏定义展开.头文件展开.条件编译等,同时将代码中的注释删除,这里并不会检查语法 2)编译:检查语法,将预处理后的文件编译生成汇编文件 3)汇编:将汇编文件生成目标文件(二 ...
- jQuery的小测试
1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? $('div:has(span)'); 2.在&l ...
- LinkedBlockingQueue 和 ConcurrentLinkedQueue的区别
1. 简单的开篇 LinkedBlockingQueue 和 ConcurrentLinkedQueue 是 Java 高并发场景中最常使用的队列.尽管这两个队列经常被用作并发场景的数据结构,但它们之 ...
- hdfs-default.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="confi ...
- golang time包
1.时间类型 time.Time类型表示时间. func demo() { now := time.Now() //获取当前时间 fmt.Printf("Now:%v\n", no ...
- 数字货币比特币以太坊买卖五档行情数据API接口
数字货币比特币以太坊买卖五档行情数据API接口 数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...
- json对象遍历顺序问题
对json对象遍历我们一般使用for in循环,或者Object.keys + 数组方法.在接触js以来听到过一种说法: for in 遍历顺序是不可靠的 但是在实际开发中for in 循环也是按照其 ...
- android开发中防止刚进入activity时edittext获取焦点,防止自动自动弹出软键盘
刚进入activity的时候,如果布局组件有edittext的话,往往edittext会获取焦点,自动弹出软键盘,影响整个界面的视觉效果.解决方法如下: 可以在edittext的父布局结构中(例如Li ...
- 流光shader 和 流光+扭曲shader
我认为这种shader能通过简单的方式呈现出不错的效果. 1.流光shader: Shader "Unlit/StreamShader" { //流光shader Properti ...
- 公共项目开发:我为什么用 JSDoc,而不用 ts
公共模块,通常会被多个项目.不同的开发人员使用,所以开发公共模块时,你自己会用还不够,要让所有人都能很快的知道怎么去使用,这一点很关键.通常会从3个方面做到这点: 精心分割代码逻辑,遵循开闭原则: 变 ...