zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    hdu 2881 Jack's struggle(DP)
    [置顶] DataGridView控件---绑定数据方法
    Computational Geometry Template_Polygon
    Max retries exceeded with url
    Linux /proc 的意义
    [置顶] 生成树协议介绍
    StringBuffer与StringBuilder的异同
    linux 下Eclipse for C/C++的不常见设置
    [Elasticsearch] 分布式搜索
    oracle递归函数
  • 原文地址:https://www.cnblogs.com/cnloop/p/9420862.html
Copyright © 2011-2022 走看看