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)
//
//}

 

 

 

 

 

posted @ 2019-11-21 17:55  纵横捭阖行  阅读(126)  评论(0编辑  收藏  举报