使用Go像C/C++一样熟练-学习笔记

为了达成如题的目标,仔细学习和试验了《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的基础学习也告一段落了。

猜你喜欢

转载自blog.csdn.net/dalerkd/article/details/78602388