3、Go基础数据类型

news2024/11/17 10:58:25

目录

  • 一、Go数据类型
  • 二、字符串
  • 三、强制类型转换

一、Go数据类型

  • 基础数据类型
类型长度(字节)默认值说明
bool1false
byte10uint8,取值范围[0,255]
rune40Unicode Code Point, int32
int, uint4或8032 或 64 位,取决于操作系统
int8, uint810-128 ~ 127, 0 ~ 255
int16, uint1620-32768 ~ 32767, 0 ~ 65535
int32, uint3240-21亿~ 21亿, 0 ~ 42亿,rune是int32 的别名
int64, uint6480
float3240.0
float6480.0
complex648
complex12816
uintptr4或8以存储指针的 uint32 或 uint64 整数
func main() {
	var m complex64
	m = complex(2, 6)
	fmt.Printf("%T %T\n", real(m), imag(m))           // float32 float32 实部32,虚部32,加起来就是64
	fmt.Printf("real=%f  img=%f\n", real(m), imag(m)) //real=2.000000  img=6.000000

	var n complex128
	n = complex(2, 6)
	fmt.Printf("%T %T\n", real(n), imag(n))           //float64 float64 实部64,虚部64,加起来就是128
	fmt.Printf("real=%f  img=%f\n", real(n), imag(n)) //real=2.000000  img=6.000000

}
  • 三种指针类型都是同一个地址
func main() {
	var a int
	// unsafe.Pointer 是特别定义的一种指针类型,它可以包含任意类型变量的地址(类似 C 语言中的 void 类型指针)
	var pointer unsafe.Pointer = unsafe.Pointer(&a)
	var p uintptr = uintptr(pointer)
	var ptr *int = &a
	fmt.Printf("pointer=%p  ,  p=%d  %x,  ptr=%p\n", pointer, p, p, ptr)
	//pointer=0xc0000a6058  ,  p=824634400856  c0000a6058,  ptr=0xc0000a6058

}
  • 复合数据类型
    • 数值型变量的默认值是0,字符串的默认值是空字符串,布尔型变量的默认值是false
    • 引用类型、函数、指针、接口的默认值是nil
    • 数组的默认值取每个元素对应类型的默认值
    • 结构体的默认值取每个成员变量对应类型的默认值
类型默认值说明
array取每个元素对应类型的默认值值类型
struct取每个成员变量对应类型的默认值值类型
string“”UTF-8 字符串
slicenil引用类型
mapnil引用类型
channelnil引用类型
interfacenil接口
functionnil函数
func defaultValue() {
	var a int
	var b byte
	var f float32
	var t bool
	var s string
	var r rune
	var arr [3]int
	var slc []int

	fmt.Printf("default value of int %d\n", a)           //default value of int 0
	fmt.Printf("default value of byte %d\n", b)          //default value of byte 0
	fmt.Printf("default value of float32 %.2f\n", f)     //default value of float32 0.00
	fmt.Printf("default value of bool %t\n", t)          //default value of bool false
	fmt.Printf("default value of string [%s]\n", s)      //default value of string []
	fmt.Printf("default value of rune %d, [%c]\n", r, r) //default value of rune 0, []
	fmt.Printf("default int array is %v\n", arr)         //取每个元素对应类型的默认值 default int array is [0 0 0]
	fmt.Printf("default slice is nil %t\n", slc == nil)  //default slice is nil true
}
  • 自定义类型
    • 类型别名
      • type byte = uint8
      • type rune = int32
    • 自定义类型
      • type user struct {name string;age int}
      • type signal uint8
      • type ms map[string]string
      • type add func(a, b int) int
type ms map[string]int

func (s ms) Say() {
	fmt.Printf("%d\n", s["hello"])
}

二、字符串

  • 字符串定义
package main

import "fmt"

