• 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)
    //
    //}
  • 相关阅读:
    npm uninstall g 和 D什么区别
    js filter 去除对象中重复元素
    vueloader 安装指定版本 与 卸载
    [六、常用控件]9UIDatePicker日期时间选择器
    [六、常用控件]13在MKMapView地图上显示提示框
    [六、常用控件]12为MKMapView指定地理坐标
    [六、常用控件]6UITextField控件的使用
    [六、常用控件]8动作表样式警告窗口的使用
    [六、常用控件]5UISwitch开关控件的使用
    [六、常用控件]2UIButton图片按钮的使用
  • 原文地址:https://www.cnblogs.com/sima-3/p/11907195.html
Copyright © 2020-2023  润新知