go语言学习的第一天

时间:2021-6-12 作者:qvyue

今日的内容
— Hello go
— 变量的定义
— 基础数据类型
— 自增语法
— 指针
— go不支持的语法
— string类型
— go语言的定长数组
— go语言的不定长数组(切片)
— 切片2
— go语言的字典(map)
— go语言的函数

Hello go

package main



import (
    "fmt"
)

func main() {
    fmt.Println("Hello Go!")
}

变量的定义

package main

import "fmt"//goland会帮我们自动导入包

func main() {
//  变量的声明和定义 先定义再赋值
    var name string
    name = "hws"

    var age int
    age = 20

    fmt.Println(name)
    fmt.Printf("name is: %s,%dn", name, age)
    fmt.Printf("name is:%s,%d c",name,age)

    //定义时赋值
    var gender = "man"
    fmt.Println("gender",gender)

//  定义时直接赋值
    address := "北京"
    fmt.Println("address",address)
//  平行赋值
    i,j :=10,20
    fmt.Println("换前i",i,"j",j)

    i,j =j,i
    fmt.Println("换后i",i,"j",j)
}

基础数据类型

package main

/**
    int int8 int16 int32 int64
    uint8   ....    uint64
    float32 float64
    .....

 */


func main() {

}

自增语法

package main

import "fmt"

func main() {
//  自增语法比喻是后置的且单独成行 好处 语义更加明确
    i :=20
    i++
    fmt.Println("i",i);



}

指针

package main

import "fmt"

func main() {
//  go的指针会自动帮你释放
//  编译的时候,如果发现有必要的话,就把变量分配到堆上,否则分配到栈上
    name := "hws"
    ptr := &name
    fmt.Println("name",*ptr)
    fmt.Println("name ptr",ptr)

//  使用new关键字定义
    name2 :=new(string)
    *name2 = "hwss"
    fmt.Println("name2",*name2)
    fmt.Println("name2",name2)
// 可以返回栈上的值,编译器在编译程序的时候会自动判断,将其分配到对应位置

    res :=testPtr()
    fmt.Println("res city",*res," address",res)
}
func testPtr() *string{
    city := "北京"
    ptr := &city
    return ptr
}

go不支持的语法

package main

import "fmt"

func main() {
//空指针在c语言: null c++: nullptr go:nil
//  不支持++i --i
//  不支持地址的加减
//  不支持三目运算
//  只有false才代表逻辑假,0和nil都不能代表
    res :=testPtrs()
    fmt.Println("res city",*res," address",res)

    if res == nil {
        fmt.Println("res 是空")
    }else {
        fmt.Println("res非空")
    }

}
func testPtrs() *string{
    city := "北京"
    ptr := &city
    return ptr
}

string类型

package main

import "fmt"

