go语言学习笔记,特点

2023-05-16

1、并发编程


Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是其最大亮点之一,也是其未来进入高并发高性能场景的重要筹码。
golang的并发执行单元是一种称为goroutine的协程。协程又称为微线程,比线程更轻量、开销更小,性能更高。
操作起来非常简单。语言级别提供关键字go用于启动协程,并且在同一台机器上可以启动成千上万个协程。
协程间一般由应有程序显式实现调度,上下文切换无需下到内核层,高效不少。协程间的通信靠独有的channel机制实现。

2、内存回收GC

  • 内存自动回收,再也不需要开发人员管理内存
  • 开发人员专注业务实现,降低了心智负担
  • 只需要new分配内存,不需要释放

GC过程是:先stop the world 扫描所有对象判活。把可回收对象在一段bitmap区中标记下来,
接着立即start the world 恢复服务。同时起一个专门goroutine回收内存到空闲list中以备复用。
不物理释放,物理释放由专门线程定期来执行。GC瓶颈在于每次都要扫描所有对象来判活,待收集的对象数目越多,速度越慢
GC性能可能随着版本不断更新会不断优化。

 

Go语言不支持try catch 这样的结构化的异常解决方式,因为觉得会增加代码量,而且会被滥用,不管多小的异常都抛出
Go语言提供的异常处理方式是
如果是普通异常,查看被调用方返回error对象,如果是严重异常,指的是中断性panic(比如除0)
使用defer  recvoer  panic 机制来捕获处理,严重异常一般由Go语言内部自动抛出,不需要用户主动抛出,避免传统try catch写的到处都是的情况。
用户也可以使用panic('xxxxx')主动抛出,只是这样就使得这套机制退化成结构化异常机制了。


类型推导,在定义变量的时候是支持var abc = 10 这样的语法。让Go语言看上去有点像动态类型语言。
但是Go语言实际上是强类型的。前面的定义会被自动推导出int类型。
关于interface接口,一个类型只要实现了某个interface的所有方法。即可实现该interface,无需显示去继承。
Go编程规范推荐每个Interface只提供一到两个方法。这样使得每个接口的目的非常清晰。
在Go语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体。也就是在函数体return前或出现panic时执行。
这种机制非常适合善后逻辑处理,比如可以尽早可能出现的资源泄露问题,可以说,defer是继goroutine和channel之后,另一个非常重要,实用的语言特性。
对defer的引入,在很大程度上可以简化编程,并且在语言描述上显得更为自然。极大地增强了代码的可读性。

4、包的概念

package main
包的概念和python一样,把相同功能的代码,放到一个目录,称为包。
包可以被其他包引用,main包是用来生成可执行文件,每个程序只有一个mian包
包的主要用途是提高代码的可复用性。通过import可以引入其他包。

package main
inport "fmt"
func test(num int){
    *num = 20  
    fmt.Println("指令3")
}


关于交叉编译,比如你可以在运行Linux系统的计算机上,开发运行Windows下运行的应用程序,这是第一门完全支持UTF-8的编程语言。
这不仅体现在它可以处理使用UTF-8编码的字符串,就连它的源码文件格式都是使用UTF-8编码。

太多工程师,写了百万行代码,而且还具有分布式的编译系统和百万的服务器,于是google在开发中就会存在一些痛点,
最大的痛点就是编译速度特别慢,所有程序之间耦合性非常强,所有依赖几乎是失控的。
每个工程师,使用不同的语言,而且只使用这个语言的一部分,程序越来越难以维护,可读性越来越差,文档也不清晰。
对于更新来讲也是非常可怕的一件事。因为需要花费的时间会越来越长,而且交叉编译变得越来越困难,
为了解决这些问题和痛点。

go语言有接近c的运行效率,和接近Python的开发效率。

它唯一的创新之处是Goroutine和Channel
Goroutine是Go语言面向线程的轻量级解决方案,创建Goroutine的成本很低,只需要几千个字节的额外内存,所以我们可以同时运行数百个,数千个Goroutine
因为它对于内存的消耗是比较小的,而且可以借助Channel实现Goroutine之间的通信,Goroutine以及基于CHannel的并发性方法。
是它非常容易使用所有可用的cpu内核,而且处理并发的IO相比于python java
在一个Goroutine上运行一个函数需要最小的代码,
Go是一种非常高效的语言高度支持并发性,Go是为大数据,微服务,并发而生的一种编程语言。

 

