Go语言学习(三)| 基础数据类型
时间:2022-07-22
本文章向大家介绍Go语言学习(三)| 基础数据类型,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Go 基础数据类型:
- 布尔型
- 数字类型
- 字符串类型
- 错误类型
布尔型 bool
布尔型的值只能为 true
或 false
, 例:
var v1 bool = true
v1 := (2 > 1) //这种方式会自动推导为 bool 类型
布尔可以做3种逻辑运算,&&
||
!
支持的比较操作符:<
>
==
!=
<=
>=
NOTE 布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
数字类型
整型
整型类型主要为:
-
int8
有符号 8 位整型 ( -128 到 127 ) -
uint8
无符号 8 位整型 ( 0 到 255 ) -
byte
类似uint8
但不属于同一个类型 int16
uint16
-
uint32
无符号 32 位整型 -
uint64
无符号 64 位整型 int32
-
rune
类似int32
用UTF-8编码。例如循环字符串获取实际字符时就需要使用rune
类型 int64
-
uint
32 或 64 位,由硬件决定最大长度 -
int
32 或 64 位,由硬件决定最大长度 -
uintptr
无符号整型,用于存放一个指针
Go语言支持以下的常规整数运算:+
-
*
/
%
。 其中 %
是求余运算。
5 % 3 //结果为:2
浮点型
浮点数
-
float32
32位浮点数,精确到小数点后7位 -
float64
64位浮点数,精确到小数点后15位
var v1 float32 //声明后默认为 0
v2 := 12.0 //如果不加小数点,v2 会被推导为整型而不是浮点型
浮点数不能直接用 ==
来判断两个浮点数是否相等。下面是一种推荐的替代方案:
import "math"
const MIN = 0.000001
// MIN 为用户自定义的比较精度
func IsEqual(f1, f2 float64) bool {
return math.Dim(f1, f2) < MIN
}
复数
-
complex64
32 位实数和虚数 -
complex128
64 位实数和虚数
下边为声明 complex64
变量的例子:
func main() {
var v1 complex64 //声明后默认为(0+0i)
v1 = 3.2 + 12i
v2 := 3.2 + 12i
v3 := complex(3.2, 12)
fmt.Println(v1, v2, v3)//输出结果为:(3.2+12i) (3.2+12i) (3.2+12i)
}
字符串类型
字符串在Go中是 UTF-8
的由双引号("
)或反引号(``)包裹的字符序列(类型为string)。如果使用单引号则表示一个字符(UTF-8编码)一旦给变量赋值,字符串就不能修改了。如果想要修改可使用如下方式:
package main
import "fmt"
func main() {
s := "Hello, world!"
c := []byte(s) //将字符串转换为[]byte类型
c[0] = 'c'
s2 := string(c) //再转换为string
fmt.Printf("%sn", s2)
}
或者使用另外一种方式:
package main
import "fmt"
func main() {
s := "hello, world!"
fmt.Printf("%cn", s[0]) //输出h,注意输出时的格式为c
s = "c" + s[1:] // 字符串虽不能更改,但可进行切片操作
fmt.Printf("%sn", s) //输出结果:cello, world!
}
连接两个字符串
package main
import "fmt"
func main() {
str := "Starting part " +
"Ending part"
fmt.Println(str)
}
NOTE 在循环中使用加号 +
拼接字符串并不是最高效的做法,更好的办法是使用函数 strings.Join()
,使用字节缓冲( bytes.Buffer
)拼接更加给力!
字符类型 rune
在Go语言中支持两个字符类型,要给是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode字符。关于rune相关操作,可查阅Go标准库的unicode包。另外unicode/utf8包也提供了UTF-8和Unicode之间的转换。
字符串遍历
Go语言支持两种方式遍历字符串。
- 以字节数组的方式遍历
- 以Unicode字符遍历
例:
package main
import "fmt"
func main() {
str := "Hello, 你好, 世界"
length := len(str)
//以字节数组的方式遍历
for i := 0; i < length; i++ {
ch := str[i]
fmt.Println(i, ch)
}
//以Unicode字符遍历
for i,ch := range str {
fmt.Println(i,ch)//ch的类型为rune
}
}
NOTE 以Unicode字符方式遍历时,每个字符的类型是rune,而不是byte。
错误类型 error
error类型本身就是一个预定义好的接口,里面定义了一个method。
type error interface {
Error() string
}
生成一个新的error并返回,一般有以下几种处理方式:
package main
import (
"errors"
"fmt"
)
type CustomError struct {
infoa string
infob string
Err error //声明后默认为nil
}
func (cerr CustomError) Error() string {
errorinfo := fmt.Sprintf("infoa : %s , infob : %s , original err info : %s ", cerr.infoa, cerr.infob, cerr.Err.Error())
return errorinfo
}
func main() {
//方法一:采用errors包的New方法 返回一个err的类型
var err error
err = errors.New("this is a new error")
//由于已经实现了error接口的方法 因此可以直接调用对应的方法
fmt.Println(err.Error()) //输出结果:error new
//方法二: 采用fmt.Errorf 将string信息转化为error信息 并返回
err = fmt.Errorf("%s", "the error test for fmt.Errorf")
fmt.Println(err.Error()) //输出结果:fmt.Errorf
//方法三: 采用自定义的方式实现一个error的 一个duck 类型
err = &CustomError{
infoa: "err info a",
infob: "err info b",
Err: errors.New("test custom err"),
}
//输出结果:infoa : err info a , infob : err info b , original err info : custom err
fmt.Println(err.Error())
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel框架创建授权策略实例分析
- tp5递归 无限级分类详解
- PHP 进程池与轮询调度算法实现多任务的示例代码
- 如何在Laravel5.8中正确地应用Repository设计模式
- laravel框架中路由设置,路由参数和路由命名实例分析
- PHP框架实现WebSocket在线聊天通讯系统
- 设定php简写功能的方法
- 使用PHP+Redis实现延迟任务,实现自动取消订单功能
- 详解no input file specified 三种解决方法
- PHP实现微信提现功能(微信商城)
- 关于Yii2框架跑脚本时内存泄漏问题的分析与解决
- laravel 框架结合关联查询 when()用法分析
- php 实现简单的登录功能示例【基于thinkPHP框架】
- laravel框架邮箱认证实现方法详解
- 使用Git实现Laravel项目的自动化部署