func main() {
    name:="hws"
//  1.定义
//  需要换行,原生输出字符串时,使用反引号``
    usage :=`./a.out
    -h help
    -a xxxx`
    fmt.Println("names",name)
    fmt.Println("usage",usage)

//  2.长度,访问
//  C++: name.length
//  GO: string没有.length方法,可以使用自由函数len()处理
    l1 := len(name)
    l2 := len(usage)
    fmt.Println(l1)
    fmt.Println(l2)

    for i := 0; i 

go语言的定长数组

package main

import "fmt"

func main() {
//定长数组
//  定义 c语言定义 具有10个数字的数组 int nums[10] ={1,2,3}
//  go语言的定义 nums := [10]int{1,2,3}  (常用)

    nums := [10]int{1,2,3,4,5}

    //2-传统遍历
    for i := 0; i python支持
//  key是数组下表 value是数组的值
    for key,value := range nums {
        //key =0 value =1  ===>nums[0]
        value++
        //实质上,value全程只是一个临时变量,不断的呗重新赋值,永远都是副本
        fmt.Println("key ",key,"value ",value,"nums",nums[key])
    }

//  go语言中如果想忽略一个值,可以使用_
    for key,_ := range nums {
        //key =0 value =1  ===>nums[0]

        //实质上,value全程只是一个临时变量,不断的呗重新赋值,永远都是副本
        fmt.Println("key ",key,"value ","nums",nums[key])
    }


}

go语言的不定长数组(切片)

package main

import "fmt"

func main() {
//  切片 :slice 他的底层也是数组,可以动态改变长度
//  定义一个切片,包含多个地名

    names := []string{"北京","北京","北京","北京","北京",}

    for i,_ := range names{
        fmt.Println("i:",i, names[i])
    }

    fmt.Println(names,"容量", cap(names))
//  1.追加数据  每次追加之后,系统判定的时候如果已经超过了已定容量,容量就会加倍
//当容量大于1K的时候每次增加的倍数为1.2倍
    name1 := append(names,"长春")
    fmt.Println(name1,"容量", cap(name1))
//  追加一个元素在原数组中
    names = append(names,"深圳")
    fmt.Println(names,"容量", cap(names))

//  2.对于一个切片,不仅有长度的概念,还有容量的概念
    nums := []int{}
    for i := 0; i 

切片2

package main

import "fmt"

func main() {
    names := [6]string{"北京1","北京2","北京3","北京4","北京5","北京6"}
    fmt.Println(names)

//  想基于names创建一个新的数组
    name1 := [3]string{}
    name1[0] = names[0]
    name1[1] = names[1]
    name1[2] = names[2]
    fmt.Println(name1)

//  切片可以基于一个数组,灵活的创建新的数组
    names2 := names[0:3]//左闭右开
    fmt.Println(names2)

//  给第二个值赋值为hello
    names[2] = "hello"
    fmt.Println("修改names[2]之后,names2:",names2)
    fmt.Println("修改names[2]之后,names:",names)
//  有点像双向绑定,修改names2的值会修改原值



//1.如果从0元素开始截取,name冒泡左边的数字可以忽略
    names3 := names[:5]
    fmt.Println(names3)
    //2.如果截取到数组的最后一个,name冒泡右边的数字可以忽略
    name4 := names[1:]
    fmt.Println(name4)
//  如果想从左到右全部使用,那么冒号左右都可以省略
    name5 := names[:]
    fmt.Println(name5)

//  也可以基于一个字符串进行切片截取:取字符串的子串helloword
    sub1 := "helloword"[:]
    fmt.Println(sub1)

//  创建空切片的时候,最好明确容量,用以提高运行效率
//  使用一个叫做make的函数
    str2 := make([]string,10,20)//类型 长度 容量 第三个参数非必须,默认为长度
    fmt.Println("str: len", len(str2),"str2: cap",cap(str2))
    str2[0] = "hello"
    str2[1] = "world"
    fmt.Println(str2)


    //  如果想让切片完全独立于原始数组,可以使用copy()函数来完成
//  深浅拷贝
    namesCopy := make([]string, len(names))
    //func copy(dst, src []Type) int
    //names是一个定长数组,copy函数接受的是参数的切片
    copy(namesCopy,names[:])
    fmt.Println(names)
    namesCopy[0]="香港"
    fmt.Println(namesCopy)
    fmt.Println(names)
//  我们发现这样写不会影响原数组
}

go语言的字典(map)

package main

import "fmt"

func main() {
//  哈希表,key->value
//  1.定义一个字典
//  学生id ===》学生名字 idName
    var idName map[int]string//定义一个map,此时map并不能直接赋值,是空的

    //2.分配空间 使用make,可以不指定长度,建议直接指定长度
    idScore := make(map[int]float64,10)
    idName = make(map[int]string,10)

    //3.定义时直接分配空间
    //idName1 := make(map[int]string,10)//最常用的方式
    idName[0] = "duke"  //哈哈哈dog li
    idName[1] = "lily"

    //4.遍历map
    for key,value := range idName{
        fmt.Println("key:",key,"value",value)
    }

//  5.如何确定一个key是否存在map
//  在map中 不存在访问越界的问题,认为所有的key都是有效的,所有访问一个不存在的值就会返回一个"零值"
//  零值:  bool->false 数字 -> 0 字符串->空
    name9 := idName[9]
    fmt.Println("name9:",name9)//为空
    fmt.Println("idScore[100]",idScore[100])//为0

//  问题:若正好100号学生分数就是0怎么判断捏? 不可靠吧!
/*
    因此我们需要有一个能校验的方式
*/
    value,ok := idName[1] //若id=1是存在的,那么value就是key=1对应的值,ok返回true
                            //  否则返回false

    if ok{
        fmt.Println("id = 1这个可以是存在的 value的值是",value)
    }
    value, ok = idName[10] //若id=1是存在的,那么value就是key=1对应的值,ok返回true
    //  否则返回false

    if ok{
        fmt.Println("id = 1这个可以是存在的 value的值是",value)
    } else{
        fmt.Println("id = 10这个值不存在返回值为",value)
    }

//  6.map元素的删除
//      使用delete函数来删除
    fmt.Println("删除前",idName)
    delete(idName,1)
    fmt.Println("删除后",idName)
//  如果删不存在的?
    delete(idName,3)
    fmt.Println("删除不存在的",idName)
}

go语言的函数

package main

import "fmt"

func main() {
    //
    i, s, b := test(10, 20, "hello")
    fmt.Println(i)
    fmt.Println(s)
    if b {
        fmt.Println("a==b是真")
    }else {
        fmt.Println("a==b是假")
    }

    fmt.Println("######################")

    res, str, bl := test1(10, 10, "我爱你")
    fmt.Println(res,str,bl)

    fmt.Println("######################")
    i2:= test2(2)
    fmt.Println(i2)
}



//函数返回值在参数列表之后,如果有多个则需要用()包裹,多个参数直接用,区分
func test(a int,b int ,c string)(int ,string,bool){
    return a+b, string(c),a==b
}


// 可以连写     返回值可以自己命名
func test1(a ,b int ,c string)(res int ,str string,bl bool){


    //  直接使用返回值的名字参与运算
    res = a+b
    str =c
    bl = true
    return res, str,bl
}
//  如果返回值只有一个参数且没有名字,那么不用写圆括号
func test2(a int)int {
    return a
}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。