Fork me on GitHub

3.Go语言-数据类型

1.go语言数据类型

1.整型

  • 整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64。

  • 其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long

    类型 描述
    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)
  • 特殊整型

    类型 描述
    uint 32位操作系统上就是uint32,64位操作系统上就是uint64
    int 32位操作系统上就是int32,64位操作系统上就是int64
    uintptr 无符号整型,用于存放一个指针
  • 注意: 在使用intuint类型时,不能假定它是32位或64位的整型,而是考虑intuint可能在不同平台上的差异。

  • 注意事项 获取对象的长度的内建len()函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用intuint

  • Println & Printf 区别

package main

import "fmt"

//基本数据类型
func main() {
	//十进制打印为二进制
	n := 10
	fmt.Printf("%b\n", n)
	//十进制打印十进制
	fmt.Printf("%d\n", n)

	//八进制
	m := 075
	fmt.Printf("%d\n", m)
	fmt.Printf("%o\n", m)

	//十六进制
	f := 0xff
	fmt.Println(f)
	fmt.Printf("%x\n", f)
}
//%b 二进制,%o 八进制  %x十六进制

2.浮点型:

  • Go语言支持两种浮点型数:float32float64

  • float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64

  • 示例:

    • 打印浮点数时,可以使用fmt包配合动词%f,代码如下
    package main
    
    import (
    	"fmt"
    	"math"
    )
    func main() {
    	fmt.Printf("%f\n", math.Pi)//3.141593
    	fmt.Printf("%.2f\n", math.Pi)//3.14
    }
    
    

3.复数

  • complex64 和complex128

    func main() {
    	var c1 complex64
    	c1 = 1 + 2i
    	var c2 complex128
    	c2 = 2 + 3i
    	fmt.Println(c1)//(1+2i)
    	fmt.Println(c2)//(2+3i)
    }
    

4.布尔值:

  • 只有true,false(默认) 没有1,0之分
  • 注意:
    • 布尔类型变量的默认值位false
    • Go语言中不允许将整型强制转换位布尔值
    • 布尔型无法参与数值运算,也无法与其他类型进行转换。
package main

import (
	"fmt"
	"math"
)

//基本数据类型
func main() {
	//十进制打印为二进制
	n := 10
	fmt.Printf("%b\n", n)
	//十进制打印十进制
	fmt.Printf("%d\n", n)

	//八进制
	m := 075
	fmt.Printf("%d\n", m)
	fmt.Printf("%o\n", m)

	//十六进制
	f := 0xff
	fmt.Println(f)
	fmt.Printf("%x\n", f)

	//uint 8
	var age uint8 //0~255
	age = 255
	fmt.Println(age)

	//浮点数
	fmt.Println(math.MaxFloat32)
	fmt.Println(math.MaxFloat64)
	//布尔值
	var a bool
	fmt.Println(a)
	a = true
	fmt.Println(a)
	//字符串
	s1 := "hello beijing"
	s2 := "你好 北京"
	fmt.Println(s1, s2)
	//打印 一个路径c:\code\go.exe
	fmt.Println("c:\\code\\go.exe")
	fmt.Println("\t制表符\n换行符")
	s3 := `
	多行字符串
	两个反引号内容
	会原样输出\n\t
	`
	fmt.Println(s3)


}

5.字符串

  • Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如:
  • 字符串转义符:
转义符 含义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符
\' 单引号
\" 双引号
\\ 反斜杠
  • 示例:

    func main() {
    	fmt.Println("path =\"c:\\code\\page\\go.exe\"")
    }
    // path ="c:\code\page\go.exe"
    
  • 多行注释

    • Go语言中要定义一个多行字符串时,就必须使用反引号字符:
    words := `first
    second
    threed`
    fmt.Println(words)
    
  • 字符串常用操作

    方法 介绍
    len(str) 求长度
    +或fmt.Sprintf 拼接字符串
    strings.Split 分割
    strings.contains 判断是否包含
    strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
    strings.Index(),strings.LastIndex() 子串出现的位置
    strings.Join(a[]string, sep string) join操作
  • 示例:

package main

import (
	"fmt"
	"strings"
)

//字符串常见操作
func main() {
	//求字符串长度
	s := "hello"
	fmt.Println(len(s))
	s2 := "hello中国"
	fmt.Println(len(s2))
	//拼接字符串
	fmt.Println(s + s2)

	s3 := fmt.Sprintf("%s - %s", s, s2)
	fmt.Println(s3)
	//字符串的分割
	s4 := "how do you do"
	fmt.Println(strings.Split(s4, " "))
	//判断是否包含
	fmt.Println(strings.Contains(s4, "do"))
	//判断前缀
	fmt.Println(strings.HasPrefix(s4, "how"))
	//判断后缀
	fmt.Println(strings.HasSuffix(s4, "how"))
	//判断子串的位置
	fmt.Println(strings.Index(s4, "do"))
	//最后子串出现的位置
	fmt.Println(strings.LastIndex(s4, "do"))
	//join
	s5 := []string{"how", "do", "you", "do"}
	fmt.Println(s5)
	fmt.Println(strings.Join(s5, "+"))
	

}

  • byte和rune区别

    • byte:给存储ascii码类型起的别名
    • rune:给存储unicode码类型起的别名
    package main
    
    import "fmt"
    
    //字符
    func main() {
    	//byte unit8的别名 ASCII码
    	//rune  int32的别名
    	var c1 byte = 'c'
    	var c2 rune = 'c'
    	fmt.Println(c1, c2)                  //99    99
        // %T 输出值的类型
    	fmt.Printf("c1:%T  c2:%T\n", c1, c2) //c1:uint8     c2:int32
    
    	s := "hello中国"
    	for i := 1; i < len(s); i++ {
    		fmt.Printf("%c\n", s[i]) //按照索引遍历字符串。中文占好几个字节会出现乱码。
    	}
        // %c 输出Unicode的字符
    	for _, r := range s {
    		fmt.Printf("%c\n", r) //按字符循环不会出现乱码
    	}
    }
    

练习题:

题目:百元百鸡,一百元钱买100只鸡,公鸡5元一只,母鸡3元一只,小鸡1元3个。
解题思路 先找出100元最多可以买多少只鸡,再通过条件,找出符合要求的正确数字
package main

import "fmt"

func main() {
	for i := 0; i <= 20; i++ {
		for t := 0; t <= 33; t++ {
			k := 100 - i - t
			if i*5+t*3+k/3 == 100 && k%3 == 0 {
				fmt.Println(i, t, k)
			}
		}
	}
}

  • 修改字符串:
    • 修改字符串,需要先将它转换成[]rune或byte,再转换string,并复制给字节数组。
func main() {
    s1 := "hello"
	bytes1 := []byte(s1)
	bytes1[0] = 'H'
    // Hello
	fmt.Println(string(bytes1))
	s2 := "你好"
	runes2 := []rune(s2)
	runes2[0] = '不'
    // 不好
	fmt.Println(string(runes2))
}
  • 类型转换

    • go语言中类型转换只有强制类型转换,没有隐式类型转换。
    • 如计算直角三角形的斜边长时,使用math包的Sqrt() 。该函数接收时float64类型参数
    import "math"
    func main() {
    	c,k := 3,4
    	var g int
    	g = int(math.Sqrt(float64(c*c + k*k)))
        // 5
    	fmt.Println(g)
    }
    
posted @ 2020-05-12 20:29  是阿凯啊  阅读(142)  评论(0编辑  收藏  举报