当前位置: 首页 > news >正文

go语言相关库和函数

1、fmt 包

      Go 语言标准库中的 fmt 包提供了打印函数将数据以字符串形式输出到控制台、文件、其他满足 io.Writer 接口的至以及其他字符串中

 

2、io/ioutil 包

     跟操作文件、文件夹相关的函数

 

3、go语言nil

      在Go语言中,布尔类型的零值(初始值)为 false,数值类型的零值为 0,字符串类型的零值为空字符串"",而指针、切片、映射、通道、函数和接口的零值则是 nil

     nil 是Go语言中一个预定义好的标识符,有过其他编程语言开发经验的开发者也许会把 nil 看作其他语言中的 null(NULL),其实这并不是完全正确的,因为Go语言中的 nil 和其他语言中的 null 有很多不同点

  • nil 标识符是不能比较的
  • nil 不是关键字或保留字
  • nil 没有默认类型
  • 不同类型 nil 的指针是一样的
  • 不同类型的 nil 是不能比较的,两个相同类型的 nil 值也可能无法比较
  • 不同类型的 nil 值占用的内存大小可能是不一样的
     

4、Go语言读取文件的几种方式

①使用 ioutil直接读取

//从一个io.Reader类型中读取内容直到返回错误或者EOF时返回读取的数据,当err == nil时,数据成功读取到[]byte中
//ReadAll函数被定义为从源中读取数据直到EOF,它是不会去从返回数据中去判断EOF来作为读取成功的依据
func ReadAll(r io.Reader) ([]byte, error)

//读取一个目录,并返回一个当前目录下的文件对象列表和错误信息
func ReadDir(dirname string) ([]os.FileInfo, error)

//读取文件内容,并返回[]byte数据和错误信息。err == nil时,读取成功
func ReadFile(filename string) ([]byte, error)

②借助os.Open进行读取文件

        由于os.Open是打开一个文件并返回一个文件对象,因此其实可以结合ioutil.ReadAll(r io.Reader)来进行读取。
io.Reader其实是一个包含Read方法的接口类型,而文件对象本身是实现了了Read方法的。

//打开一个需要被读取的文件,如果成功读取,返回的文件对象将可用被读取,该函数默认的权限为O_RDONLY,也就是只对文件有只读权限。如果有错误,将返回*PathError类型
func Open(name string) (*File, error)

//大部分用户会选择该函数来代替Open or Create函数。该函数主要用来指定参数(os.O_APPEND|os.O_CREATE|os.O_WRONLY)以及文件权限(0666)来打开文件,如果打开成功返回的文件对象将被用作I/O操作
func OpenFile(name string, flag int, perm FileMode) (*File, error)

③使用os.Openbufio.Reader读取文件内容

   bufio包实现了缓存IO,它本身包装了io.Readerio.Writer对象,创建了另外的Reader和Writer对象,不过该种方式是带有 缓存的,因此对于文本I/O来说,该包是提供了一些便利的

//首先定义了一个用来缓冲io.Reader对象的结构体,同时该结构体拥有以下相关的方法
type Reader struct {
}

//NewReader函数用来返回一个默认大小buffer的Reader对象(默认大小好像是4096) 等同于NewReaderSize(rd,4096)
func NewReader(rd io.Reader) *Reader

//该函数返回一个指定大小buffer(size最小为16)的Reader对象,如果 io.Reader参数已经是一个足够大的Reader,它将返回该Reader
func NewReaderSize(rd io.Reader, size int) *Reader


//该方法返回从当前buffer中能被读到的字节数
func (b *Reader) Buffered() int

//Discard方法跳过后续的 n 个字节的数据,返回跳过的字节数。如果0 <= n <= b.Buffered(),该方法将不会从io.Reader中成功读取数据。
func (b *Reader) Discard(n int) (discarded int, err error)

//Peekf方法返回缓存的一个切片,该切片只包含缓存中的前n个字节的数据
func (b *Reader) Peek(n int) ([]byte, error)

//把Reader缓存对象中的数据读入到[]byte类型的p中,并返回读取的字节数。读取成功,err将返回空值
func (b *Reader) Read(p []byte) (n int, err error)

//返回单个字节,如果没有数据返回err
func (b *Reader) ReadByte() (byte, error)

//该方法在b中读取delimz之前的所有数据,返回的切片是已读出的数据的引用,切片中的数据在下一次的读取操作之前是有效的。如果未找到delim,将返回查找结果并返回nil空值。因为缓存的数据可能被下一次的读写操作修改,因此一般使用ReadBytes或者ReadString,他们返回的都是数据拷贝
func (b *Reader) ReadSlice(delim byte) (line []byte, err error)

