go语言基本数据类型

本文深入探讨Go语言的基础语法,包括类型转换、常量、变量定义,以及字符串和数字的处理方法。此外,还详细介绍了Go语言的高级特性,如位运算、字符串操作和时间处理等。

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> hot3.png

fmt

  • %+v: 打印当前对象的所有参数的详细信息
  • %#v: 打印当前对象包括对象类型和参数名称及值的详细信息
  • %T: 打印当前对象的类型信息
  • %d: 用于格式化整数
  • %5d: 格式化整数,并保证其占用的位数至少为5个,如果多于5个则按实际长度延伸
  • %x: 以小写的形式格式化整数为十六进制表示
  • %X: 以大写的形式格式化整数为十六进制表示
  • %g: 用于格式化浮点数
  • %f: 输出浮点数
  • %e: 用科学计数法表示浮点数
  • %n.mg: 用于表示数字n并精确到小数点后m位,同样的还可以使用e或者f
  • %t: 用于输出布尔类型变量
  • %b: 将整数以二进制位的形式打印
  • %c: 用于字符类型数据的输出,这里注意,对于字符类型数据,%d和%v只会输出该字符对应的整数值
  • %p: 用于指针地址的输出

go程序的一般结构

  • 在完成包的import后,开始对常量、变量和类型的定义或声明;
  • 如果存在init函数,则对该函数进行定义(这是一个特殊的函数,每个含有该函数的包都会首先执行这个函数);
  • 如果当前包是main包,则定义main函数;
  • 然后定义其余函数,首先是类型的方法,接着是按照main函数中先后调用的顺序来定义相关函数,如果有很多函数,则可以按照字母顺序来进行排序。

go程序的执行顺序

  1. 按顺序导入所有被main包引用的其他包,然后在每个包中执行如下流程:
  2. 如果该包又导入了其他的包,则从第一步开始递归执行,但是每个包只会被导入一次;
  3. 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有init函数的话,则调用该函数;
  4. 在完成这一切之后,main也执行同样的过程,最后调用main函数开始执行程序。

类型转换

// 类型B的值 = 类型B(类型A的值)
a := 5.0
b := int(a)
// IZ是int的别名
var a IZ = 5
c := int(a)
d := IZ(c)

常量

  • 常量使用关键字const定义,用于存储不会改变的数据;
  • 存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型;
  • 常量的定义格式如下:
const identifier [type] = value
const Pi = 3.14159
  • 常量的值必须是在编译时就能够确定的,你可以在赋值表达式中涉及计算过程,但是所有用于计算的值必须是在编译期间就能获得的;
  • 常量表达式中不可以使用自定义函数,因为其是在运行期才确定的,但是可以使用内置函数,如:len();
  • 常量可以用于表示枚举,在枚举中可以使用iota用来表示一个从0开始的自增量,需要注意的是,iota从0开始,并且每个常量值都对应了一个值,如果当前iota赋值的不是第一个,那么其得到的值是该常量在常量块(用括号括起来的部分)中的常量索引;
const (
	Monday  = 10
	Tuesday = iota	// 1
	Wednesday	// 2
	Thursday	// 3
)
  • 关于iota使用需要注意的一个点是,下一个枚举值对应的数据是延续上一个枚举值表达式的结果,而不单单是iota的结果,如:
type ByteSize float64
const (
    KB ByteSize = 1 << (10 * iota)
    MB	// 1 << (10 * iota)
    GB	// 1 << (10 * iota)
    TB	// 1 << (10 * iota)
    // ...
)

变量

  • 变量的语法:
var identifier type
var a int
var b bool
var str string
  • 变量块的用法:
var (
  a int
  b bool
  str string
)
  • 对于变量的赋值,可以使用多个变量连接的形式,如:
a, b, c, d := 1, 5, true, "abc"
  • 变量的交换的简便表达形式:
a, b = b, a
  • 空白标识符,也即_,主要用于一些将要被丢弃的变量,例如方法的返回值

值类型和引用类型

  • 值类型:int、float、bool、string、数组和结构
  • 引用类型:slice、map和channel

基本数据类型

  • int和uint在32位操作系统是,它们均使用32位(4个字节),在64位操作系统上,它们均使用64位(8个字节);
  • uintptr的长度被设定为足够存放一个指针即可;
  • float32精确到小数点后7位,float64精确到小数点后15位,在使用==!=来比较浮点数时应当非常小心,最好在正式使用前测试对精确度要求较高的运算;
  • 复数的表现形式:
var c1 complex64 = 5 + 10i
fmt.Printf("The value is: %v", c1)
  • 位运算
    • 按位与&表示对应位置上的值进行与操作,都为1时结果位才为1;
    • 按位或|表示对应位置上的值进行或操作,只要有一个为1时结果就为1;
    • 按位异或^表示对应位置上的值不同时结果才为1,否则为0
    • 按位清除&^表示当第二个数的对应位为1时,返回值对应位就为0,否则返回值的对应位于第一个数的对应位相同
    • 按位补足^是一个一元操作符,如果修饰的是一个无符号整数,则结果为将其全部位都进行取反操作,如果修饰的是一个有符号整数x,则结果为将其与-1进行异或操作,即-1 ^ x
    • 按位左移<<用法为bitP << n,表示将bitP所有位向左移动n位,右侧空出的部分用0填充,其结果相当于将bitP与2的n次方相乘的结果;
    • 按位右移>>用法为bitP >> n,表示将bitP所有位向右移动n位,左侧空出的部分用0填充,其结果相当于将bitP除以2的n次方的结果;

类型别名

  • 类型别名得到的新类型与原类型不完全相同,新类型不会拥有原类型所附带的方法

字符串

  • 字符串的内容可以通过标准索引法来获取,即在中括号[]中写入索引,索引从0开始计数,如:
str[0]
str[i - 1]
str[len(str) - 1]
  • 需要注意的是,使用标准索引法来获取字符串中的内容只对ASCII码字符串有效;另外,尝试获取字符串中某个字节的地址是非法的,如:&str[i]
  • 两个字符串可以通过+进行拼接,如:s := s1 + s2
  • 在进行多行操作时,如下面的示例,需要注意操作符要写在前一行的末尾,这是因为编译器在行尾自动添加分号:
str := "Beginning of the string " +
    "second part of the string"
  • 在循环中使用加号+拼接字符串并不是高效的做法,更好的办法是使用函数strings.Join(),或者使用字节缓冲bytes.Buffer拼接更加有效
  • 前缀和后缀
strings.HasPrefix(s, prefix string) bool	// 前缀判断
strings.HasSuffix(s, suffix string) bool	// 后缀判断
  • 包含
strings.Contains(s, substr string) bool
  • 索引
// 找到了则返回该子串第一次出现的索引位置,没找到则返回-1
strings.Index(s, str string) int
// 返回指定字符串在目标字符串中最后一次出现的文职,没找到则返回-1
strings.LastIndex(s, str string) int
// 返回非ASCII字符在父字符串中的位置
strings.IndexRune(s string, r rune) int
  • 替换
// 将字符串str中前n个old替换为new,并返回替换后的字符串,如果n为-1,则将所有的old替换为new
strings.Replace(str, old, new, n) string
  • 计数
// 统计字符串s中出现str的次数
strings.Count(s, str string) int
  • 重复
// 将字符串s重复count次之后返回
strings.Repeat(s, count int) string
  • 大小写转换
// 将指定字符串转换为小写
strings.ToLower(s) string
// 将指定字符串转换为大写
strings.ToUpper(s) string
  • trim字符串
// 剔除字符串两边的空格
strings.TrimSpace(s) string
// 剔除字符串两边的指定字符串
strings.Trim(s, str string) string
// 剔除字符串左侧的指定字符串
strings.TrimLeft(s, str string) string
// 剔除字符串右侧的指定字符串
strings.TrimRight(s, str string) string
  • 字符串分割
// 按照一个或多个连续的空格将字符串s进行分割,分割之后的子串存入一个slice中
strings.Fields(s) []string
// 按照指定字符串将目标字符串进行分割,分割后的子串存入一个slice中
strings.Split(s, seq string) []string
  • 拼接slice到字符串
// 将字符串slice进行拼接,并且连接处使用sep进行填充
strings.Join(s1 []string, sep string) string
  • 从字符串中读取内容
// 生成一个可以用于读取字符串str内容的Reader对象
strings.NewReader(str) Reader
  • 数字转字符串
// 将整型数字i转换为其字符串表示形式
strconv.Itoa(i int) string
// 将64位浮点型数字转换为字符串,其中fmt表示格式,其值可以是'b'、'e'、'f'、'g',prec表示精度,
// bitSize则使用32表示float32,用64表示float64
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
  • 字符串转数字
// 将字符串s转换为一个整数,转换结果使用i存储,如果转换失败,则将失败信息存储在err中
strconv.Atoi(s string) (i int, err error)
// 将字符串s转换为float64型数字
strconv.ParseFloat(s string, bitSize int) (f float64, err error)

时间

  • 当前时间
time.Now()
  • 获取时间的一部分
t.Year()
t.Day()
t.Minute()
  • Duration类型表示两个连续时刻所相差的纳秒数,类型为int64;Location类型映射某个时区的时间,UTC表示通用协调世界时间;
  • 时区格式化
// 需要注意的是,时间的格式化基准一定要以time包中所提供的时间为准,否则格式化的时间可能就不是当前时间了
t.Format(time.ANSIC)

指针

  • 指针变量的声明方式如:var ptr *type
  • 通过&可以取得一个变量的地址,通过*ptr使用指针ptr所指向的地址数据
  • 需要注意的是,常量的地址不能使用&获取,因而指针也无法指向常量并修改其值
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值