四、基础数据类型

1.布尔类型

类型名 bool
字面量true 和false
表示真假
逻辑运算 与&& 或|| 非!

package main

import "fmt"
func main() {
    //布尔类型
    //标识符bool
    //字面量:true/false
    //零值false
    var zero bool
    isBoy := false
    isGirl := true
    fmt.Println(zero, isBoy, isGirl)
    //真值表
    /*逻辑运算(与&&  或||  非!)
     */
    fmt.Println(true && true)
    fmt.Println(false && false)
    fmt.Println(false && true)
    fmt.Println(true && false)
    fmt.Println(true || true)
    fmt.Println(true || false)
    fmt.Println(false || true)
    fmt.Println(false || false)
    fmt.Println("!")
    fmt.Println(!true)
    fmt.Println(!false)
    //关系运算 =   !=
    //在go中 true 跟false 不能把0或1带入
    fmt.Println(1 == 1)
    fmt.Println(1 != 1)
    fmt.Printf("%T", true)
    //bool 占位 打印值是 %t
    fmt.Printf("%T,%t\n", false, false)
    fmt.Printf("%T,%s\n", "aa", "aa")
    //int占位符是%d
    fmt.Printf("%T,%d\n", 1, 1)
}

2.字符串

类型名string
字面量
(1)可解析
使用””双引号 里面可以解析特殊字符 如果要表示原来的本以 需要使用\转义
(2)原生的
``反引号 不可以解析特殊字符
(3)特殊字符
\n \t \r \f \v \a \b \等

操作
关系运算、算数运算(使用+来进行字符串连接)、赋值运算、索引(注意对于Unicode字符获取的数据并不是一个码点)、切片(name[start:end] 包含start不包含end)

函数
获取字符串长度 使用len 这里len获取的是字节数量
byte和rune类型转换为字符串 string

 package main

import "fmt"
func main() {
    //"" => 可解释字符串
    //`` => 原生字符串
    //特殊字符 \n \r \t \f  等等 这种换行符之类的
    var (
        name string = "b\nb"
        desc string = `a\na`
    )
    fmt.Println(name)
    //如果想要用可解释字符串定义"" 需要用\转义
    name = "b\\nb"
    fmt.Println(name)
    fmt.Println(desc)
    //操作
    //算数运算符: + (连接)
    fmt.Println("我叫" + "屈帅波")
    //""是字符串,''是字节byte或者rune类型
    //关系运算(==,!=,>,>=,<,<=)
    //字符串关系运算是第一个字母先比 如果能比较就是true或者false 如果比较不了那么第二个开始比
    //用的阿斯克码表做比较
    fmt.Println("aa" > "bb")
    fmt.Println("ac" > "ab")
    //赋值运算
    s := "我叫"
    s += "屈帅波"
    fmt.Println(s)
    //字符串定义内容必须只能为ascii
    //索引 0 -  n-1   (n为字符串长度)
    desc = "asbceasd"
    fmt.Printf("%T %c \n", desc[0], desc[0])
    //切片[start:end]   拿到的是 start至end-1
    fmt.Printf("%T %s \n", desc[0:3], desc[0:3])
    //做切片或者使用索引  只能使用ascii  如果不是 会乱码
    //len  取长度  算的是字节数量  这里也必须是ascii  如果不是的话 比如中文一个中文可能占3-4个字节
    fmt.Println(len(desc))
}

3.数值类型

(1)整数
类型名int/uint/byte/rune/uintptr
字面量 表示方法 十进制/八进制/十六进制
操作 算数运算/关系运算/位运算/赋值运算/类型转换

package main

