Go学习笔记二: 函数,文件操作及网络通信

Go学习笔记二: 函数,文件操作及网络通信

1.引言

在《Go学习笔记一》中,我对Go语言中的基础数据类型、控制结构做了总结,该篇笔记的动机来源于我实际工作中利用Go解决一些小问题。问题本身并不复杂,用Python或者Shell同样可以解决。纯粹是为了体验及学习Golang.

另外,我在这边文章中没有对go的异常及错误处理做说明,因为这一块内容很多,我会在后续的学习中单独叙述,此处不表。

2.函数

在C语言中,数据结构+算法构成了程序的主题,我们的主要工作也体现在通过对业务的分析,提炼实体,定义数据结构,定义一系列的函数对数据结构进行处理。

在C++中,函数更多的是体现在作为类的方法存在。

在Go语言中,函数依然存在,但是定义的格式和C/C++稍有不同,但是核心未变。函数名,参数列表,返回值。

func funcName(param1 type1, param2 type2, .....)(ret1 retType1, ret2 retType2 ...){

    //业务逻辑处理
    return value1, value2
}

2.1 可变参数

一般情况下我们的参数是固定个数,但有时候也会出现可变参数,比如C语言中的printf就是,不过我在实际项目中用的很少。

func printadd(content string, args ...int) {

	var sum = 0
	for _, value := range args {
		sum += value
	}

	fmt.Print(content)
	fmt.Println(sum)
}

格式上的差异不多说,有几个注意点: go中函数可有多返回值,如果在C/C++中,可能需要放到一个结构体中,但是在C中不需要,对于不想要的返回值,用下划线占位即可;
go语言中可以定义匿名函数,可以在函数内部进行使用;

3.文件操作

在现实项目中,几乎没有不涉及到文件操作的。典型的操作有:

  • 进程启动,读取配置文件
  • 读写日志

所以学习一门新的语言,要快上手,文件操作一定要关注,此处我罗列了几个常用操作

3.1 检查文件是否存在

在C/C++中,我们利用stat函数检查文件状态,用来判断文件是否存在,在golang中,同样如此;如果stat的过程中出现错误,则文件不存在;否则文件存在。

func isFileExist(filePath string) bool{
        _, err := os.Stat(filePath)

        if (err == nil){
                return true
        }else{
                return false
        }
}

3.2 获取文件列表

该代码的核心思想是利用filepath的walk函数,遍历我们传入的文件树,每当遍历到目录或者文件的时候,都会触发我们传入的回调函数,在回调中,我们记录下文件的路径信息。最终返回一个文件路径所有信息的集合。

func getFileList(dirPath string) ([]string, error) {

	filelist = make([]string, 100)
	err := filepath.Walk(dirPath, func(path string, f os.FileInfo, err error) error {
		if f == nil {
			return err
		} else if f.IsDir() == true {
			return nil
		}

		filelist = append(filelist, path)
		return nil
	})

	return filelist, err
}

3.3 读文件

读文件在C语言中常用的方法是fopen, fread,打开文件后将数据读入到用户指定的缓冲区中,往往是带有指针的操作。 此处我以从文件中读取一行文本信息为例,说明如何利用go来读取文件信息。

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {

	filename := "D:\\mylibs3\\CephS3.h"

    //打开文件
	file, err := os.Open(filename)
	if err != nil {
		fmt.Println("open file failed")
	}

	defer file.Close()

    //按行读取文件
	rd := bufio.NewReader(file)

	for {
		line, err := rd.ReadString('\n')
		if err != nil || io.EOF == err {
			break
		}
		fmt.Println(line)
	}
}

3.4 写文件

向文件写数据,打开文件,写入数据。 此处写入数据有多种方式 a. 直接利用file写入数据; b. 利用io,将file及要写入的文件内容作为参数传入; c. 利用bufio创建Writer,再写入数据;

 import (
     "fmt"
     "os"
     "io"
     "bufio"
 )

func writefile(filePath string){

        file, err := os.OpenFile(filePath, os.O_CREATE | os.O_RDWR | os.O_APPEND, os.ModeType)

        if err != nil{
                fmt.Println("文件打开失败")
                return
        }

        defer file.Close()

        //方式1, 直接用file 写入数据
        file.WriteString("hello,world1.")

        //方式2, 利用io来写数据
        io.WriteString(file, "hello,world2")

        //方式3, 利用bufio写数据
        bf := bufio.NewWriter(file)
        bf.WriteString("hello, world3")
        bf.Flush()
}

4. 网络通信

在现实项目中,几乎没有不涉及到网络通信的。访问数据库走网络,访问web服务器走网络,各中间件同样如此。不过通信层次不一样。
有的项目在TCP/IP层面设计二进制通信协议; 有的基于json或者xml这种文件信息,走http协议; 在分布式系统中,心跳,也要走通信;所以有必要研究下这个语言对网络通信的支持。

4.1 http协议,发送请求及接收响应

此处利用http包,构建Get请求,并答应请求到的所有内容

func httpGet() {
        resp, err := http.Get("http://www.baidu.com")
        if err != nil {
                // handle error
        }

        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
                // handle error
        }

        fmt.Println(string(body))
}

http协议有多种操作,head, get, post, put, delete等。此处只做基本示例,就不一一说明了。

5.附录

我之前基于sublime配置go语言的开发调试环境,后来发现IntelliJ IDEA居然也有golang的插件,以前听说这是一款很牛逼的IDE.所以我还是尝试了一下,毕竟那年用visual stdio写程序的日子,还是让人怀念的。附上安装教程。

IDEA golang开发环境配置

IDEA下载链接

转载于:https://my.oschina.net/myspaceNUAA/blog/683723

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值