0%

变量的内在机制

Go语言中的变量是分为两部分的:

  • 类型信息:预先定义好的元信息。
  • 值信息:程序运行过程中可动态变化的。

反射介绍

反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。

Gin框架介绍

Gin框架安装

go get -u github.com/gin-gonic/gin

实例:

package main
import (
	"fmt"
	"github.com/gin-gonic/gin"
)
func main() {

	r := gin.Default()
	// 创建一个默认的路由引擎
	// 也可以用gin.New() gin.Default()多用了日志和panic的recover中间件
	r.GET("/helloworld", func(c *gin.Context) {
		c.JSON(200, gin.H{
			// c.JSON:返回JSON格式的数据
			"msg": "Hello world!",
		})
	})
	err := r.Run("127.0.0.1:8001")
	// 启动HTTP服务,默认在127.0.0.1:8001启动服务
	if err != nil {
		fmt.Println("run gin field")
		return
	}
}

包简介

任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统一的分发和复用。

go test

go test命令是一个按照一定的约定和组织来测试代码的程序。在包目录内,所有以_test.go为后缀名的源文件在执行go build时不会被构建成包的一部分,它们是go test测试的一部分。

go context标准库

context包在Go1.7版本时加入到标准库中。其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据。其具体作用为:

什么是channel

channels 是一种类型安全的消息队列,充当两个 goroutine 之间的管道,将通过它同步的进行任意资源的交换。chan 控制 goroutines 交互的能力从而创建了 Go 同步机制。当创建的 chan 没有容量时,称为无缓冲通道。反过来,使用容量创建的 chan 称为缓冲通道。

goroutine

goroutine是Go并行设计的核心。goroutine说到底其实就是线程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。

检测文件是否存在

//存在返回 true,不存在返回 false
func fileIfExist(filename string) bool {
    _, err := os.Stat(filename)
    if nil != err {
        fmt.Println(filename, "is not exist!")
        return false
    }

    if os.IsNotExist(err) {
        return false
    }

    return true
}

打开文件

f, err := os.Open(filename)
if nil != err {
    fmt.Println("open", filename, "failed!")
    return
}
defer f.Close()

如果文件不存在,就会返回错误,如果存在就以只读的方式打开文件。

方法声明

在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。

package main
import "fmt"
type People struct {
	name string
	age  uint8
}
func (p People) SayHello() {
	fmt.Println(p.name, ": hello world")
	p.age = 20
}
func main() {
	p := People{name: "zhaohaiyu", age: 18} 
	p.SayHello()   // zhaohaiyu : hello world
	fmt.Println(p.age)	//18
}

基于指针对象的方法

当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。

数组

**数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。**因为数组的长度是固定的,因此在Go语言中很少直接使用数组。