为了达成如题的目标,仔细学习和试验了《Go语言学习笔记》5,6,7,10数据、接口、方法、反射四章。
以下学习要点笔记:
目的:向细节进发
- 数据库操作
- 文件读取
像C一样熟练,需要掌握 - Interface
像C++一样熟练,需要掌握
数据:
- 字符串
- 在结构体中byte怎么初始化?[]byte(“Hi”)
不知道怎么初始化确定的byte,下面提示错误:
type pe struct {
magic [2]byte
nt_head [4]byte
}
pe_work := [...]pe{
{},
{[2]byte("12"), [4]byte("1234")},
}
我解决了这个问题
tmp_a := [2]byte{'1', '2'}
type pe struct {
magic [2]byte
}
pe_work := [...]pe{
{tmp_a},
}
直接复制进去:
type pe struct {
magic [2]byte
}
pe_work := [...]pe{
{[2]byte{'1', '2'}},
}
这让我明白go确实有规律,但是这规律……
- 不定参数,不定类型
http://blog.csdn.net/jaykiller123/article/details/50569995
涉及接口,反射。 - 数组√
切片√
[]就是切片,是通过指针引用原始数组的东西。
除了可从数组中产生,还可直接创建:两种方法
a := make([]int,len,cap)
显式初始化:
b := []int{10,20,5:30}
当然你可以不初始化而直接用append压入来代替初始化。
此外因为可以运行时指定长度,所以就像动态数组一样哈哈。
切片可以玩出一些花活:模拟栈。
[:2:4]是:
[:2:cap]字典√
同样引用类型,需要make或初始化语句创建
make(map[int]string)
make(map[int]string,1000)//也预先准备足够的空间,减少扩张时内存分配和重新哈希操作,来提高性能
因为字典不会收缩内存,大量数据的情况下,适时替换成新对象有必要。
if语句的一种很新奇的语法是:
if 算式;表达式{
}
//用ok来判断是否存在该键值
if v,ok:=m["d"];ok{
fmt.Println(v)
}
算式一般用来算表达式。它本身没有任何逻辑作用。
if最终要验证表达式的真假值。
迭代期间 删除和新增键值安全。
delete(m,k)
注意:一个任务对字典进行写操作时,其他任务不能“读,写,删除”该任务,否则崩溃。
你可以使用
数据竞争(data race)检查此类问题:
go run -race test.go
此时可以使用sync.RWMutex读写锁实现同步,获得最佳性能。
- 结构
字段名用_的情况:
可以没有名字而只有类型,使用时类型即为属性名。(因此,一个struct中同一个类型的匿名属性只能有一个)
字段标签:
并不是注释,是元数据用来对字段描述
可反射获取,常被用做:格式校验,数据库映射等。
一个综合性的玩法是:
Golang:使用 httprouter 构建 API 服务器
方法:√
- 定义
- 匿名字段
- 方法集
方法套方法
接口
- 定义
用途:
对包外提供访问和预留扩展空间。
int怎么转bool?
自己定义函数。
重要特征:
将对象赋值给接口变量时,会复制该对象。
- 类型转换
abc.(type)
是转换类型。
type-swtich
var I Interface
switch I.(type)
case char:break;
我大致理解这是怎么回事了。
Go的基础学习也告一段落了。