GO 数据类型 常量和函数

内容详细

1 基本数据类型

        // 两大类
            -基本数据类型
                -数字
                    -很多
                -字符串
                -布尔
            -复合数据类型
                -切片
                -map
                -结构体
                -接口
                -函数


        // 基本数据类型
            -整形
                -int
                -int8
                -int16
                -int32
                -int64
            -无符号整形
                -uint
                -uint8
                -uint16
                -uint32
                -uint64
            -浮点型
                -float32
                -float64
            -复数类型(知道)
                -complex64,complex128
            -其他
                -rune
                -byte

            -字符串类型
                -string
              -""
              -``
            -布尔类型
                -bool
              -false
              -true
        package main

        import "fmt"

        // 基本数据类型
        func main() {
           // 1 整形
           // 8个比特位,8个小格,每个小格中只能放0或1 ,1个字节,1个字节能够表示的变化是:2的8次方,
           // 有正负  2的7次方,还有个0
           //var age int8=127  // 超长了,int8能够表示的数字范围: 正负 2的7次方-1
           //var age int16=-32768  //  正负 2的15次方-1
           //var age int32=32768  //  正负 2的31次方-1
           //var age int64=32769  //  正负 2的63次方-1
           //fmt.Println(age)
           // 更节约内存
           // 写程序,如果拿着数字10,int8占1个字节  int64 占4个字节

           // 补充:python中不讲求这个,直接定义即可,可以无限大,它是一个对象,对象还有方法,占空间
           // 补充:java中的变量类型
              /*
              byte(位)     : int8
              short(短整数) : int16
              int(整数)     : int32
              long(长整数)  : int64
              float(单精度) : float32
              double(双精度) : float64
              char(字符)   : byte 不是完全对象,暂时先这么理解
              boolean(布尔值):bool类型
               */

           // int 类型 ---》在32位机器是 int32,在64位机器是int64


           // 无符号整形--->没有负数
           // uint  :在32位机器是 uint32,在64位机器是uint64
           // uint8  2的8次方-1
           //var a uint8=255
           //var a uint8=-1  // 不可以
           //fmt.Println(a)
           // 表示人的年龄--》uint8 ---》
           // 人的年龄就用int类型,完全没有问题


           // 浮点型--》带小数点---》本身就是会有精度损失
           // float32 小数点后6位
           // float64 小数点后15位
           //var a float32=2.123456789
           //var a float64=2.123456789123456789
           //fmt.Println(a)

           // 复数---》高等数学 --->实部  虚部---》 复数由实部(real)和虚部(imag)构成
           // complex64
           // complex128
           //var a complex64=9+2i
           //var b complex64=8+3i
           //fmt.Println(a+b)


           // byte 是uint8的别名---》底层就是uint8--->type byte = uint8---》一个byte占1个字节--》ASCII码-->1个字节
           //var a byte =255
           //var a byte ='z'  //【单引号】引起ASCII的一个字符
           //var a byte =97
           //fmt.Println(a)

           //rune 是int32的别名---》底层就是int32--->type rune = int32--》占4个字节---》表示一个unicode编码的字符
           // unicode 是4个字节表示一个字符
           //var a rune ='中'  // unicode 编码的 中  字
           //fmt.Println(a)
           // 这俩东西是为了表示字符串的


           // 字符串类型  string
           // 双引号,或者是 反引号:反引号可以换行,中间可以带双引号   ----》没有单引号或三引号
           // 单引号不是表示字符串,表示的是一个 unicode 字符
           //var name string = "lqz\n" +
           // "is" +
           // "handsome"
        // var name string = `lqz
        //     is
        //handsome ""
        //`
        // fmt.Println(name)


           //字符串操作---》判断是否以xx开头,结尾,子字符串在不在。。。就不能像python一样通过点方式,只能通过标准库提供的方法

           //res:=strings.Contains("lqz is handsome","lqw")
           //fmt.Println(res)


           // 布尔类型
           var b bool =true
           b=false
           fmt.Println(b)

        }

