Go语言基础
一、简介
-go介绍 -2009年11月份 -python:89年 -java:90 -Go是静态 强类型 语言 -编译型和解释型 -python解释器 -go语言,跨平台?跨平台编译 -go是不是面向对象的语言?实现类似于面向对象的功能 -go最新:1.13.4 -python:3.8 -go语言项目 -docker:容器技术 -k8s:kubernetes :容器编排 -区块链:BTCD 是用go语言实现的完整节点的比特币实现 -第一个开源的区块链项目用go写的 -在国内,go为什么这么火? -特别适合服务端开发
二、变量的定义
package main import "fmt" func main() { //var a int64=10 //fmt.Println(a) //var a=10 //fmt.Println(a) a:=10 fmt.Println(a) }
三、条件if-else,switch
package main import "fmt" func main() { a:=100 if a>=90&&a<=100{ fmt.Println("youxiu") }else if a>=80&&a<90{ fmt.Println("kianghao") }else if a>=70&&a<80{ fmt.Println("yiban") }else if a>=60{ fmt.Println("jige") }else{fmt.Println("bujige")} } func main() { a:=10 switch { case a>=90&&a<=100: fmt.Println("youxiu") case a>=80&&a<90: fmt.Println("kianghao") case a>=70&&a<80: fmt.Println("yiban") case a>=60: fmt.Println("jige") default: fmt.Println("bujige") } }
四、函数(闭包)
func wrap(x int)func(y int)int{ a := func(y int)int{ fmt.Println("xxxx") return x+y } return a } func main() { a:=wrap(4) re:=a(5) fmt.Println(a) fmt.Println(re) }
五、数组、for循环
func main() { var ls [20] int for i:=0;i<20;i++{ if i==0||i==1{ ls[i]=1 } else{ ls[i]=ls[i-1]+ls[i-2] } } fmt.Println(ls)
六、切片
-数组 -连续存储的内存块 -a:=[5]int{1,2} -a:=[5]int{3:99} -a[1]=100 -值类型 -数组的大小也是类型的一部分 -len长度 -循环数组 -两种,通过len,通过range for _,v:=range a{ } -多维数组 -切片(常用) -它是对底层数组的一个引用,它本身不存值 -定义的第一种方式,基于数组切出来 var a [5]int b:=a[0:5] -数组和切片的更改会相互影响 -切片的长度len(b),切片的容量cap(b) -append追加,超出容量,会自动扩容原来容量的两倍
切片基本创建:
package main import "fmt" func main() { //第一种通过数组切出 //第二种,通过make关键字创建 //var a []int=make([]int,4,6) //var a []int=make([]int,4) //fmt.Println(a) //fmt.Println(len(a)) //fmt.Println(cap(a))
//只定义,没有赋值,空值是nil类型 //var a []int //if a ==nil{ // fmt.Println("我是空的") //} //fmt.Println(a)
//循环 //var a []int=make([]int,4,6) //a[3]=100 //for i:=0;i<len(a);i++{ // fmt.Println(a[i]) //} //for i,v:=range a{ // fmt.Println(i) // fmt.Println(v) //}
//切片的函数传递,引用类型 //var a []int=make([]int,4,6) //a[3]=100 //fmt.Println(a) //test(a) //fmt.Println(a) //多维切片 //pls := [][]string { // {"C", "C++"}, // {"JavaScript"}, // {"Go", "Rust"}, //} //for _, v1 := range pls { // for _, v2 := range v1 { // fmt.Printf("%s ", v2) // //fmt.Println(v2) // } // fmt.Println() //}
//copy函数,把一个切片copy到另一个切片之上 //var a [1000]int=[1000]int{0,1,2,3,4,5} //b:=a[:4] //c:=make([]int,4,6) //fmt.Println(c) //copy(c,b) //fmt.Println(c) //python中的深浅copy } func test(a []int) { a[0]=999 fmt.Println(a) }
七、maps(类似于字典)
//maps package main func main() { //map的定义 //var a map[int]string //var b []int=make() //fmt.Println(b[10]) ////map的空值 nil //fmt.Println(a) //if a==nil { // fmt.Println("我是空的") //} //var a map[int]string=make(map[int]string) //var a =make(map[int]string) //a :=make(map[int]string) //fmt.Println(a) //if a==nil { // fmt.Println("我是空的") //} //var a map[int]string //nil类型 //var a map[int]string = make(map[int]string) // ////如果不初始化,操作就会出错 //a[1]="lqz" //初始化的第二种方式 //var a map[int]string= map[int]string{1:"lqz",2:"egon"} //fmt.Println(len(a)) //fmt.Println(cap(a)) //var a map[int]string = make(map[int]string) //a[1]="xx" //a[2]="uuu" //a[3]="tt" // //fmt.Println(a) //fmt.Println(len(a)) //取map中不存在的值 //var a map[int]string = make(map[int]string) //b:= make(map[string]int) //a[1]="xx" //a[2]="uuu" //a[3]="tt" //a[1]="xxxxxxxx" //fmt.Println(a) //b["1"]=1 //fmt.Println(a[4]) //fmt.Println(b["2"]) //v,ok:=a[99] //如何判断所取得key值有没有,通过v,ok:=a[1],判断ok的布尔值,来判断 //v,ok:=a[1] //fmt.Println(v) //fmt.Println(ok) //删除元素 //var a map[int]string = make(map[int]string) //a[1]="xx" //a[2]="uuu" //a[3]="tt" //delete(a,1) //fmt.Println(a) //长度 len //var a map[int]string = make(map[int]string) //a[1]="uuu" //fmt.Println(len(a)) // Map 是引用类型 //var a map[int]string = make(map[int]string) //a[1]="uuu" //fmt.Println(a) //test2(a) //fmt.Println(a) //map的相等性 //map1 := map[string]int{ // "one": 1, // "two": 2, //} // //map2 := map1 // //if map1 == map2 { //错的 //} //map是无序的 //var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"xxx",4:"yyy"} //for k,v:=range a { // fmt.Println(k) // fmt.Println(v) //} //集合-go中没有集合 //通过map表示集合 //var a map[string]bool= make(map[string]bool) //a["lqz"]=true //a["egon"]=true // //for k,_:=range a { // fmt.Println(k) // //} //补充:map嵌套需要两次初始化 //var a map[string]map[int]string= make(map[string]map[int]string) //fmt.Println(a["xx"]==nil) //a["xx"]= make(map[int]string) //a["xx"][1]="lqz" } //func test2(a map[int]string) { // a[1]="xxxxxxx" // fmt.Println(a) //} //把map做成有序 //做出一个有序集合 //map的key值必须可哈希,value值可以是函数,定义一个map
八、指针
//指针 package main import "fmt" func main() { //& 取地址 //* 解引用(把地址反解成响应的值) //b:=100 //a:=&b //c:=&a ////fmt.Println(a) ////fmt.Println(*a) //fmt.Println(*(*c))
//b:=100 //指向int类型的指针 //在一个类型前加*表示指向该类型的指针 //var a *int=&b //d:="lqz" //var f *string=&d //指针的空值是nil类型 //var a *int //fmt.Println(a) //指针的函数传递 //b:=100 //a:=&b //fmt.Println(b) //test4(a) //fmt.Println(b) //var a *[3]int =&[3]int{1,2,3} //fmt.Println(a) //test5(a) //fmt.Println(a) //不要向函数传递数组的指针,而应该使用切片 //var a [4]int =[4]int{1,2,3} //test6(a[:]) //fmt.Println(a) //Go 不支持指针运算 //向函数传递切片和切片的指针 //数组指针和指针数组 a:=10 b:=100 var c [2]*int=[2]*int{&a,&b} f:=[2]int{} var d *[2]int=&f fmt.Println(c) fmt.Println(d) } //func test4(a *int) { // (*a)+=1 // fmt.Println(*a) //} //func test5(a *[3]int) { // (*a)[0]=999 // fmt.Println(a) // fmt.Println(*a) //} //func test6(a []int) { // a[0]=999 // fmt.Println(a) //} //func test6(a *[]int) { // (*a)[0]=999 // fmt.Println(a) //}
九、结构体
//结构体 package main //结构体是一系列数据的集合 //如何创建结构体 //type关键字 结构体名字 struct{ // 数据属性 // 数据属性 //} //人类结构体 //type Person struct { // name string // age int // sex int //} //type Person struct { // string //匿名字段 // int // sex int //} //结构体嵌套 //type Hobby struct { // name string // hobbyid int //} //type Person struct { // name string // //age int // //sex int // age,sex int // Hobby //} func main() { //定义 //var a Person //fmt.Println(a) //a.name="lqz" //a.age=19 //fmt.Println(a) //定义并初始化方式一 //var a Person=Person{name:"lqz",age:19,sex:1} //var a Person=Person{} // a :=Person{name:"lqz",age:19,sex:1} //fmt.Println(a) //定义并初始化方式二,位置不能乱,有几个值必须都传 //a:=Person{"lqz",18,1} //fmt.Println(a) //匿名结构体(type和名字都不写) //a:=struct { // name string //}{} //a.name="xxx" //fmt.Println(a.name) //结构体的指针 //var a Person=Person{name:"lqz",age:19,sex:1} ////a:=&Person{name:"lqz",age:19,sex:1} ////test5(a) ////fmt.Println(a) //test6(&a) //fmt.Println(a) //匿名字段(用来做变量提升) //a:=Person{"lqz",18} //a:=Person{string:"lqz",int:18} //fmt.Println(a.int) //结构体嵌套 //a := Person{name: "lqz", age: 18, sex: 1, hobby: Hobby{hobbyid: 1, hobbyname: "篮球"}} //a := Person{name: "lqz", age: 18, sex: 1} //a.hobby.hobbyname="篮球" //fmt.Println(a) //结构体嵌套的匿名字段 //a:=Person{} //fmt.Println(a) ////a.Hobby.hobbyname="栏去" //a.hobbyname="栏去" //a.Hobby.hobbyid=10 //fmt.Println(a) //如果重名了怎么办?不提升 //a:=Person{} //a.name="lqz" //a.Hobby.name="篮球" //fmt.Println(a) //结构体是值类型。如果它的每一个字段都是可比较的,则该结构体也是可比较的。如果两个结构体变量的对应字段相等,则这两个变量也是相等的 } //func test5(a Person) { // a.name="xxxxxx" // fmt.Println(a) //} //func test6(a *Person) { // //(*a).name="xxxxxx" // a.name="xxxxxx" //内部处理了,不需要解引用,直接使用也可以 // fmt.Println(a) //}
十、方法
//方法 //函数是什么,方法是什么? package main //func (t Type) methodName(parameter list) { //} //type Person struct { // name string // age,sex int // //} ////给结构体绑定方法 //func (p Person)printName() { // fmt.Println(p.name) //} ////func (p Person)changeName(name string) { //// p.name=name //// fmt.Println(p) ////} //func (p *Person)changeName(name string) { // //p.name=name // (*p).name=name // fmt.Println(p) //} //func changeName(p *Person,name string) { // p.name=name //} //func main() { // //p:=Person{name:"lqz",age:18} // ////p.printName() // //p.changeName("egon") // //fmt.Println(p) // //值接收器和指针接收器 // //p:=&Person{name:"lqz",age:18} // p:=Person{name:"lqz",age:18} // p.changeName("egon") // fmt.Println(p) // changeName(&p,"egon") // // //} //type address struct { // city string // state string //} // //func (a address) fullAddress() { // fmt.Println("Full address", a.city, a.state) //} // //type person struct { // firstName string // lastName string // address //匿名字段 //} // //func main() { // p := person{ // firstName: "Elon", // lastName: "Musk", // address: address { // city: "Los Angeles", // state: "California", // }, // } // // p.fullAddress() //访问 address 结构体的 fullAddress 方法 // //p.address.fullAddress() //} //在方法中使用值接收器 与 在函数中使用值参数 //在方法中使用指针接收器 与 在函数中使用指针参数 //type Person struct { // name string //age,sex int //} // //func (p Person)printName() { // fmt.Println(p.name) //} //func (p *Person)printName2() { // fmt.Println(p.name) //} //func printName(p Person) { // fmt.Println(p.name) //} //func printName2(p *Person) { // fmt.Println(p.name) //} //func main() { // p:=Person{name:"lqz",age:19} // p.printName2() // p.printName() // p_point:=&p // p_point.printName2() // p_point.printName() // // printName(p) // printName2(p_point) // // //printName2(p) 出错 // //printName(p_point) 出错 //} //非结构体上的方法 //func (i int)add() { // i=i+1 //} //type MyInt int //func (i *MyInt)add() { // (*i)+=1 //} //func main() { // var a MyInt // a.add() // a.add() // fmt.Println(a) // //}