func main() {
	s1 := " My name is 张朝阳☻"                       //字符串里可以包含任意Unicode字符
	s2 := "He say:\"I'm fine.\" \n\\Thank\tyou.\\" //字符串里可以包含任意Unicode字符

	//字符串也可以用反引号来定义,反引号里的转义字符无效。反引号里的内容原封不动地输出,包括空白符和换行符

	s3 := `here is first line. 

  there is third line.
`

	fmt.Printf("%s\n", s1)
	fmt.Printf("%s\n", s2)
	fmt.Printf("%s\n", s3)
}

在这里插入图片描述

  • 字符串常用操作
方法介绍
len(str)求长度
strings.Split分割
strings.Contains判断是否包含
strings.HasPrefix,strings.HasSuffix前缀/后缀判断
strings.Index(),strings.LastIndex()子串出现的位置
func main() {
	s := "张"
	arr := []byte(s)
	for _, ele := range arr { //一个汉字占用3个byte表示
		fmt.Printf("%d ", ele) // 229 188 160
	}
	fmt.Println()
	fmt.Printf("%d %d\n", len(s), len(arr)) //3 3

	brr := []rune(s)
	for _, ele := range brr { //一个rune就可以表示一个汉字
		fmt.Printf("%d ", ele) // 24352
	}
	fmt.Println()
	fmt.Printf("%d %d", len(s), len(brr)) //3 1
}

//
func main() {
	s := "张2"
	arr := []byte(s)
	brr := []rune(s)
	fmt.Printf("%d %c\n", s[1], s[1])     //188 ¼
	fmt.Printf("%d %c\n", arr[1], arr[1]) //188 ¼
	fmt.Printf("%d %c\n", brr[1], brr[1]) //50 2(字符2,在Unicode编码中为50)

}
//
func main() {
	s := "hello, how are u"
	arr := strings.Split(s, ",")
	for _, ele := range arr {
		fmt.Println(ele)
		//hello
		// how are u
	}

	fmt.Printf("%t\n", strings.Contains(s, "how")) //true
	fmt.Printf("%t\n", strings.HasPrefix(s, "he")) //true
	fmt.Printf("%t\n", strings.HasPrefix(s, "hE")) //false
	fmt.Printf("%t\n", strings.HasSuffix(s, " u")) //true
	fmt.Printf("%t\n", strings.HasSuffix(s, "a"))  //false

	pos := strings.Index(s, "lo")
	fmt.Printf("%d\n", pos)                       //3
	fmt.Printf("%d\n", strings.Index(s, "e"))     //1(首次出现e的位置)
	fmt.Printf("%d\n", strings.LastIndex(s, "e")) //13(最后出现e的位置)

	fmt.Printf("%d\n", strings.IndexAny(s, "oe")) //1(查找任意一个字符的位置)
}
  • 字符串拼接
    • 加号连接
    • func fmt.Sprintf(format string, a …interface{}) string
    • func strings.Join(elems []string, sep string) string
    • 当有大量的string需要拼接时,用strings.Builder效率最高
  • byte和rune
    • string中每个元素叫“字符”,字符有两种
      • byte:1个字节, 代表ASCII码的一个字符
      • rune:4个字节,代表一个UTF-8字符,一个汉字可用一个rune表示
    • string是常量,不能修改其中的字符
    • string可以转换为[]byte或[]rune类型
    • string的底层是byte数组,string的长度就是该byte数组的长度,UTF-8编码下一个汉字占3个byte,即一个汉字占3个长度
func main() {
	s1 := "aaa"
	s2 := "bbb"
	s3 := "ccc"

	S1 := s1 + " " + s2 + " " + s3
	S2 := fmt.Sprintf("%s %s %s", s1, s2, s3)
	S3 := strings.Join([]string{s1, s2, s3}, " ") //性能较高

	sb := strings.Builder{} //性能最高
	sb.WriteString(s1)
	sb.WriteString(" ")
	sb.WriteString(s2)
	sb.WriteString(" ")
	sb.WriteString(s3)
	S4 := sb.String()

	fmt.Println(S1) //aaa bbb ccc
	fmt.Println(S2) //aaa bbb ccc
	fmt.Println(S3) //aaa bbb ccc
	fmt.Println(S4) //aaa bbb ccc

}

