Go内置数据类型

Wesley13
• 阅读 727

内置数据类型

布尔类型

  • bool

    // Type.go package main

    import ( "fmt" )

    func main() { var isGirl bool //声明bool类型变量isGirl isGirl = true //isGirl赋值为true isGirl = false //isGirl赋值为false if isGirl { fmt.Println("You are a girl!") } else { fmt.Println("You are a boy!") } }

bool类型不能接受其他类型的赋值,不支持自动或强制的类型转换。

整型

  • int8
  • byte
  • int16
  • int
  • uint
  • uintptr

Go内置数据类型

  1. int和int32被认为是两种不同的类型,编译器不会做隐式类型转换
  2. 两个不同类型的整型数不能直接比较,会有编译错误,如int32 和int64类型变量不能比较

##浮点类型

  • float32 等价于C语言的float类型
  • float64 等价于C语言的double类型
  1. 声明变量时如果使用类型自动推导,则浮点类型自动设为float64。如 fvar := 12.0 // 此时fvar变量类型为float64

复数类型

  • complex64

  • complex128

    var value1 complex64 //由2个float32构成的复数
    value1 = 3.2 + 12i
    
    value2 := 3.2 + 12i        //由2个float64构成的complex128类型
    value3 := complex(3.2, 12) //同value2
    

字符串

  • string

    var str string       //声明一个字符串变量
    str = "Hello World!" // 字符串赋值,注意字符串初始化后不能被修改
    ch := str[0]         // 取字符串第一个字符
    
    fmt.Printf("The length of \"%s\" is %d\n", str, len(str))     //使用len内置函数计算字符串长度
    fmt.Printf("The first character of \"%s\" is %c.\n", str, ch) //Printf函数用法与C语言printf一致
    
    var strA string = "Hello "
    var strB string = "Go!"
    var hiGo string = strA + strB //字符串拼接
    fmt.Printf("\"%s\" + \"%s\" = \"%s\"", strA, strB, hiGo)
    
    n := len(hiGo)
    for i := 0; i < n; i++ { // 字符串遍历
        ch := hiGo[i]
        fmt.Println(i, ch)
    }
    

字符类型

  • rune 代表单个Unicode字符

错误类型

  • error

指针

  • pointer

数组

  • array

    var byteArray [32]byte //长度为32的byte数组,每个元素为一个字节
    byteArray[0] = 'a'
    fmt.Println("byteArray values:", byteArray)
    
    var twoDimension [3][5]int // 二维数组
    twoDimension[0][0] = 10
    fmt.Println("twoDimension values:", twoDimension)
    
    //使用range遍历数组,range第一个返回值为元素下标,第二个返回值为元素值
    for i, v := range byteArray {
        fmt.Println("byteArray element[", i, "]=", v)
    }
    
  1. 可以使用len函数计算数组长度,len(array)
  2. 数组为值类型,即赋值和参数传递时将产生一次复制动作

切片

  • slice

    func sliceDefineDemo() { var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //基于已存在的数组创建切片 var mySlice []int = myArray[:5] //取数组的前5个元素 mySlice = myArray[:] //取数组的全部元素 mySlice = myArray[5:] //取从第5个元素开始所有元素 fmt.Print(mySlice) //直接创建数组切片,不需要依赖数组 mySlice1 := make([]int, 5) //创建初始元素个数为5的数组切片,元素初始值为0 mySlice2 := make([]int, 5, 10) //创建初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间 mySlice3 := []int{1, 2, 3, 4, 5} //直接创建并初始化包含5个元素的数组切片 fmt.Print(mySlice1) fmt.Print(mySlice2) fmt.Print(mySlice3) //根据数组切片创建数组切片 oldSlice := []int{1, 2, 3, 4, 5} newSlice := oldSlice[:3] //基于oldSlice前3个元素构建新数组切片 fmt.Print(newSlice) }

    func sliceOptDemo() { mySlice := make([]int, 5, 10) fmt.Println("len(mySlice):", len(mySlice)) //获取切片当前长度 fmt.Println("cap(mySlice):", cap(mySlice)) //获取切片分配的存储空间 mySlice = append(mySlice, 1, 2, 3) //给mySlice加上3个元素,这里重新生成了一个数组切片 mySlice2 := []int{8, 9, 10} mySlice = append(mySlice, mySlice2...) //给mySlice加上另一个数组切片 slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) //只会复制slice1的前3个元素到slice2中 fmt.Println("slice2: ", slice2) copy(slice1, slice2) //只会复制slice2的前3个元素slice1的前3个位置 fmt.Println("slice1: ", slice1) }

  1. 直接定义数组切片与定义数组的区别是否指定长长度,指定长度为定义数组,不指定长度为定义切片
  2. 切片的遍历方式同数组
  3. 切片长度超过当前分配的存储空间时会自动分配一块足够大的内存

字典

  • map

    func mapDemo() { var scoreMap map[string]int // 声明scoreMap变量,存储学生的分数 scoreMap = make(map[string]int) //创建scroreMap //scoreMap = make(map[string]int, 100) //创建scroreMap,第二个参数为map的存储空间 /*创建并初始化map scoreMap = map[string] int{ "ZhangSan":60, "LiSi":100 } */ //Map中插入数据 scoreMap["ZhangSan"] = 60 scoreMap["LiSi"] = 100 //删除数据 delete(scoreMap, "ZhangSan") //如果该成员不存在,没有副作用 //查找LiSi的分数 studentScore, isFound := scoreMap["LiSi"] if isFound { fmt.Printf("Found LiSi's score: %d", studentScore) } }

通道

  • chan

结构体

  • struct

接口

  • interface
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
小万哥 小万哥
11个月前
C 语言中布尔值的用法和案例解析
C语言中的布尔值在编程中,您经常需要一种只能有两个值的数据类型,例如:是/否开/关真/假为此,C语言有一个bool数据类型,称为布尔值。布尔变量在C语言中,bool类型不是内置数据类型,例如int或char它是在C99中引入的,您必须导入以下头文件才能使用
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这