这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
内容源于青训营课堂视频以及一些go文档和自己的经验、理解,若有错误欢迎及时指出
2.7指针
相比于C/CPP,Go的指针操作很简单,主要用途就是对于传入参数进行修改,不能进行偏移和运算
&取地址, *取值
go中的值类型都有对应的指针类型
2.8结构体
结构体是带类型的字段的集合,支持指针实现对结构体的修改和开销节约
Go没有类的概念,而是通过结构体和接口实现比面向对象具有更高的扩展性和灵活性
自定义类型和类型别名
使用type关键字
// MyInt 类型别名
type MyInt = int
// NewInt 自定义类型
type NewInt int
定义结构体
结构体是值类型,而字段和结构体名首字母的大小写表明私有或公共
type user struct {
name string
password string
}
实例化
a := user{name: "Ltd", password: "1024"}
b := user{"Ltd", "1024"}
c := user{name: "Ltd"}
c.password = "1024"
var d user
d.name = "Ltd"
d.password = "1024"
结构体方法
注意结构体方法绑定的时候是否用指针类型的,一种就是修改副本,一种是修改原始的
func (p *Point) use() {
}
func (p Point) use() {
}
面试题
m := make(map[string]*student)
stus := []student{
{name: "L", age: 11},
{name: "T", age: 12},
{name: "D", age: 13},
}
for _, stu := range stus {
fmt.Println(&stu)
// 这里指向的是stu的内存空间,而range是值拷贝,当遍历完了都指向了最后一个stu的地址
m[stu.name] = &stu
}
for k, v := range m {
fmt.Println(k, "=>", v.name)
}
特别注意对slice和map数据类型都包含了指向底层数据的指针,对他们赋值的时候需要特别注意,后续修改的话结构体字段值也会改变
2.9字符串操作
func main() {
a := "hello"
fmt.Println(strings.Contains(a, "ll")) // true 判断是否包含子串
fmt.Println(strings.Count(a, "l")) // 2 统计子串出现次数
fmt.Println(strings.HasPrefix(a, "he")) // true 判断是否包含前缀
fmt.Println(strings.HasSuffix(a, "llo")) // true 判断是否包含后缀
fmt.Println(strings.Index(a, "ll")) // 2 查找子串序列
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo 字符串拼接
fmt.Println(strings.Repeat(a, 2)) // hellohello 字符串重复
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo 替换
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(a)) // hello
fmt.Println(strings.ToUpper(a)) // HELLO
fmt.Println(len(a)) // 5
b := "你好"
fmt.Println(len(b)) // 6
}
格式化
标准包fmt,Printf、Sprintf方法
可以用 %v 来打印任意类型的变量,%T打印数据类型
2.10Json处理
结构体和json格式转换,只要结构体每个字段第一个字母大写就可以使用json.Marshal来序列化,而反序列化结果每个字段也是大写字母开头json.Unmarshal