Go——基本知识

结构体

  • struct 是值类型,所以当一个 struct 实例赋值给另外一个变量,这个变量不管如何改变都不会被修改

  • 一般可以将 struct 指针传递给变量,例如 v : = &Persin{},这样的形式在 beego 框架的路由设置中就有出现

  • 帮助文档:https://blog.csdn.net/qq_27682041/article/details/78789577

空接口

  • 空接口可以接受任意数据类型,声明方式 var i interface{}

  • 空接口类似于 C 语言中的万能指针,Go 中存储某个类型的值虽然可以推断,但是实际在内存中存储也是需要明确存储空间的,到底是给你分配几个单位字节

  • 显然利用空接口存储值的内存地址更为方便,这样空接口只需要4个字节单位存储内存地址,调用的时候由内存地址去找实际存储空间,最后获取值

net/http

日志记录

协程

  • 协程创建简单 go fun(),只需要关键字 go

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	go func() {
    		for i := 1; i < 100; i++ {
    			fmt.Println(i)
    		}
    	}()
    
    	go func() {
    		for i := 100; i < 201; i++ {
    			fmt.Println(i)
    		}
    	}()
    
    	for {
    	}
    }
    
  • 协程的特点,我们可以与 java 中的线程来做个比较

    • go 项目中同时开两个协程,第一个协程打印1—100,第二个打印100——200,控制台输出 1——200,而在 java 环境下运行同样代码,会发现输出结果很凌乱

    • java 是线程,它为了能够运行本线程内的代码,就需要不断争取 cpu 资源,这样就会造成时间片多次跳转,这样的跳转是不划算的,每次跳转前必须记录当前执行环境(上下文)为了下次跳回来能接着执行,无形中增加了消耗,所以输出结果才会这么凌乱

    • go 是协程,任务执行主动权在协程自己手上, 在多并发的情况下,它的调度机制是在当前协程如果 io 没有阻塞,那么时间片不跳转,当前协程一直占用 cpu 资源,如果发生了 io 阻塞就立刻将时间片跳转到其他协程,本例几乎无阻塞,所以一直会按照顺序输出

    • 当然也可以主动交出控制权,例如:runtime.Gosched()

posted @ 2018-08-05 04:14  cnloop  阅读(135)  评论(0编辑  收藏  举报