go 语言基本语法

发布时间 2023-04-24 17:33:13作者: 龍飛鳯舞
一、go语言初探
1. 基本数据类型 整型(int)、浮点型(float)、布尔型(bool)、字符串(string)
2. 复合数据类型 数组、切片、结构体、函数、map、通道(channel)、接口等

3. 安装Bee go install github.com/beego/bee/v2@master

4. 命令:
    go version #查看go的安装版本
    go env #查看go运行环境
    go run main.go #运行go脚本
    go build main.go #生成main.exe 
    main.exe #执行生成的文件
    go fmt main.go #格式化代码 一般不用了, 编辑器可以格式化
    go get github.com/shopspring/decimal 下载go插件

二、语法:
1. fmt.Print #可以接收多个参数
2. fmt.Println #可以接收多个参数
3. fmt.Printf #格式化输出 类似c语言 %v 相应默认格式输出 %T 输出数据类型 int ....
4. fmt.Sprintf # 格式化输出到变量

4.定义变量 定义变量后必须使用否则会报错 建议用驼峰方式定义 小驼峰表示私有/大驼峰表示公有
    var a = 'aaa' 
    var a int = 10 
    a := 10 #类型推导方式定义变量 短变量声明法 不能声明全局变量

    #变量初始化的方式 同一作用域变量不能重复声明
        var name string
        name = "张三" #先定义再赋值的方式 必须用双引号
            或
        var name string = "张三" #直接赋值方式
            或
        var name = "张三" #类型推导方式 name := "张三" 短变量声明法


    #定义多个变量
        var a1, a2 string #同类型变量
        a1 = "张三"
        a2 = "李四"var ( #也可以使用类型推导方式
            username string
            age      int
            sex      string
        )
        username = "张三"
        age = 18
        sex = ""
            或
        a, b, c := 12, 13, "C" # 短变量声明多个变量

    #匿名变量 _

    var username string #变量不设置值 默认值为空
    var num int #变量不设置值 默认值为0

5. 常量 const pi = 3.14195 #定义常量必须赋值
    # 一次定义多个常量
    const (
        A = "A"
        B = "B"
    )
    const ( # 如果后面的常量不赋值, 则值等于前面的常量值 且 常量定义后不使用也不会报错
        name = "abc"
        name2
    )

    const ( # iota 常量自动累加 类似计数器
        a = iota # 0
        b # 1
        c # 2
    )

    const ( # iota 常量自动累加 类似计数器
        a = iota # 0
        _ # 跳过某个值
        c # 2
    )

    const ( # iota 常量自动累加 类似计数器
        a = iota # 0
        b = 100 # 100
        c # 2
        d # 3
    )

    const ( # 矩阵?
        a, b = iota + 1, iota + 2 #1 2
        c, d # 2 3
        e, f # 3 4
    )

6. 数据类型
    int类型 unsafe.Sizeof(a) 变量占用的存储空间(占用空间的位数) int类型尽量用具体的类型不要直接使用int, 因为int占用8字节会浪费内存空间
        有符号整型: int8 int16 int32 int64(默认)
        无符号整型: uint8 uint16 uint32 uint64
        不同位数不能进行加减运算, 运算前需进行类型转换如int64(a) 注意高位转低位溢出问题
        char字符: 属于int类型 值为字符对应的ascii码 用单引号设置值 fmt.Printf("%c",'a') 原样输出

    float浮点型
        float32 float64(默认)
        科学计数法: var a = 3.14e2 #314

    bool布尔型 默认值是false, bool无法转换成整型, 不能参与运算

    string字符串 要用双引号 字符用单引号
        str1 := `agsd` #原样字符串/多行字符串使用反引号, 类似js的模板字符串
        len(str) # 计算字符串占用存储空间, 一个中文占三个字节
        + # 拼接字符串
        strings.Split(str,"-") # 字符串分割成切片
        strings.Join(str,"-") # 切片连接成字符串
        strings.Contains(str1, "123") # 字符串是否包含另一个字符串 true/false
        strings.HasPrefix(str1, "123")/strings.HasSuffix(str1, "123") # 前辍/后辍是否包含某个字符串 true/false
        strings.Index(str1, "456") # 查找字符串第一次出现的位置(从前往后找) 找不到返回-1
        strings.LastIndex(str1, "456") # 查找字符串第一次出现的位置( )从后往前找) 找不到返回-1

        #循环输出字符串
        s := "你好 golang"
        for _, v := range s {
            fmt.Printf("%v(%c)", v, v)
        }

        #修改字符串
        s1 := "big"
        byteStr := []byte(s1) //转换成byte
        byteStr[0] = 'p' //修改字符串
        fmt.Println(string(byteStr)) //转回string pig

        s1 := "你好"
        byteStr := []rune(s1) //转换成rune
        byteStr[0] = '' //修改字符串
        fmt.Println(string(byteStr)) //转回string 大好
7. 基本数据类型转换: int8()、int16()、float32()、float64()
    str := fmt.Sprintf("%d",num) #可以使用Sprintf 把任意类型转换成字符串类型
    strconv.FormatInt(int64(a),10) # int转字符串
    strconv.FormatFloat(float64(a),'f',2,64) #浮点转字符串
    strconv.ParseInt # 字符串转int

    # 字符串转int
        str := "abc"
        num, err := strconv.ParseInt(str, 10, 64)

    # 字符串转float strconv.ParseFloat
    # 不建议把strng 转 bool

8. 运算符
    # int 相除 只保留整数部分
    # ++ -- 无前置运算符

9. 流程控制语句
    if: 条件不加括号, 大括号不能省略且不能换行
    # 没有while语句
    for: 条件不加括号

    # for rang 循环字符串
    str := "你好 golang"
    for _, v := range str {
        fmt.Printf("%c", v)
    }

    #for rang 循环切片 也可以用len计数循环
    arr := []string{"php", "java", "golang"}
    for k, v := range arr {
        fmt.Println(k, v)
    }

    switch case # case 1,2,3,5 可以这样写 可以不写break fallthrough 穿透一层