BytedanceGolang教程笔记
1.dayOne
1.特点
高新能,高并发
语法简单,学习平缓
丰富的标准库
完善的工具链
静态链接
快速编译
跨平台
垃圾回收
2.字节为什么选择Go
python性能问题
c++不适合做在线业务
早期团队不是Java背景
性能搞
容易部署
学习成本低
内部的RPC和HTTP框架的推广
3.变量和常量
3.1变量的声明方式
隐式声明,会自动推导类型
var a = "init"
d := "helloworld"
显式声明
var b,c int = 1,2
3.2常量
常量会根据上下文自动确定类型
const s string = "const"
const num = 10000
4.分支
tips:goland中if后面不推荐写()
if true {}
// 而不是
if (true) {}
5.循环
没有while和dowhile循环只有for,for循环也没有括号
for i := 0 :i < 100 :i++ {
fml("进行一些操作")
}
6.switch
switch中自动集成了break,在case后面
7.数组
//1,数组 var name [count]int ,并且拥有严格的类型
var courses1 [3] string
var courses2 [4]string
fmt.Printf("%T\n",courses1)
fmt.Printf("%T\n",courses2)
// []string 是一个切片,[3]string是一个三个元素的数组,Go拥有很强的类型
courses1[0] = "字节跳动"
courses1[1] = "美团"
courses1[2] = "华为"
for ,value := range courses1{
fmt.Println(value)
}
//数组的初始化
var names = [3]string {"Go","Java","c++"}
for ,value := range names{
fmt.Println(value)
}
//[...]是可变长数组
var ages = [...]string {"Go","Java"}
for _,value := range ages{
fmt.Println(value)
}
//数组之间的比较 1,类型得一样。 2元素内容和顺序也得一样
//多维数组,声明方法
var courseinfo [3][4] string
var couseinfo2 = [3][4] string {}
fmt.Println(courseinfo)
fmt.Println(couseinfo2)
8.map
// 名字 关键字 键 值
//var courseMap map[string]string
//初始化,map类型想要放置值必须要初始化
var courseMap1 = map[string]string{
"Go": "工程师",
"Java": "Java工程师",
}
//var courseMap1 = make(map[string]string,3)
fmt.Println(courseMap1["Java"])
//防值
courseMap1["hello"] = "helloworld"
fmt.Println(courseMap1)
//虽然是遍历,但是还是无序的
for key, value := range courseMap1 {
fmt.Println(key, value)
}
for key := range courseMap1 {
fmt.Println(key, courseMap1[key])
}
//判断是否
if d, ok := courseMap1["Java"]; !ok {
fmt.Println("not in")
} else {
fmt.Println("find " + d)
}
//删除,而且删除了不存在的元素不会报错
delete(courseMap1,"Java")
fmt.Println(courseMap1)
//tips:map不是线程安全的
9.slice
//切片-数组
var courses []string
fmt.Printf("%T\n",courses)
//append方法追加值,但是需要做接收
courses = append(courses,"Go")
fmt.Println(courses)
// 切片初始化
//1
allCourse := [3]string {"go","sm","leetcode"}
courseSlice := allCourse[0:len(allCourse)]// 左闭右开
fmt.Println(courseSlice)
//2
//courseSlice := []string {"go","sm","leetcode"}
//3,make函数,先把空间准备好,设置大小很麻烦
allCourse2 := make([]string,3)
allCourse2[0] = "c"
fmt.Println(allCourse2)
//可以在数组上创建切片,也可以在切片上面创建切片
//访问切片的元素
//fmt.Println(courseSlice[start:end]) 左闭右开
//多种元素添加,类似于js中的方法
courseSlice2 := []string{"mysql","jdbc"}
courseSlice3 := []string{"mysql","zhiyin"}
courseSlice2 = append(courseSlice2,courseSlice3...)
fmt.Println(courseSlice2)
//删除元素,没有直接的方法,需要重新生成slice
//复制slice
//courseSliceCopy := courseSlice
//fmt.Println(courseSliceCopy)
//利用copy的时候需要先拷贝长度
var courseSliceCopy []string =make([]string,len(courseSlice))
copy(courseSliceCopy,courseSlice)
fmt.Println(courseSliceCopy)
10.struct
package main
import "fmt"
// 结构体的定义
type Person struct {
name string
age int
address string
height float32
}
func main() {
//如何初始化结构体
p1 := Person{
name: "正字通",
age: 18,
address: "陕西省汉中市",
height: 189.0,
}
p2 := Person{
name: "肖哈哈",
age: 18,
address: "陕西省汉中市",
height: 189.0,
}
fmt.Println(p1)
//加入一个切片中
var persons []Person
persons = append(persons,p1)
persons = append(persons,p2)
fmt.Println(persons)
//可以这样赋值
p2.age = 20
fmt.Println(p2.name)
//匿名结构体
address := struct {
province string
city string
address string
}{
"陕西省",
"咸阳市",
"武功县",
}
fmt.Println(address.city)
}
11.结构体方法
package main
import "fmt"
type user struct {
username string
password string
}
// 为*结构体绑定方法 方法名 参数 返回值
func (u user) ChangePassword (password string) bool {
return u.password == password
}
func (u user) resetPassword (password string) {
u.password = password
}
func main() {
u := user{
username: "hello world",
password: "123456",
}
u.resetPassword("hahahah")
fmt.Println(u)
}