首页 > 其他分享 >golang入门概览

golang入门概览

时间:2024-03-09 22:22:19浏览次数:20  
标签:协程 入门 概览 golang 地址 内存 go 对齐

一、语法

  • golang中数据类型有值类型(bool int string)和派生类型(struct interface等等)。值类型通常在栈上分配内存,派生类型通常在堆上分配内存。
  • golang中的函数调用,只有值传递,没有引用传递。但是golang提供了指针,使用指针可以达到引用传参的效果,在函数内部修改参数后可以在外部观察到。一个例子是:在c++中使用数组作为参数,修改数组中某个元素的值,函数结束后修改是生效的,c++这里是引用传参,但golang却不是。golang里函数传参都是值传递。
  • 指针的值是一个地址,通过指针访问数据,首先要访问这个地址值,然后再根据地址值去取最终的数据。
  • 指针相关:*是取值运算符,&是取地址运算符。*也用来声明数组,代码举例
package main
import "fmt"

func main(){
	var num int = 3
	var ptr *int= &num 
	var value = *ptr
	fmt.Println("数字num的值是",num)
	fmt.Println("num的地址是",ptr)
	fmt.Println("对地址取值得到",value)
}
  • 结构体使用一块连续的内存,结构体中的字段按照它们被声明的顺序在这块内存中存储,但是有对齐规则。因此不同的字段声明顺序也影响结构体占用的内存大小,也就是说,结构体中字段声明的顺序是一个可以优化的点,可以减少内存占用
  1. 内存对齐的原因:

    不同计算机的字长可能不同,32位计算机和64位计算机字长不同。cpu每次读取一个字长的数据。

    各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。

  2. 内存对齐规则(不同的描述方式是一样的含义)

    第一种描述方式:
    struct内部每个成员按自身大小对齐。
    struct末尾紧贴着一个相同类型的struct,也能够使下一个struct内成员对齐。

    第二中描述方式:
    结构体变量的起始地址能够被其最宽的成员大小整除
    结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
    结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节

二、运行时 golang runtime

go是一个编译语言,没有虚拟机,编译后获得的是可以直接运行的二进制文件。go实现跨平台的方式是编译成不同平台的二进制程序。

怎么理解golang runtime呢?可以把它理解成c++里的链接库,当把go源文件编译成可运行程序的时候,goruntime的代码已经集成在程序中了。

goruntime包含以下几部分内容:协程调度器、内存管理、内存回收等等

  1. 调度器模型 GMP 


    其中G表示goroutine协程,M表示machine,P表示process
    golang中通过go语句提交一个协程goroutine,协程是一段可执行的代码,一个计算任务。如果协程的状态是可运行runnable,则会放入全局队列中。全局队列中的goroutine会被分配到不同的局部队列即P(process)中,p的数量通常设置成和cpu核心数相同,p本身不能执行其中的g,而是通过m来执行g。每一个m会绑定一个p,每次从p中获取一个g来执行,g执行结束或者阻塞后再从p中获取下一个g来执行,不断重复这一过程。当m执行g的时候,可能进入阻塞状态的内核调用中,此时m进入阻塞状态,释放自己所持有的p。被释放的p可以关联其他空闲的m继续执行。所以,m的数量大于等于p,p的数量一般等于cpu核心数。
    盗用网上的一张图:

     

  2. 并发模型

    “不要通过共享内存来通信,要通过通信来共享内存”

    java中通常用锁来实现线程同步。通常是一个可重入的排它锁,只有持有锁的线程才可以对目标内存进行写入,其他线程会被阻塞挂起。

    golang中使用协程和通道来实现并发,通道用来传递顺序消息,通道可以有缓冲,可以没有缓冲。不同协程之间的同步通过通道消息来实现。

    goroutine不是线程,协程的调度不会引起线程调度。

  3. 垃圾回收 gc

三、包管理器gopm 

 

 

包管理器 gopm 类似于maven、apt,概念类似:中央仓库、本地仓库

国内下载依赖比较慢,可以设置代理 GOPROXY=https://proxy.golang.org,direct