6、吸收了管道通信机制,形成Go语言特有的管道channel,通过管道,可以实现不同goroutine之间的相互通信。

7、函数可以返回多个值

func getSumAndSub(n1 int,n2 int)(int,int){
	sum := n1+n2
	sub := n1-n2
	return sum,sub
}

8、新的创新,切片,延时执行defer

 

Golang执行流程分析

  • 如果对源码编译后,在执行,Go的执行流程
  1.     xxx.go文件==>经过go build ==>编译 可执行文件==>运行得出结果
  • 如果我们对源码执行go run 源码,Go的执行流程如下

    xxx.go文件==>经过go run ==>得出结果

两种执行流程的方式区别

  1. 如果我们先编译生成可执行文件,那么我们可以将可执行文件拷贝到没有go开发环境的机器上,任然可以运行
  2. 如果我们是直接go run  源代码,那么如果要在另一个机器上这么运行,必须要go的开发环境,不然不可运行。
  3. 在变异时,编译器会将程序运行依赖的库文件包含在可执行文件中,所有可执行文件变大了很多。

编译和运行说明

 

build -o  myhello.exe hello.go

 

Go程序开发的注意事项:

  1. Go源文件以".go"为扩展名
  2. Go应用程序的执行入口是main()方法
  3. Go语言区分大小写
  4. Go方法由一条条语句构成,每个语句后面不用加分号;(其实go会自动添加)
  5. Go编译器是一行行进行编译的,所以我们一行最好写一条语句,一般不会把多条语句写在同一行
  6. 如果万不得已多条语句写在同一行,需要加分号;
  7. Go语言定义变量或者import的包如果没有使用到代码不能编译通过
  8. 大括号都是成对出现的,缺一不可。

 

Go程序的注释:

  1. 单行注释  //     尽量使用行注释
  2. 块注释  /*   */

gofmt main.go 

gofmt  -w main.go     //可以将格式化后的文件,重新写入文件

运算符的两边都加空格

 

import 包名

DOS的常用命令:

  • md test200 test300 test400   创建目录    make dir
  • dir  查看当前目录包含的目录和文件
  • cd  /d f:  切换到f盘       change dir
  • cd  d:\test\res
  • cd \  回到根目录
  • rd  test100              删除空目录
  • rd  /q/s test100        删除非空目录  remove directory
package main
import "fmt"

func main() {
    fmt.Println("Hello World")
    fmt.Println("Hello World")
    say()
    var num = 1 + 2
	fmt.Println("num = ",num)
	//1
	var i int   //默认值为0
	i = 10
	fmt.Println("i =",i)
	//2
	var n10 = 10.1
	fmt.Println("n10 =",n10)
	//3
	name2 := "tom"  // 注意  :  号不能省略
		fmt.Println("name2 =",name2)
	var name string = "tom"
		fmt.Println("name =",name)
	//一次性声明多个变量
	var n1,n2,n3 int
	fmt.Println("n1 = ",n1,"n2 = ",n2,"n3 = ",n3)
	
	var t1,name21,t3=100,"tom1",888
	fmt.Println("t1 = ",t1,"name21 = ",name21,"t3 = ",t3)
}

func say(){
    fmt.Println("abc")
    
}

输出结果:

i = 10                                                                                                                                                                             

n10 = 10.1                                                                                                                                                                         

name2 = tom                                                                                                                                                                        

name = tom                                                                                                                                                                         

n1 =  0 n2 =  0 n3 =  0                                                                                                                                                            

