【Go语言学习】——Go语言的基本数据类型

Go语言的基本数据类型


参考博客

  • 整形

    类型描述
    uint8无符号 8位整型 (0 到 255)
    uint16无符号 16位整型 (0 到 65535)
    uint32无符号 32位整型 (0 到 4294967295)
    uint64无符号 64位整型 (0 到 18446744073709551615)
    int8有符号 8位整型 (-128 到 127)
    int16有符号 16位整型 (-32768 到 32767)
    int32有符号 32位整型 (-2147483648 到 2147483647)
    int64有符号 64位整型 (-9223372036854775808 到 9223372036854775807)
    类型描述
    uint32位操作系统上就是uint32,64位操作系统上就是uint64
    int32位操作系统上就是int32,64位操作系统上就是int64
    uintptr无符号整型,用于存放一个指针
    package main
    
    import "fmt"
    
    //不同进制的整形
    //Go不支持直接赋值为二进制的数,但可以转换
    func main() {
    	//十进制
    	i1 := 101
    	fmt.Printf("%d\n", i1) //输出十进制结果
    	fmt.Printf("%b\n", i1) //转换为二进制
    	fmt.Printf("%o\n", i1) //转换为八进制
    	fmt.Printf("%x\n", i1) //转换为十六进制
    	//八进制
    	i2 := 077              //以0开头表示八进制数
        fmt.Printf(i2)         //输出十进制结果
    	fmt.Printf("%d\n", i2) //转化为十进制结果
    	fmt.Printf("%o\n", i2) //输出八进制结果
    	//十六进制
    	i3 := 0x5f             //以0x开头表示16进制的数
    	fmt.Printf("%d\n", i3) //输出十进制结果
    	fmt.Printf("%x\n", i3) //转换为十六进制
    	//查看变量类型
    	fmt.Printf("%T\n", i1)
    	//声明其他类型的int
    	i4 := int8(6) //64位机上默认为int64,声明其他的需要转换
    	fmt.Printf("%T", i4)
    }
    
  • 浮点型

    package main
    
    import "fmt"
    
    //Go的浮点数只有32位和64位两种类型
    
    func main() {
    	// math.MaxFloat32表示32位的最大浮点数
    	f1 := 1.23456
    	fmt.Printf("%f:%T\n", f1, f1) //默认Go语言的float为64位
    	f2 := float32(1.23456)        //声明32位的浮点数
    	fmt.Printf("%f:%T", f2, f2)
    	//f1=f2出错,因为类型不同不能直接转换
    }
    
  • 复数

    //复数有complex64和complex128,64有32位实部和32位虚部,128有64位实部和64位虚部
    var c1 complex64
    c1 = 1 + 2i
    var c2 complex128
    c2 = 2 + 3i
    fmt.Println(c1)
    fmt.Println(c2)
    
  • 布尔值

    Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)false(假)两个值。

    1.布尔类型变量的默认值为false
    2.Go中不允许将整型强制转换为布尔型
    3.布尔型无法参与数值运算,也不能和其他类型进行转换

    package main
    
    import "fmt"
    
    func main() {
    	b1 := true
    	var b2 bool //不赋值默认为false
    	fmt.Printf("%v:%T\n", b1, b1)
    	fmt.Printf("%v:%T\n", b2, b2) //%v可以打印变量的值,这个变量可以是任意值
    }
    
  • 打印占位符总结

    类型描述
    %T查看数据类型
    %v查看数据的值(可以为任何类型)
    %b将数以二进制形式输出
    %o将数以八进制形式输出
    %d将数以十进制形式输出
    %x将数以十六进制形式输出
    %s以字符串的形式输出
    %c以字符的形式输出
    %p输出变量的指针
    %f将数以浮点数的形式输出
    package main
    
    import "fmt"
    
    //占位符只能用在printf函数格式里,不能直接打印变量的值。而print和println能打印变量或值,而且多个变量可以用隔开共同打印,但是不能使用占位符
    func main() {
    	var n = 100
    	fmt.Printf("%T\n", n) //数据类型
    	fmt.Printf("%v\n", n) //数值
    	fmt.Printf("%b\n", n) //转换为二进制
    	fmt.Printf("%o\n", n) //转换为八进制
    	fmt.Printf("%d\n", n) //转换为十进制
    	fmt.Printf("%x\n", n) //转换为十六进制
    	var s = "Lkaak"
    	fmt.Printf("%s\n", s) //输出字符串
        fmt.Printf("%#v\n", s) //输出字符串,#表示加上具体类型的描述符,字符串是#
    }
    
  • 字符串

    字符串底层是一个字符数组,属于值类型,所以能用比较符号直接对比。

    //Go中的字符串是双引号,都是UTF-8编码,组成字符串的每个字符都是int-32类型
    s := "Hello kaka" 
    //Go中字符是单引号,表示单独的一个字母,汉字或字符
    c1 := '1'
    c2 := 'k'
    c3 := '卡'
    //一个传统字符如数字和字母占一个字节ASCLL(8bit),汉字一般需要三个,utf-8
    
    转义符含义
    \r回车符(返回行首)
    \n换行符(直接跳到下一行的同列位置)
    \t制表符
    \'单引号
    \"双引号
    \\反斜杠
    package main
    
    import (
    	"fmt"
    	"strings"
    )
    
    func main() {
    	// \具有特殊含义,所以单纯使用时需要转义
    	path := "\"E:\\typora\\Typora\\GoNote\"" //对\和"前加上\进行转义输出
    	fmt.Println(path)
    
    	//多行字符串,用反引号定义
    	s2 := `靠着单引号会靠在左边输出
    靠在最左边输出与上面对齐
    		输出时前面会有空格`
    	fmt.Println(s2)
    	s3 := `'E:\typora\Typora\GoNote'` //反引号中会原样输出所以不用对\和'转义
    	fmt.Println(s3)
    
    	//字符串长度
    	fmt.Println(len(s3))
    
    	//字符串拼接
    	x1 := "lkaak"
    	x2 := "zq"
    	// 因为底层是数组,所以能够按照数组的方式切割
    	x1 = x1[:3]
    	fmt.Println(x1)
    	x3 := x1 + x2 //使用+拼接字符串
    	fmt.Println(x3)
    	x4 := fmt.Sprintf("%s%s", x1, x2) //使用两个占位符连接,然后sprintf可以把拼接结果返回给一个字符串保存,自己不会打印结果
    	fmt.Println(x4)
    
    	// 字符串对比可以直接用==
    	fmt.Println(x1 == x2)
    	// fmt.Println("abc" == "abc")
    
    	//字符串分割
    	ret := strings.Split(s3, "\\")
    	fmt.Println(ret) //分割后结果放在切片里
    	fmt.Printf("%T", ret)
    
    	//拼接
    	fmt.Println(strings.Join(ret, "+")) //用加号把字符数组的值拼接起来
    
    	//包含
    	fmt.Println(strings.Contains(x3, "lkaak"))
    	fmt.Println(strings.Contains(x3, "zzzzz"))
    
    	//判断前缀和后缀
    	fmt.Println(strings.HasPrefix(x3, "lk"))
    	fmt.Println(strings.HasSuffix(x3, "zq"))
    
    	//判断子串的位置
    	s4 := "abcdecd"
    	fmt.Println(strings.Index(s4, "cd"))     //第一个字符的位置
    	fmt.Println(strings.LastIndex(s4, "cd")) //字符串最后一次出现的位置
    }
    
    
  • byte与rune类型及类型转换

    Go语言的字符有两种类型,但是底层都是int类型,直接输出则是数字,需要用%c才能打印出原本字符

    1.uint8类型,或者叫 byte 型,代表了ASCII码的一个字符,占一个字节,但在Go中只用单引号的字母实际也用int32表示(数字、字母),可以用byte强制转换为uint8类型
    2.rune类型,代表一个UTF-8字符,实际上为int32,占4个字节,第一个字节表示类型,后三个表示字符(中文,日文,复合字符)

    3.直接声明的字符(如’a’,‘卡’)还有按照for range遍历得到的字符都是rune类型,而按照顺序去遍历获取的都是byte类型字符,如s[0]

    Go支持类型转换,但要能转换的才行,转换格式为T(表达式),其中T为想要转换的类型,可以为单个的int或数组[]int

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	s := "Hello卡卡"
    	//字符串底层是byte数组,所以长度就是byte字节的长度
    	fmt.Println(len(s)) //5+3+3=11
    	//字符串遍历
    	//因为rune类型占了不止1个字节,所以按照次序遍历得到的结果是错误的
    	for i := 0; i < len(s); i++ {
    		fmt.Printf("%c\n", s[i])
    	}
        //利用for range语法遍历的字符都是rune(int32)类型
    	for _, c := range s {
    		fmt.Printf("%c\n", c)
    	}
    
    	//字符串修改
    	//字符串本身是不可以修改的,需要转换为[]byte或者[]rune,修改后再转为string,需要重新分配内存,并复制字节数组
    	s2 := "白萝卜"
    	s3 := []rune(s2)        //把字符串强制转换为了一个rune切片,类似一个字符数组,'白' '萝' '卜'
    	s3[0] = '红'             //修改第一个字符
    	fmt.Println(string(s3)) //把rune转换为字符串类型并输出
    	c1 := "红"
    	c2 := '红'                         //rune
    	fmt.Printf("c1:%T,c2:%T", c1, c2) //c2类型是int32,因为rune类型用int32表示,第一个字节表示是utf-8,后面三个字节表示这个字符
    	fmt.Println()
    	c3 := 'A'       //单引号直接声明byte类型,但也用int32位表示
    	c4 := byte('A') //转换为byte类型,用uint8
    	fmt.Printf("value:%d,type:%T,value:%d,type:%T", c3, c3, c4, c4)
    	fmt.Println()
    
    	//类型转换,支持字符串和rune,整数和float的转换
    	n := 10         //int
    	f := float32(n) //对n强转换为float类型
    	fmt.Printf("%T", f)
    }
    
  • 练习题

    package main
    
    //统计字符串中的汉字的个数
    //回文判断
    import (
    	"fmt"
    	"unicode"
    )
    
    func main() {
    	s := "Hello卡卡"
    	n := 0
    	for _, c := range s {
    		if unicode.Is(unicode.Han, c) { //使用Unicode.Is方法判断是否是汉字
    			n++
    		}
    	}
    	fmt.Printf("%d\n", n)
    	//判断回文字符串
    	//先要转换为rune数组,因为字符串默认底层是byte(一个字节)数组,这样就会导致不能正确遍历rune(三个字节)类型的字符
    	ss := "上海自来水来自海上"
    	sc := []rune(ss)
    	flag := true
    	i := 0
    	for j := len(sc) - 1; i < j; j-- {
    		if sc[i] != sc[j] {
    			flag = false
    			break
    		}
    		i++
    	}
    	fmt.Println(flag)
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值