高新能,高并发
语法简单,学习平缓
丰富的标准库
完善的工具链
静态链接
快速编译
跨平台
垃圾回收
python性能问题
c++不适合做在线业务
早期团队不是Java背景
性能搞
容易部署
学习成本低
内部的RPC和HTTP框架的推广
隐式声明,会自动推导类型
var a = "init" d := "helloworld"
显式声明
var b,c int = 1,2
常量会根据上下文自动确定类型
const s string = "const" const num = 10000
tips:goland中if后面不推荐写()
if true {} // 而不是 if (true) {}
没有while和dowhile循环只有for,for循环也没有括号
for i := 0 :i < 100 :i++ { fml("进行一些操作") }
switch中自动集成了break,在case后面
//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)
// 名字 关键字 键 值 //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不是线程安全的
//切片-数组 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)
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) }
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) }