t1 =  100 name21 =  tom1 t3 =  888 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go语言学习笔记,特点 的相关文章

  • Docker部署Sonarqube

    1 下载镜像 docker pull registry span class token punctuation span cn span class token operator span shenzhen span class toke
  • leetcode刷题 旋转链表

    92 反转链表 II 难度中等393 反转从位置 m 到 n 的链表 请使用一趟扫描完成反转 说明 1 m n 链表长度 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL m 61 2 n 61 4 输出 1 gt 4
  • 分布式实时处理系统——C++高性能编程 RAII resource acquisition is initialization

    分布式实时处理系统 C 43 43 高性能编程 前言 基于通信基础 xff0c 介绍Hurricane实时处理系统的工程实现 xff0c 主要使用C 43 43 语言 一 IPC socket 异步I O epoll 二 C 43 43 1
  • 6月21 刷题思考

    1 RALL相关知识点 2 std set的使用 xff1f xff1f 不熟练 3 一个无序整数数组中找到最长连续序列 4 Two Sum 问题 Data structure design 5 i 43 43 在两个线程里边分别执行100
  • V2X就是Vehicle To Everything 国标中有五种消息BSM、RSI、RSM、SPAT、MAP

    前面讲到V2X就是Vehicle To Everything xff0c 即车队外界所有信息的交换 xff0c 这里的X代表Everything xff0c 在V2X概念中 xff0c 我们将它看作四大部分 xff0c 车与车通信 xff0
  • 6月23 leetcode 二进制求和

    67 二进制求和 难度简单404收藏分享切换为英文关注反馈 给你两个二进制字符串 xff0c 返回它们的和 xff08 用二进制表示 xff09 输入为 非空 字符串且只包含数字 1 和 0 示例 1 输入 a 61 34 11 34 b
  • 利用栈实现树的中序遍历

    94 二叉树的中序遍历 难度中等537收藏分享切换为英文关注反馈 给定一个二叉树 xff0c 返回它的中序 遍历 示例 输入 1 null 2 3 1 2 3 输出 1 3 2 进阶 递归算法很简单 xff0c 你可以通过迭代算法完成吗 x
  • STL中的set详解

    1 关于set C 43 43 STL 之所以得到广泛的赞誉 xff0c 也被很多人使用 xff0c 不只是提供了像vector string list等方便的容器 xff0c 更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构
  • 你真的了解二分查找吗?

    传统的二分查找算法 提到二分查找 xff0c 相信很多人都不陌生 xff0c 大学学数据结构的时候老师都讲过 xff0c 它是一种效率较高的查找方法 xff0c 基于顺序存储结构的线性表 xff0c 且要求表中元素按关键字有序排列 假设元素
  • 二叉树DFS/BFS实现(C++)

    深度优先搜索算法 xff08 Depth First Search xff09 DFS是搜索算法的一种 它沿着树的深度遍历树的节点 xff0c 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 xff0c 搜索将回溯到发现节点v的那条边

