走进Go语言基础(3) | 青训营笔记

68 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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