//功能同ReadSlice,返回数据的拷贝
func (b *Reader) ReadBytes(delim byte) ([]byte, error)

//功能同ReadBytes,返回字符串
func (b *Reader) ReadString(delim byte) (string, error)

//该方法是一个低水平的读取方式,一般建议使用ReadBytes('\n') 或 ReadString('\n'),或者使用一个 Scanner来代替。ReadLine 通过调用 ReadSlice 方法实现,返回的也是缓存的切片,用于读取一行数据,不包括行尾标记(\n 或 \r\n)
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)

//读取单个UTF-8字符并返回一个rune和字节大小
func (b *Reader) ReadRune() (r rune, size int, err error)

 

5、go语言文件操作

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
权限位0644

func Create(name string) (file *File, err error)
权限位0666
 

6、make和new

      Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives)。对于初学者,这两者的区别也挺容易让人迷糊的。简单的说,new只分配内存,make用于slice,map,和channel的初始化。

 

7、defer

Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句。当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回。特别是当你在进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然很容易造成资源泄露等问题。

如下代码所示,我们一般写打开一个资源是这样操作的:

func ReadWrite() bool {
    file.Open("file")
// 做一些工作
    if failureX {
        file.Close()
        return false
    }

    if failureY {
        file.Close()
        return false
    }

    file.Close()
    return true
}

我们看到上面有很多重复的代码,Go的defer有效解决了这个问题。使用它后,不但代码量减少了很多,而且程序变得更优雅。在defer后指定的函数会在函数退出前调用。

func ReadWrite() bool {
    file.Open("file")
    defer file.Close()
    if failureX {
        return false
    }
    if failureY {
        return false
    }
    return true
}

 

8、go语言的init()函数

    init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量

    init函数在main函数执行之前,自动被调用。不能被其他函数调用

    每个包可以拥有多个init函数

 

9、go语言:秒、毫秒、纳秒时间戳输出

package main

import (
	"time"
	"fmt"
)

func main() {
	fmt.Printf("时间戳(秒):%v;\n", time.Now().Unix())
	fmt.Printf("时间戳(纳秒):%v;\n",time.Now().UnixNano())
	fmt.Printf("时间戳(毫秒):%v;\n",time.Now().UnixNano() / 1e6)
	fmt.Printf("时间戳(纳秒转换为秒):%v;\n",time.Now().UnixNano() / 1e9)
}

 

相关文章:

  • Windows内核文件
  • MyOS(三):软盘读写
  • Python函数式编程(二):map、 reduce、 filter、 sorted
  • OpenCV(一)——图片灰度转换(灰度图) 修改图片尺寸(cv2.resize) 读取视频
  • opencv人脸识别 (一):人脸检测 (Haar级联 静态图像中人脸检测 视频中的人脸检测 )
  • opencv人脸识别 (二):人脸识别 (基于 LBPH)
  • Caffe(一)——简介 优点 Caffe2 编译和安装
  • Pytorch之经典神经网络CNN(一) —— 全连接网络 / MLP (MNIST) (trainset和Dataloader batch training learning_rate)
  • 神经网络/深度学习 相关知识
  • pytorch搭建神经网络分类Fashion-MNIST数据集
  • Python函数式编程(三):匿名函数lambda
  • 编程范式—命令式编程与函数式编程
  • Scala语言(二)
  • Scala语言(三)
  • Python——virtualenv/virtualenvwrapper
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 2017 年终总结 —— 在路上
  • Java程序员幽默爆笑锦集
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SpriteKit 技巧之添加背景图片
  • Vue.js源码(2):初探List Rendering
  • 翻译--Thinking in React
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 如何在GitHub上创建个人博客
  • 使用SAX解析XML
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 找一份好的前端工作,起点很重要
  • 从如何停掉 Promise 链说起
  • ​TypeScript都不会用,也敢说会前端?
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #前后端分离# 头条发布系统
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (实战篇)如何缓存数据
  • (四)图像的%2线性拉伸
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net web项目 调用webService
  • .NET企业级应用架构设计系列之开场白
  • @Transactional类内部访问失效原因详解
  • [145] 二叉树的后序遍历 js
  • [20150904]exp slow.txt
  • [20171101]rman to destination.txt
  • [Android]使用Android打包Unity工程
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [C/C++]数据结构 栈和队列()
  • [C++]二叉搜索树