1. 指针
// 创建了一块内存 让它指向了真正存储数据的地址
// 声明
var a *int
var b := new(int)
new关键字
// 创建内存 并进行内部数据初始化 返回一个指针类型
2. nil
// nil指向golang中的空值
3. 整型
3.1 有符号整数
// eg:
var a = int8(33)
fmt.Printf("%T\n", a) // 打印类型
3.2 无符号整数
3.3 特殊整型
int // 32位操作系统是int32 64位操作系统是int64
uint // 32位操作系统是uint32 64位操作系统是uint64
uintptr // 无符整型 存放指针
3.4 八进制和十六进制
// golang无法直接定义二进制
// 定义十进制
var a = 10
// 定义八进制(文件权限)
var b = 010
// 定义十六进制(内存地址)
var c = 0x100
// 进制输出
fmt.Printf("%d\n", a) // 十进制输出
fmt.Printf("%o\n", b) // 八进制输出
fmt.Printf("%x\n", c) // 十六进制输出
3.5 超大整型
// 超大整型(超过int64范围)
方法一
// 1.创建对象
var a big.Int
// 2.初始化
a.SetInt64(1234) // 只能写入int64范围内的数值
a.SetString("1234", 10) // 可以写入任意大数值(推荐使用)
方法二(不能使用)
var a *big.Int // a为一个nil指针
fmt.Println(a)
a.SetInt64(13415) // 赋值数字会报错
fmt.Println(a)
方法三(推荐使用 节省内存)
var a = new(big.Int)
a.SetInt64(4123345678883264786216432) // 报错
a.SetString("4123345678883264786216432", 10)
// 简单运算
a := new(big.Int)
b := new(big.Int)
c := new(big.Int)
d := new(big.Int)
a.SetInt64(324)
b.SetInt64(689)
c.Add(a, b) // 加
d.Mul(a, b) // 乘
fmt.Println(a, b, c, d)
// ps: Sub(v1, v2) Div(v1, v2)只得到商 DivMod(v1, v2, minder)得到商和余数
// 简写
a := new(big.Int)
a.SetInt64(64)
// 相当与
a := big.NewInt(64)
// func NewInt(x int64) *Int {
// return new(Int).SetInt64(x)
// }
// ps: result.Int64() result.String() 结果转化为Int64和字符串
//
// var result big.Int
// result.Add()
// 需要的参数必须是是指针类型
// 存储结果的可以是指针类型 也可以是Int类型 但是内部都会转化为指针类型
3.6 整型转化为字符串
ret := strconv.FormatInt(int64(25), 2) // 将25转化为二进制 再转化为字符串
fmt.Println(ret) // 11001
// ps: strconv.FormatUint()
// strconv.ParseUint()
// strconv.ParseInt()
// 可实现进制转化
4. 浮点型
// golang中小数类型推导为默认float64
// float64和float32是两种不同的类型
const (
MaxFloat32 = 3.40282346638528859811704183484516925440e+38
SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45
MaxFloat64 = 1.797693134862315708145274237317043567981e+308
SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324
)
4.1 常见数据运算
4.2 浮点型内部存储原理
// 处理时 非精确
var a float32 = 12.21
// 第一步:转化为二进制(整数部分和小数部分)
// 第二步:拼接 整数部分二进制.小数部分二进制 1100.0011011
// 第三步:科学计数法表示 1.1000011011 × 2^3
1.1000011011 × 2^3
// 第四步:存储
// 以float32为例
// 阶码部分(exponent): 共256中可能,含正负值(-127~128)。例如5存储到阶码部分,需要让3+127=130,再将130转化为二进制存储
// 尾数部分(fraction): 存储小数点后所有数据 超出则丢弃
// decimal精确的浮点数操作
// golang中没有内置decimal 需要下载第三方包
go get github.com/shopspring/decimal // 下载
// eg:
var a = decimal.NewFromFloat(0.1)
b := decimal.NewFromFloat(0.2)
var c = a.Add(b)
var d = a.Sub(b)
var e = a.Mul(b)
var f = a.Div(b)
fmt.Println(c, d, e, f)
var price = decimal.NewFromFloat(99.99)
var p1 = price.Round(1) // 保留小数点后1位(四舍五入)
var p2 = price.Truncate(1) // 保留小数点后1位
fmt.Println(p1, p2)
4.4 浮点型转化为字符串
// strconv.FormatFloat()
// strconv.ParseFloat()
5. 复数
复数转化为字符串
strconv.FormatComplex()
strconv.ParseComplex()
6. bool类型
true
false
var a bool
// 1.声明时为false
// 2.整型不可以强制转化为bool型
// 3.bool无法参与数值运算 也无法与其他类型进行转换
bool值转化为字符串
// 字符串转化为bool
result, err := strconv.ParseBool("true")
fmt.Println(result, err)
// func ParseBool(str string) (bool, error) {
// switch str {
// case "1", "t", "T", "true", "TRUE", "True":
// return true, nil
// case "0", "f", "F", "false", "FALSE", "False":
// return false, nil
// }
// return false, syntaxError("ParseBool", str)
// }
// bool转化为字符串
result := strconv.FormatBool(true)
fmt.Println(result)
// func FormatBool(b bool) string {
// if b {
// return "true"
// }
// return "false"
// }
7. 字符型
7.1 知识点
// golang中的字符串是utf-8编码的字符序列
// unicode字符集: 文字 -> 码点(usc4 4个字节表示)
// utf-8: 对码点再进行编码
// golang中字符串必须使用双引号
// 使用单引号的是字符(int32 rune)
// 使用反引号的是原生字符串
7.2 实例
// eg:
var a = 'a'
var b = "abc"
var c = `
情商
智商
逆商
`
7.3 字符串的常用操作
// 字节长度 len(str) 字节长度
// 字符长度 v, size := utf8.RuneCountInString(str) size表示最少表示的字节
// 拼接 +(效率低); fmt.Sprintf("%s%s", str1, str2)返回; fmt.Printf("%s%s", str1, str2)打印
// strings.Join(slice, "连接符")
// 分割 strings.Split(s, sep)
// 包含 strings.Contains(s, substr)
// 前缀 strings.HasPrefix(s, prefix)
// 后缀 strings.HasSuffix(s, suffix)
// 子串索引 strings.Index(s, substr); strings.LastIndex(s, substr)
// 拼接 strings.Join([]string, sep)
// 变大写 strings.ToUpper(str) 返回大写形式 但是本身不变
// 变小写 strings.ToLower(str)
// 去两边 strings.Trim(str, "") strings.TrimRight() strings.TrimLeft()
// 替换 strings.Replace(str, "被替换str", "替换str", "去除的个数") // 去除的个数为-1表示全部替换
7.4 字符串修改
// golang中字符串不可修改 需要先转化为rune切片
// golang中字符串索引获取到的是字节
s1 := "白萝卜"
s2 := []rune(s1) // 将s1转化为rune切片 将字符串转化为unicode字符集码点的集合
fmt.Println(s2) // ['白' '萝' '卜']
s2[0] = '红' // 修改切片
fmt.Println(s2) // ['红' '萝' '卜']
s3 := string(s2) // 将rune切片转化为字符串
fmt.Println(s3) // "红萝卜"
7.5 类型转换
// 类型转化
// 1.不借助其他模块
T(表达式)
整形和浮点型相互转化
字符串和切片相互转化
// 2.strconv模块
strconv.Itoa(666) // int转化为string
strconv.Atoi("666") // string转化为int
// 3.其他(数字转字符)
string(int32(65)) // A
// 应用场景: 随机验证码
7.6 字符串格式化
// fmt.Sprintf()
// eg:
var name = "turbo"
var age = 20
ret := fmt.Sprintf("My name is %s, and my age is %d", name, age)
fmt.Println(ret)
7.7 字符串索引、切片和遍历
s := "Turbo工作室"
// 1.索引: 获取字节
s[0] // T
// 2.切片: 获取一段字节
s[5:8] // 工
// 3.遍历: (了解)
// a.遍历字节
for i:=0; i<len(s); i++{
fmt.Println(i, s[i])
}
// b.遍历字符
for index, item := range s{
fmt.Println(index, item, string(item))
}
// 内部原理:
for index, item := range []rune(s){
fmt.Println(index, item, string(item))
}