随机推荐

  • 当TCP建立连接过程中出现问题了,如何检查?

    netstat命令 stat状态说明 TCP协议规定 xff0c 对于已经建立的连接 xff0c 网络双方要进行四次握手才能成功断开连接 xff0c 如果缺少了其中某个步骤 xff0c 将会使连接处于假死状态 xff0c 连接本身占用的资源
  • 本地服务器上传代码到gitee仓库

    把gitlab仓库里的node day01项目传到本地服务器 再把本地服务器里的node day01项目传到Gitee代码仓库 1 登录Gitlab xff0c 复制代码仓库地址 2 拷贝一刚复制的Git 仓库到本地 root 64 ubu
  • 牛客网刷刷刷刷

    作者 xff1a 故事的小黄瓜 链接 xff1a https www nowcoder com discuss 436386 来源 xff1a 牛客网 1 xff0e 线程池如何开启一个新线程 xff1f 2 xff0e 线程池初始化的步骤
  • c++ 后端linux开发常见问题

    计算机操作系统 xff08 Linux xff09 命令 xff1a netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟
  • STL c++ 使用小结

    各位看官 xff0c 欢迎来到趁热搬砖小码农的博客 在写C 43 43 程序的时候会发现STL是一个不错的东西 xff0c 减少了代码量 xff0c 使代码的复用率大大提高 xff0c 减轻了程序猿的负担 还有一个就是容器 xff0c 你会
  • Oracle面试题,带答案!

    1 你要对操纵Oracle数据库中的数据 下列哪个选项表示Oracle中select语句的功能 xff0c 并且不需要使用子查询 xff08 C xff09 A xff0e 可以用select语句改变Oracle中的数据 B xff0e 可
  • 什么是进程?什么是线程?总结

    1 什么是进程 xff1f 什么是线程 xff1f 进程是表示资源分配的基本单位 xff0c 又是调度运行的基本单位 例如 xff0c 用户运行自己的程序 xff0c 系统就创建一个进程 xff0c 并为它分配资源 xff0c 包括各种表格
  • C++知识点小结(趁热搬砖三年半的小码农) 2020年07月2日整理

    c 43 43 最好用易用的新特性 xff1a auto decltype https blog csdn net zyc2018 article details 93591189nullptr range forusing c 43 43
  • 如何定位内存泄漏问题

    如何定位内存泄漏问题 Things You 39 ll Need Proficiency in C 43 43 C 43 43 compilerDebugger and other investigative software tools
  • C++之future和promise

    C 43 43 之future和promise future和promise的作用是在不同线程之间传递数据 使用指针也可以完成数据的传递 xff0c 但是指针非常危险 xff0c 因为互斥量不能阻止指针的访问 xff1b 而且指针的方式传递
  • linux常用小知识点

    答案linux考试题 1 在登录Linux时 xff0c 一个具有唯一进程ID号的shell将被调用 xff0c 这个ID是什么 b A NID B PID C UID C CID 答 xff1a w命令查看用户tty终端信息 ps ef
  • 无锁编程基础

    背景 我们处在技术快速发展的时代 xff0c 竞争变得前所未有的激烈 xff0c 不仅要十八般武艺俱全 xff0c 还得选对正确的技术 xff0c 跟上发展的脚步 xff0c 并贴上精研某个专业方向的标签 我们不仅要面对多线程和并发 xff
  • Linux网络相关概念和修改IP地址的方法

    网卡的命名规则 ifconfig xff1a 用于显示或设置网络设备 ens32 span class token punctuation span flags span class token operator 61 span span
  • 二维坦克大战游戏代码开发

    这是我实际面试中 xff0c 遇到的一个题目 xff0c 编写一个坦克大战游戏 一开始感觉懵 xff0c 后来代码写写就好了 include lt iostream gt include lt stdlib h gt include lt
  • 软件系统性能常识

    不管是系统设计人员 开发人员还是测试人员 xff0c 要构建高性能的系统 xff0c 对于系统性能的一些常用术语都不了解 xff0c 那是无从做起的 xff0c 这里主要介绍几个软件性能指标的术语及计算方法 xff0c 便以在性能优化及性能
  • Socket的三种轮询方式select、poll、epoll之间的区别

    select poll epoll之间的区别 搜狗面试 1 select 61 61 gt 时间复杂度O n 它仅仅知道了 xff0c 有I O事件发生了 xff0c 却并不知道是哪那几个流 xff08 可能有一个 xff0c 多个 xff
  • linux后端c++开发人员需要学习的技术栈

    数据结构和算法 学完之后要刷leetcode xff08 剑指offer xff09 计算机网络 tcp ip 协议栈 xff08 tcp ip详解 xff09 操作系统 进程和线程 并发 和锁 内存分布调度等等 xff08 深入理解操作系
  • 内核态和用户态的区别

    内核态和用户态的区别 当一个任务 进程 执行系统调用而陷入内核代码中执行时 xff0c 我们就称进程处于内核状态 此时处理器处于特权级 最高的 0级 内核代码 当进程处于内核态时 xff0c 执行的内核代码会使用当前的内核栈 每个进程都有自
  • Linux查找命令四剑客awk、sed、find(locate)、grep讲解

    目录 find命令 xff1a 一旦执行了chmod 000 那么如何恢复权限呢 xff1f 2 grep xff08 找文件内容 行操作 xff09 3 awk 4 sed 找文件内容 行操作 find命令 xff1a 1 find xf
  • go语言学习笔记,特点

    1 并发编程 Go语言在并发编程方面比绝大多数语言要简洁不少 xff0c 这一点是其最大亮点之一 xff0c 也是其未来进入高并发高性能场景的重要筹码 golang的并发执行单元是一种称为goroutine的协程 协程又称为微线程 xff0