import "fmt"
func main() {
    /*整数类型
      标识符 int/int* /unit/unit* /uintptr/byte/rune
      字面量 十进制 八进制0777= 7*8^2 + 7*8^1 +7*8^0  十六进制 0X 0-9  A-F
    */
    var age int = 31
    fmt.Printf("%T,%d\n", age, age)

    //操作
    //算术运算(+,-,*,/,%,++,--)
    //在go中整数除法运算 会直接取整例如 9/2 取4
    fmt.Println(1 + 2)
    fmt.Println(1 * 2)
    fmt.Println(3 - 10)
    fmt.Println(9 / 2)
    fmt.Println(2 / 3)
    fmt.Println(7 % 3)
    var a int = 1
    a++
    fmt.Println(a)
    a--
    fmt.Println(a)
    //关系运算(==,!=,>,<,>=,<=)
    //关系运算结果是一个bool值
    fmt.Println(2 == 2)
    fmt.Println(2 != 2)
    fmt.Println(2 > 2)
    fmt.Println(2 < 2)
    fmt.Println(2 >= 2)
    fmt.Println(2 <= 2)
    //位运算 二进制的运算 10 => 2
    //&与 |或  ^非  <<左移  >>有移   %^按位清空
    // 7/2 =>1 3/2=>1 1/2=>1 0    0111
    // 十进制2   二进制 0010
    //7&2  => 0111 & 0010 = 0010   相同位数 位1 则1 否则为0   0010换算十进制为2
    //7|2  => 0111 | 0010 = 0111   有1则为1  0111 换算十进制为7
    //7!2  => 0111 ^ 0010 = 0101   不同则为1其余为0   0101换算十进制为5
    //2<<1  => 0010 << 1  = 0100    往相反方向添0  这里左移指的是往右边添0  1表示1个0
    //2>>1  => 0010 >> 1  = 0001    往相反方向添0  这里右移指的是往左边添0  1表示1个0
    //7&^2  => 0111 &^ 0010 = 0101  按位清空 指的是 把相同位置清零
    fmt.Println(7 & 2)
    fmt.Println(7 | 2)
    fmt.Println(7 ^ 2)
    fmt.Println(2 << 1)
    fmt.Println(2 << 2)
    fmt.Println(2 >> 1)
    fmt.Println(7 &^ 2)
    //赋值运算(=,+=,-=,*=,/=,%=,&=,|=,^=,^=,<<=,>>=,&^=)
    //a+=b ==> a=a+b
    var age1, age2 int = 1, 2
    var age3 int
    fmt.Println(age1, age2, age3)
    age1 += age2
    fmt.Println(age1, age2)
    age2 %= age1
    fmt.Println(age1, age2)
    //int/uint/byte/rune/int*/uint*  之间如果要计算那么需要做类型转换
    var intA int = 10
    var intB int16 = 100
    intA += int(intB)
    fmt.Println(intA, intB)
    //大  转  小可能会出现溢出问题
    var intC int = 0XFFFF
    fmt.Println(intC, int8(intC), uint8(intC))

    //byte(字节),rune(码点)  也属于int 不过可以用字符来赋值
    var (
        c byte = 'A'
        w rune = '中'
    )
    fmt.Println(c, w)
    fmt.Printf("%T,%T\n", c, w)
    fmt.Printf("%c\n", c)
    fmt.Printf("%q %U\n", w, w)
    //fmt.Printf
    //%b 二进制 %o 八进制  %x 十六进制   %q 获取rune值  %U  码点
    //%v 如果记不清使用什么格式化值 就用%v
    //格式化转换
    fmt.Printf("%5d\n", 1)        //这里表示站5位 默认是空格   1第五位所以前面会有4个空格
    fmt.Printf("%05d\n", 1)       // 这里表示站5位 不够的0补充  1第五位所以前面会有4个0
    fmt.Printf("%-5d %d\n", 1, 2) //-表示左对齐 右边会空4个   默认是+ 为右对齐

}

(2)浮点数
类型名 float32/float64
字面量 十进制表示法1.1/科学计数法 1E-1
操作 算数运算/关系运算/赋值运算/类型转换(float64(name))
类型转换需要注意 大转小可能会有溢出

package main

import "fmt"
func main() {
    //float32,float64 一般使用64  保存的位数不一样
    //字面量: 十进制表示法  科学计数法
    //M E N  => M*10 ^ N
    var hight float64 = 1.75
    fmt.Printf("%T %f\n", hight, hight)
    //操作
    //算数运算(+,-,*,/,--,++)
    //go float不支持%
    //浮点数不是精确存储,会有精度损耗 做运算的话精度损耗可能会变大
    fmt.Println(1.1 + 1.2)
    fmt.Println(1.1 - 1.2)
    fmt.Println(1.1 * 1.2)
    fmt.Println(1.1 / 1.2)
    //关系运算(>,<,>=,<=,) 因为有精度损耗 所以一般不做等于和不等于运算
    //赋值运算(=,+=,/=,-=,*=)
    fmt.Printf("%4.3f", 1.5555)
    //4.3表示 取4位 小数点后取3位
}

(3)复数

4.枚举类型

5.指针类型

用于存储变量在内存中的存储位置
获取变量的指针&name
var指定变量类型
int=> *int
string=>*string
bool => *bool
获取指针对应的值 *point

package main

import "fmt"
func main() {
    //指针
    var (
        a int = 2
        b int = a
    )
    //int指针 用*int 那么string 就是*string 以此类推  也可以用简短声明
    //变量的值存放在内存中,是一个内存地址,指针可以来拿到某个变量的内存地址 来做修改
    //占位符的话使用%p 打印指针,  %v用数据类型自己的格式化
    fmt.Println(a, b)
    var c *int = &a
    cc := &a
    fmt.Println(c, cc)
    *cc = 4
    fmt.Println(*c, *cc, a)
}
发布了92 篇原创文章 · 获赞 12 · 访问量 5701

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/104636226