您的位置:首页 > 编程语言 > Go语言

四、golang类型讲解--go语言学习笔记

2016-04-05 13:34 666 查看
擅自使用了七牛大牛们的PPT资料,希望不要怪罪,这里谢谢大牛们的分享。

映射 map

一个”键-值”对

关键点:注意并发读写情况,上锁

不能对未初始化的 map 进行写,会抛异常(panic)

对于迭代操作,每次结果可能不一致(乱序)

var m map[string]int
m["k1"] = 7 // 错误: assignment to entry in nil map

m := make(map[string]int) // 初始化成一个空 map: [], 可以进行读写
m["k1"] = 7
m["k2"] = 13
delete(m, "k2")      // 删除 "k2" 对应的值
v, ok := m["k2"]     // 检查 "k2" 对应的值是否存在
fmt.Println(m["k3"]) // 不存在的 key 默认返回空值

for k, v := range m { // 迭代的结果每次可能不一致
fmt.Println(k, v)
}


make() 内建方法只能用于创建 slice, map 和 channel

slice, map, channel 是指向底层数据结构的引用,使用前必须被初始化

指针

Go 有指针,但是没有指针运算。你不能 用指针变量遍历字符串的各个字节。

Go 指针只是一种引用。

取址操作符 & 获取变量存放地址,可以赋给一个指针。

创建自己定义的类型

type Person struc {
Name string
Age int
parent string
}

p := new(Person)

p.Name = "Lishi" // 首字母大写字段,可导出,可在其它包中进行读写
p.Age = "28"
p.parent = "He" // 首字母小写字段,不可导出,不可在其它包中进行读写


方法定义

func (p *Person) Study(lang string) {
fmt.Println("Study some language...", lang)
}

p.Study("Golang")


匿名字段

type S struct {
a string
b string
}

type B struct {
S       // 匿名字段,只有类型 S, 字段名是 S
b   int // 字段名是 b
int     // 匿名字段,只有类型 int, 无意义
}

var b B
b.S.a = "a" // 给匿名字段 S 赋值
b.a = "a"   // 同上

fmt.Println(b)
// 输出结果: {{a } }
不是{a}

type String string

b.S.b = "b" // 给匿名字段 S 赋值
b.b = 10    // 名字冲突,不同上,不能这样给匿名字段中的相同字段赋值


方法继承

type S struct {
a, b string
}

type B struct {
S
}

func (s *S) String() {
fmt.Println("In A: ", s.a, s.b)
}

var b B
b.a = "a"
b.b = "b"

b.S.String()
b.String() // 等价于 b.S.String()


方法覆盖

给类型 B 添加一个方法覆盖类型 S 中的 String()

type S struct {
a, b string
}

type B struct {
S
}

func (s *S) String() {
fmt.Println("In A: ", s.a, s.b)
}

func (b *B) String() {
fmt.Println("In B: ", b.a, b.b)
}

var b B
b.a = "a"
b.b = "b"

b.S.String()
b.String() // 不等价于 b.S.String()


字节对齐

type B struct {
a byte
b string
c byte
}

unsafe.Sizeof(B) => 32




对比一下

type A struct {
a string
b byte
c byte
}

unsafe.Sizeof(A) => 24


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息