几个常用命令如下

  • go env 查看环境变量
  • go env -w KEY=VALUE 写入环境变量
  • go get 从网上下载依赖,安装到本地GOPATH目录中
  • go run 编译并运行代码,不会保留编译结果
  • go build 编译代码,编译结果是可执行文件,可以直接在终端运行

 

标签:协程,入门,概览,golang,地址,内存,go,对齐
From: https://www.cnblogs.com/afraidToForget/p/18062394

相关文章

  • Rust-入门-01
    Rust语言有哪些特性?建议一:从整体出发,不要让自己陷入到细节中去建议二:抛弃一次性学会的念头语言架构所有权系统编程范式语言架构类型系统内存管理Rust语言设计哲学是什么?Rust社区和生态如何?参考1......
  • Java入门(向世界呐喊、Java运行机制、IDEA)
    Java入门1.HelloWorld!(向世界呐喊)新建文件夹用于存放代码(Code)->新建Java文件(Hello.java)->使用Notepad++进行编辑->在当前路径打开CMDpublicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("HelloWorld!"); }}注意:系统可能没有显示文件......
  • SpringCloud入门
    微服务架构的出现单体应用之殇无法快速迭代代码合并冲突,沟通成本大幅提高回归用例庞杂,无法快速迭代无法快速恢复某版本小需求有bug需要回退整个版本的功能,且需要再走一遍冗长的发布流程微服务架构优势微服务架构是在SOA(Service-OrientedArchitecture,面向服务的架......
  • libtorch入门例程
    libtorchC++版可以直接在官网下载。自己学习如果没有合适的显卡可以选择下载CPU版的。下面是官网链接:PyTorch下载后就可以把开发包包含到VS的项目中使用。注意libtorch官网提供的Release/Debug的开发包,Debug版的程序用Debug版的库,Release版的程序用Release版的库,不能混用。另......
  • Java入门(Java诞生、特性、版本、开发环境搭建)
    Java入门1.Java帝国的诞生—一场旷日持久的战争(1)1972年C语言诞生:贴近硬件,运行极快,效率极高;应用于:操作系统、编译器、数据库、网路系统等;难点:指针和内存管理;(2)1982年C++诞生:面向对象;兼容C语言;应用于:图像领域、游戏等;(3)Java帝国的诞生:1995年Java诞生:网页简单而粗糙......
  • MySQL 入门指南
    目录1.简介和基础概念1.1.MySQL是什么?1.2.数据库管理系统(DBMS)的基本概念1.3.SQL(StructuredQueryLanguage)的作用和重要性2.安装和配置MySQL2.1.在Linux下使用Docker进行MySQL的安装和配置2.2.Windows、MacOS下的安装步骤(待补充)3.SQL基础3.1.SQL的基本语法......
  • golang将时间转为时间戳碰到的问题
    golang将字符串"2024-03-0716:00:00"转为时间戳代码如下:packagemainimport("fmt""time")funcmain(){//定义时间格式,与字符串中的时间格式匹配constlayout="2006-01-0215:04:05"//要转换的时间字符......
  • [Redis] 01-Redis快速入门
    一、Redis简介Redis属于键值对(key-value)数据库Redis中所有的数据都是以key-value的形式存储在内存中的所以读写Redis非常的快,在高并发的场景下,性能非常的好二、Redis服务端(redis-server)的安装省略。建议使用docker安装。Docker安装redis(保姆级教程&图文并茂)-腾讯......
  • C语言0基础入门游戏辅助开发—学习笔记02
    C语言0基础入门游戏辅助开发—学习笔记02PS:这里仅作为本人学习过程中的随笔。数据类型、sizeof运算符数据类型数据类型是在关键字内的,或者说关键字包含数据类型。数据类型有哪些程序中的代码和数据都是以二进制的形式存储的,对计算机系统和硬件而言,数据类型的概念不存在,这......
  • 老鹅分享:海量后台开发——从入门到放弃
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯大家好,我曾是一名鹅厂的后台开发工程师。从2013年开始,我就在准备一个后台开发方向的培训文档,并多次在内部培训和腾讯课堂上分享过。可是,当《数据密集型应用系统设计......