107.【并发与标准库】(九)

简介: 107.【并发与标准库】

12.标准库builtin ⭐

这个包提供了一些类型声明、变量和常量声明,还有一些便利的函数,这个包不需要导入,这些变量可以直接使用。

(1).常用函数
1.追加
append(): 切片追加
2.长度
len() : 数组/字符串/切片长度
3.控制台打印
print() println()
4.抛出异常
panic() 终止后面的程序
(2).new 函数 和 make 函数 ⭐

new 和 make 区别:

  1. make 只能用来分配初始化类型slice,map,chan的数据;new 可以分配任意类型的数据。
  2. new 分配返回的使指针,即*T; make 返回的是引用, 即T
  3. new 分配的空间被清零; make分配后会进行初始化

new

package main
import "fmt"
func main() {
  b := new(bool)
  fmt.Printf("%T\n", b)
  fmt.Printf("%v\n", *b)
  i := new(int)
  fmt.Printf("%T\n", i)
  fmt.Printf("%v\n", *i)
  s := new(string)
  fmt.Printf("%T\n", s)
  fmt.Printf("%v\n", *s)
}

make

内建函数make(T,args)new(T)的用途不一样,它只用来创建slice,map和channel,并且返回一个初始化的(而不是置零),类型为T的值(而不是*T)。之所以不同,是因为这三个类型的背后引用了使用前必须初始化的数据结构。列如: slice是一个三元描述符,包含一个指向数据 (在数组中)的指针,长度以及容量,在这些项被初始化之前,slic都是nil的,对于slice,map和channel,make初始化这些内部数据结构,并准备好可以的值。

make([]int,10,100) //分配100个容量,长度为10的整型数组
new([]int)//返回一个指向新分配的,被置零的slice结构体的指针,即指向nil的slice指针
package main
import "fmt"
func main() {
  var p *[]int = new([]int)
  fmt.Printf("%v\n", *p)
  ints := make([]int, 10)
  fmt.Printf("%v\n", ints)
}

13. 标准库bytes之常用函数

bytes包提供了对字节切片进行读写操作的一系列函数,字节切片处理的函数比较多。分为基本处理函数比较函数后缀检查函数索引函数分割函数大小写处理函数子切片处理函数

(1).字节切片与字符串的转换

字符串转成byt切片缓存

package main
import (
  "fmt"
  "os"
)
func main() {
  s := "黎鸣先生"
  bytes := []byte(s)
  file, _ := os.OpenFile("a.txt", os.O_RDWR|os.O_APPEND, 775)
  write, _ := file.Write(bytes)
  fmt.Printf("写入的字节数:%v\n", write)
}

(2).字节切片是否包含
package main
import (
  "bytes"
  "fmt"
  "strings"
)
func main() {
  s := "duoke360.com"
  b := []byte(s)
  b1 := []byte("duoke360")
  b2 := []byte("DuoKe360")
  strings.Contains("hello world", "hello")
  b3 := bytes.Contains(b, b1)
  fmt.Printf("%v\n", b3)
  b3 = bytes.Contains(b, b2)
  fmt.Printf("%v\n", b3)
}

(3).统计字节切片的某个字符串的个数
package main
import (
  "bytes"
)
func main() {
  b1 := []byte("helooooooo")
  s1 := []byte("h")
  s2 := []byte("e")
  s3 := []byte("o")
  println(bytes.Count(b1, s1))
  println(bytes.Count(b1, s2))
  println(bytes.Count(b1, s3))
}

(4).对字节切片进行重复输出
package main
import (
  "bytes"
)
func main() {
  b1 := []byte("helooooooo")
  println(string(bytes.Repeat(b1, 1)))
  println(string(bytes.Repeat(b1, 2)))
  println(string(bytes.Repeat(b1, 2)))
}

(5).对字节切片的替换
package main
import (
  "bytes"
)
func main() {
  b1 := []byte("helooooooo")
  old := []byte("o")
  news := []byte("e")
  println(string(bytes.Replace(b1, old, news, 0)))  // 替换0
  println(string(bytes.Replace(b1, old, news, 1))) // 替换1
  println(string(bytes.Replace(b1, old, news, 2))) //替换两个
  println(string(bytes.Replace(b1, old, news, -1)))  //全部替换
}

(6).查看文本中有几个汉字
package main
import (
  "bytes"
  "fmt"
)
func main() {
  s := []byte("你好世界")
  runes := bytes.Runes(s)
  fmt.Printf("转换前字符串的长度:%v\n", len(s))
  fmt.Printf("转后前字符串的长度:%v\n", len(runes))
}

(7).字节切片间的链接
package main
import (
  "bytes"
)
func main() {
  s2 := [][]byte{[]byte("你好"), []byte("世界")}
  s4 := []byte(",")
  println(string(bytes.Join(s2, s4)))
  s3 := []byte("#")
  println(string(bytes.Join(s2, s3)))
}

14.标准库bytes之Reader

Reader实现了 io.Reader、io.ReaderAt、io.WriterTo、io.Seeker、io.ByteScaaner、io.RuneScanner等接口,Reader是只读的,可以seek。

(1).常用方法
package main
import (
  "bytes"
  "fmt"
)
func main() {
  date := "123456789"
  // 通过[]byte创建Reader
  re := bytes.NewReader([]byte(date))
  // 返回来读取部分的长度
  fmt.Println("长度为: ", re.Len())
  //返回底层数据总长度
  println("底层数据长度: ", re.Size())
  println("---------")
  buf := make([]byte, 2)
  for {
    // 读取数据
    read, err := re.Read(buf) // read,就是指有多少字节数
    if err != nil {
      break
    }
    println(string(buf[:read])) //进行读取的操作
  }
  println("--------")
  //设置偏移量,因为上面的操作已经修改了读取位置等信息
  re.Seek(0, 0) // 重新定位,定位到开头  ----- 如果不重新定位的话,会接着上面的buf继续读取
  for true {
    // 一个字节一个字节的读取
    b, err := re.ReadByte()
    if err != nil {
      break
    }
    println(string(b))
  }
  println("-----")
  re.Seek(0, 0)
  off := int64(0) // 为0
  for true {
    // 指定偏移量读取
    at, err := re.ReadAt(buf, off) //   每次读取两个
    if err != nil {
      break
    }
    off += int64(at) //
    println(off, string(buf[:at]))
  }
}
相关文章
|
10月前
|
数据采集 监控 API
淘宝淘口令 API 接口全攻略
### 淘口令 API 及相关服务简介 **一、淘口令 API(item_password)** - **功能**:将淘口令转换为商品链接或获取商品信息,支持生成自定义淘口令。 - **申请流程**:注册账号、创建应用、获取凭证、申请权限。 - **调用示例(Python)**:通过签名和请求参数调用接口,生成淘口令。 **二、第三方 API 服务** - **适用场景**:简化开发流程,支持高佣转链、淘口令解析等功能。 - **推荐接口**:万能淘口令生成、淘口令解析真实 URL。
|
存储 传感器 运维
阿里可观测性数据引擎的技术实践
相比传统的告警、监控,可观测性能够以更加“白盒”的方式看透整个复杂的系统,帮助我们更好的观察系统的运行状况,快速定位和解决问题。就像发动机而言,告警只是告诉你发动机是否有问题,而一些包含转速、温度、压力的仪表盘能够帮我们大致确定是哪个部分可能有问题,而真正定位细节问题还需要观察每个部件的传感器数据才行。
阿里可观测性数据引擎的技术实践
|
4天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1321 4
|
4天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
671 3
|
5天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
11天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
777 6