三、强制类型转换

  • 强制类型转换:基本方法就是把目标类型放在变量前面,把变量括起来
    • 低精度向高精度转换没问题,高精度向低精度转换会丢失位数
    • 无符号向有符号转换,最高位是符号位
    • 不同长度的int或float之间可以相互转换
    • byte和int可以互相转换;float和int可以互相转换,小数位会丢失;bool和int不能相互转换
func main() {
	var i int = 9
	var by byte = byte(i) //int转为byte
	i = int(by)           //byte转为int
	
	//高精度向低精度转换,数字很小时这种转换没问题
	var ua uint64 = 1
	i8 := int8(ua)
	fmt.Printf("i8=%d\n", i8) //i8=1

	//最高位的1变成了符号位
	ua = uint64(math.MaxUint64)
	i64 := int64(ua)
	fmt.Printf("i64=%d\n", i64) //i64=-1

	//位数丢失
	ui32 := uint32(ua)
	fmt.Printf("ui32=%d\n", ui32) //ui32=4294967295

	//单个字符可以转为int
	var i int = int('a')
	fmt.Printf("i=%d\n", i) //97

	//bool和int不能相互转换

	//byte和int可以互相转换
	var by byte = byte(i)
	i = int(by)
	fmt.Printf("i=%d\n", i) //97

	//float和int可以互相转换,小数位会丢失
	var ft float32 = float32(i)
	i = int(ft)
	fmt.Printf("i=%d\n", i) //97
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Freemarker介绍

2. Freemarker介绍 FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML…

Python数据结构:概念、栈

1.概念 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。 N.Wirth:“程序数据结构算法’ 2.分类 数据结…

基于comsol软件弯曲单模光纤模拟仿真

在本节中,主要基于实验室实际光纤单模圆柱光纤进行模拟,与comsol案例库文件在分析过程和建模有些差异: 模拟主要通过以下三个步骤进行:模型的几何构建、物理场的添加研究、结构处理分析来进行。 下面是第一步骤:几何…

unity2022.1.8之后版本的新的输入行为控制对象变化

文章目录unity2022.1.8之后版本的新的输入行为控制对象变化怎么导入?如何使用?unity2022.1.8之后版本的新的输入行为控制对象变化 我们先了解大概的逻辑。我们要设置触发行为的方式并且让他和对象的行为绑定,再将行为和对象绑定,…

SpringBoot开发规范部分通用模板+idea配置【项目通用-1】

SpringBoot开发规范通用模板 1 分页插件使用 通过MybatisPlus配置分页插件拦截器 Configuration MapperScan("com.xuecheng.content.mapper") public class MybatisPlusConfig {//定义分页的拦截器Beanpublic MybatisPlusInterceptor getMybatisPlusInterceptor() {…

Pascal版本的 - freopen

参数 filename -- 这是包含要打开的文件的名称的字符串。 mode -- 这是包含文件访问模式的字符串。它包括 - 高级编号模式&说明1个 “r” 打开文件进行读取。该文件必须存在。 2个 “w” 创建一个用于写入的空文件。如果已存在同名文件,则删除其内容并将该文件…

【Java容器(jdk17)】ArrayList深入源码,就是这么简单

ArrayList深入源码一、ArrayList源码解析1. MIXIN 的混入2. 属性说明3. 构造方法4. 其他方法(核心)iterator 和 listIterator 方法add方法remove 方法sort方法其他二、ArrayList 为什么是线程不安全的?体现哪些方面呢?三、ArrayLi…

(day12) 自学Java——集合进阶(双列集合)

目录 1.双列集合特点 Map遍历三种方式 2.HashMap 3.LinkedHashMap 4.TreeMap 5.源码解析 6.可变参数(形参个数可变) 7.Collections 8.综合练习 1.双列集合特点 ①双列集合一次需要存一对数据,分别为键和值 ②键不能重复,值可以重复 ③键和值是一…

全志H616——用C语言的形式操作数据库

sqlite3_open(const char *filename, sqlite3 **ppDb)该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。sqlite3_close(sqlite3*)该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关…

【Linux】环境变量本地变量

文章目录环境变量基本概念常见环境变量和环境变量相关的命令为什么带./运行我们的可执行程序本地变量环境变量的组织方式环境变量具有全局属性环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们…

gRPC的简单应用

gRPC的简单应用 gRPC是由开发的一个高性能、通用的开源RPC框架,主要面向移动应用开发且基于HTTP/2协议标准而设计,同时支持大多数流行的编程语言。 官网:https://grpc.io/ 安装protoc 工具 https://protobuf.dev/ 安装Go插件 旧版本直接…

学习HandlerThread

HandlerThread是一个扩展了Thread的类。也就意味着它和普通的Thread类的调用没有什么区别,仍然要调用start()。 如上图所示,扩展后的HandlerThread类有一个Looper和Handler。 关于这一块的知识可以参考一下《关于Handler我们应该知道的知识》 HandlerTh…

普冉PY32系列(五) 使用JLink RTT代替串口输出日志

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志 JLink …

Python-第五天 Python函数

Python-第五天 Python函数一、函数介绍1. 什么事函数二、函数的定义1.函数的定义:2.案例三、函数的参数1.函数的传入参数2.案例升级四、函数的返回值1.什么是返回值2.返回值的语法3.None类型4.None类型的应用场景五、函数说明文档1.函数的说明文档2.在PyCharm中查看…

脑机接口协议V1.0

脑机接口,有时也称作“大脑端口”direct neural interface或者“脑机融合感知”brain-machine interface,它是在人或动物脑(或者脑细胞的培养物)与外部设备间建立的直接连接通路。在单向脑机接口的情况下,计算机或者接…

leaflet显示高程

很多地图软件都能随鼠标移动动态显示高程。这里介绍一种方法,我所得出的。1 下载高程数据一般有12.5m数据下载,可惜精度根本不够,比如mapbox的免费在线的,或者91卫图提供百度网盘打包下载的,没法用,差距太大…

记录robosense RS-LIDAR-16使用过程3

一、wireshark抓包保存pcap文件并解析ubuntu18安装wireshark,参考下面csdn教程,官网教程我看的一脸蒙(可能英语太差)https://blog.csdn.net/weixin_46048542/article/details/121730448?spm1001.2101.3001.6650.2&utm_medium…

秒杀项目之服务调用分布式session

目录 nginx动静分离 服务调用 创建配置zmall-cart购物车模块 创建配置zmall-order订单模块 服务调用 spring session实战 什么是Spring Session 为什么要使用Spring Session 错误案例展示 配置spring-session 二级域名问题 用户登录 nginx动静分离 第1步&#xff…

如何用演示程序检测K100|K720|K750电动发卡读写一体机性能

K100|K720|K750电动发卡读写一体机采用工业级设 计,表面烤漆处理,具有良好的耐磨耐腐蚀性。适应各种高、低温, 多灰尘等 恶劣环境。其发卡原理为拟人型摩擦式发卡,对各类变形卡有非常好的适应性。 CNC的精度保证卡距的绝对一致性、…

Filter过滤器完成验证代码的封装

Filter过滤器完成验证代码的封装filter是什么1 使用filter2 filter配置到项目中验证用户权限是需要反复使用的代码块,把他封装到filter中,减少代码冗余filter是什么 init()方法:初始化方法,在创建Filter后立即调用。可用于完成初始…