2 常量

        // 恒定不变的变量,定义赋初值以后,就不能改
        // python 中,常量约定俗成,全大写表示常量,go中关键字修饰,真正的不能修改

        package main

        import "fmt"

        // 常量的定义,一般定义外部,所有函数都可以用,使用const关键字修饰,定义时必须赋初值
        // 变量的作用域范围---》在函数内部,外部
        // const 常量名 常量类型 = 常量值
        const name string ="彭于晏"
        // const 常量名  = 常量值
        const age  =19




        func main() {
           // 1 常量的基本定义和使用
           //fmt.Println(name)
           //fmt.Println(age)
           //// 常量布尔
           //const b bool = true
           ////b=false  不能修改
           //fmt.Println(b)

           //2 iota
           // 同时定义多个常量
           //const (
           // name string="彭于晏"
           // age =19
           //)
           // 2.1 iota使用方式一
           //const (
           // a=iota   // iota 写在第一行,表示0
           // b=iota   // iota 写在第二行,表示1
           // c=iota    // iota 写在第三行,表示2
           //)
           //fmt.Println(a,b,c)

           // 2.2 iota使用方式二
           // 定义常量,如果没有赋初值,初值是上一行常量的值
           // 一旦使用了itoa,就打破了上面的规则,按照iota的增长规则,每一行加一
           //const (
           // a=10   // a是10,是我定义的
           // b     //b没有赋值,会使用上一个常量的值
           // c=iota // 第三行,就是2
           //
           // d=iota // 第四行,就是3
           //)

           //const (
           // a=10   // a是10,是我定义的
           // b     //b没有赋值,会使用上一个常量的值
           // c=iota // 第三行,就是2
           // d       // 第四行,就是3  中间一旦使用了iota,就打破了参照上面常量值的规范,变成了相当于每一个都写了iota
           // //e=iota // 第5行,就是4
           // e // 第5行,就是4
           // f=iota // 第6行,就是5
           //)
           //fmt.Println(a,b,c,d,e,f)




           // 补充位运算
           var a = 60
           fmt.Println(a<<2)

           fmt.Println(a>>2)

           type ByteSize int64
           const (
              _ = iota
              KB ByteSize = 1 << (10*iota)
              MB
              GB
           )

           fmt.Println(KB)
        }

3 函数基础

        package main

        import "fmt"

        // 函数基础

        // 1 函数定义1 :没有参数没有返回值
        func test() {
            fmt.Println("我是test")
        }

        // 2 函数有一个参数,没有返回值--》没有按位置和关键字传参的区别,都是按位置传
        func test2(name string) {
            fmt.Println(name)
        }

        // 3 函数有多个参数,没有返回值--》没有按位置和关键字传参的区别,都是按位置传
        func test3(name string, age int, hobby string) {
            fmt.Println(name, age, hobby)
        }

        // 4 函数有多个参数,没有返回值--》参数中有同一种类型,可以简写成
        //func test4(name string,hobby string,age int)  {
        func test4(name, hobby string, age int) {
            fmt.Println(name, age, hobby)
        }

        // 5 函数有参数,有返回值--->声明返回值类型--》回忆python  typing模块
        func test5(a, b int) int {
        //func test5(a, b int) (int) {
            fmt.Println(a + b)
            return a + b
        }

        // 6 函数有参数,有多个返回值--->
        func test6(a,b int )(int ,int,int) {
            return  a+b,a*b,a-b

        }

        func main() {
            //1 函数定义1 :没有参数没有返回值---》使用
            //test()
            // 2 函数有一个参数,没有返回值--->调用
            //test2("lqz")
            //test2(name="lqz")  // 只有python有

            // 3 函数有多个参数,没有返回值--》调用
            //test3("lqz",19,"篮球")

            //  4 函数有多个参数,没有返回值--》参数中有同一种类型,可以简写成--》调用
            //test4("lqz","篮球",19)

            // 5 函数有参数,有返回值--->声明返回值类型---》调用
            //var res int
            //var res int =test5(30,40)
            //var res =test5(30,40)
            //res := test5(30, 40) // := 是一家不能 分开
            //fmt.Println(res)

            // 6 函数有参数,有多个返回值--->调用-->多个返回值必须用多个变量接收,不能用一个
            //res1,res2,res3:=test6(40,20)
            //var res1,res2,res3=test6(40,20)
            //fmt.Println(res1,res2,res3)
            // 有的时候只想要两个返回值   _表示忽略
            res1,res2,_:=test6(40,20)
            fmt.Println(res1,res2)
            //fmt.Println(_)   //go 不是一个变量, python 中 _ 就是个变量

            /*python支持,go不支持
                _=10
                print(_)
             */
        }

4 函数高级

        package main

        import "fmt"

        // 函数基础

        // 1 函数定义1 :没有参数没有返回值
        func test() {
            fmt.Println("我是test")
        }

        // 2 函数有一个参数,没有返回值--》没有按位置和关键字传参的区别,都是按位置传
        func test2(name string) {
            fmt.Println(name)
        }

        // 3 函数有多个参数,没有返回值--》没有按位置和关键字传参的区别,都是按位置传
        func test3(name string, age int, hobby string) {
            fmt.Println(name, age, hobby)
        }

        // 4 函数有多个参数,没有返回值--》参数中有同一种类型,可以简写成
        //func test4(name string,hobby string,age int)  {
        func test4(name, hobby string, age int) {
            fmt.Println(name, age, hobby)
        }

        // 5 函数有参数,有返回值--->声明返回值类型--》回忆python  typing模块
        func test5(a, b int) int {
        //func test5(a, b int) (int) {
            fmt.Println(a + b)
            return a + b
        }

        // 6 函数有参数,有多个返回值--->
        func test6(a,b int )(int ,int,int) {
            return  a+b,a*b,a-b

        }

        func main() {
            //1 函数定义1 :没有参数没有返回值---》使用
            //test()
            // 2 函数有一个参数,没有返回值--->调用
            //test2("lqz")
            //test2(name="lqz")  // 只有python有

            // 3 函数有多个参数,没有返回值--》调用
            //test3("lqz",19,"篮球")

            //  4 函数有多个参数,没有返回值--》参数中有同一种类型,可以简写成--》调用
            //test4("lqz","篮球",19)

            // 5 函数有参数,有返回值--->声明返回值类型---》调用
            //var res int
            //var res int =test5(30,40)
            //var res =test5(30,40)
            //res := test5(30, 40) // := 是一家不能 分开
            //fmt.Println(res)

            // 6 函数有参数,有多个返回值--->调用-->多个返回值必须用多个变量接收,不能用一个
            //res1,res2,res3:=test6(40,20)
            //var res1,res2,res3=test6(40,20)
            //fmt.Println(res1,res2,res3)
            // 有的时候只想要两个返回值   _表示忽略
            res1,res2,_:=test6(40,20)
            fmt.Println(res1,res2)
            //fmt.Println(_)   //go 不是一个变量, python 中 _ 就是个变量

            /*python支持,go不支持
                _=10
                print(_)
             */
        }

补充位运算

        &:按位与:两位都为1,结果为1,否则为0
        a = 60  # 二进制位 0011 1100
        b = 13  # 二进制位 0000 1101

        '''
        a&b        按位与:两位都为1,结果为1,否则为0
        a          0011 1100
        b          0000 1101
        二进制结果   0000 1100
        十进制结果   12
        '''
        print(a & b)


        |:按位或:只要有一位为1,结果就为1
        '''
        a|b        按位或:有一位为1,就是1,否则是0
        a          0011 1100
        b          0000 1101
        二进制结果   0011 1101
        十进制结果   61
        '''
        print(a | b)


        ^:按位异或:两对应的二进位相异时,结果为1
        '''
        a^b        两对应的二进位相异时,结果为1
        a          0011 1100
        b          0000 1101
        二进制结果   0011 0001
        十进制结果   49
        '''
        print(a | b)

        ~: 按位取反,即把1变为0,把0变为1,相当于(-x-1)
        '''
        a           0011 1100
        ~a          1100 0011
        十进制结果    -61

        '''
        print(~a)

        <<:左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。
        '''
        << 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0
        a                0011 1100 
        a << 2           1111 0000
        十进制结果         240 
        '''
        print(a << 2)

        a*2的移动次方
        60*2的3次方

        >>:右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
        '''
        >> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
        a         0011 1100       
        a >> 2    0000 1111
        十进制结果   15 
        '''
        print(a >> 2)

        a/2的移动次方
        60/4
posted @ 2022-06-07 16:37  风花雪月*  阅读(66)  评论(0编辑  收藏  举报