go语言

深度解密Go语言之map

自作多情 提交于 2020-01-08 08:51:52
目录 什么是 map 为什么要用 map map 的底层如何实现 map 内存模型 创建 map 哈希函数 key 定位过程 map 的两种 get 操作 如何进行扩容 map 的遍历 map 的赋值 map 的删除 map 进阶 可以边遍历边删除吗 key 可以是 float 型吗? 总结 参考资料 这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。 我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门书籍了解。本文的内容比较深入,但是由于我画了各种图,我相信很容易看懂。 什么是 map 维基百科里这样定义 map: In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible key appears at most once in the collection. 简单说明一下:在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 <key, value>

go语言之行--结构体(struct)详解、链表

情到浓时终转凉″ 提交于 2020-01-08 00:55:33
一、struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程)。struct的成员(也叫属性或字段)可以是任何类型,如普通类型、复合类型、函数、map、interface、struct等,所以我们可以理解为go语言中的“类”。 二、struct详解 struct定义 在定义struct成员时候区分大小写,若首字母大写则该成员为公有成员(对外可见),否则是私有成员(对外不可见)。 type struct_variable_type struct { member member_type member member_type ..... member member_type } //示例 type Student struct { name string age int Class string } 声明与初始化 var stu1 Student var stu2 *Student= &Student{} //简写stu2 := &Student{} var stu3 *Student = new(Student) //简写stu3 := new(Student) struct使用 在struct中,无论使用的是指针的方式声明还是普通方式,访问其成员都使用".",在访问的时候编译器会自动把 stu2.name 转为 (*stu2).name。

Golang实现简单tcp服务器01 -- 概述

女生的网名这么多〃 提交于 2020-01-07 07:27:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 概述 Golang作为一门近些年来非常风光的开发语言, 其实用范围很广, 图形界面, web框架, 图像引擎等等. 由于其语言特性简化了并发/多核的开发, 受到了很大的关注. 而使用它进行服务器开发, 也是非常高校而简洁的. 废话不多说, 本项目实践的目的是使用golang开发一个简单的基于tcp协议的服务器/客户端. 预备知识 首先, 我们需要了解一下golang下的如下包与特性: goroutine goroutine是一种轻量型的线程, 作为golang语言的语言特性, 可以很简单的在golang中进行多线程的开发. 利用go关键字, 我们能把任何一个方法/函数, 放在一个新的goroutine里执行. 实验01: 在 实验环境 的 主文件夹 里, 建立一个名为test.go的文本文档, 并开始编写以下代码 package main import ( "fmt" ) var quit chan bool = make(chan bool) func main() { go testGorountine() <-quit } func testGorountine() { for i := 0; i < 10; i++ { fmt.Println("Hello world!") } quit <- true

Go语言 之并行与并发概念

被刻印的时光 ゝ 提交于 2020-01-04 05:24:18
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,通过cpu时间片轮转使多个进程快速交替的执行。 用图解释如下: 并行是两个队列同时使用两台咖啡机 (真正的多任务) 并发是两个队列交替使用一台咖啡机 ( 假 的多任务) 来源: https://www.cnblogs.com/yang-2018/p/11124334.html

Go语言调度器之创建main goroutine(13)

不想你离开。 提交于 2020-01-04 04:46:39
本文是《Go语言调度器源代码情景分析》系列的第13篇,也是第二章的第3小节。 上一节我们分析了调度器的初始化,这一节我们来看程序中的第一个goroutine是如何创建的。 创建main goroutine 接上一节,schedinit完成调度系统初始化后,返回到rt0_go函数中开始调用newproc() 创建一个新的goroutine用于执行mainPC所对应的runtime·main函数,看下面的代码: runtime/asm_amd64.s : 197 # create a new goroutine to start program MOVQ $runtime·mainPC(SB), AX# entry,mainPC是runtime.main # newproc的第二个参数入栈,也就是新的goroutine需要执行的函数 PUSHQ AX # AX = &funcval{runtime·main}, # newproc的第一个参数入栈,该参数表示runtime.main函数需要的参数大小,因为runtime.main没有参数,所以这里是0 PUSHQ $0 CALL runtime·newproc(SB) # 创建main goroutine POPQ AX POPQ AX # start this M CALL runtime·mstart(SB) # 主线程进入调度循环

Go语言调度器之调度main goroutine(14)

ε祈祈猫儿з 提交于 2020-01-04 04:46:21
本文是《Go语言调度器源代码情景分析》系列的第14篇,也是第二章的第4小节。 上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程,这一节我们接着来分析调度器如何把main goroutine调度到CPU上去运行。本节需要重点关注的问题有: 如何保存g0的调度信息? schedule函数有什么重要作用? gogo函数如何完成从g0到main goroutine的切换? 接着前一节继续分析代码,从newproc返回到rt0_go,继续往下执行mstart。 runtime/proc.go : 1153 func mstart() { _g_ := getg() //_g_ = g0 //对于启动过程来说,g0的stack.lo早已完成初始化,所以onStack = false osStack := _g_.stack.lo == 0 if osStack { // Initialize stack bounds from system stack. // Cgo may have left stack size in stack.hi. // minit may update the stack bounds. size := _g_.stack.hi if size == 0 { size = 8192 * sys

Go语言基础之文件操作

二次信任 提交于 2020-01-03 01:55:33
本文主要介绍了Go语言中文件读写的相关操作。 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。 打开和关闭文件 os.Open() 函数能够打开一个文件,返回一个 *File 和一个 err 。对得到的文件实例调用 close() 方法能够关闭文件。 package main import ( "fmt" "os" ) func main() { // 只读方式打开当前目录下的main.go文件 file, err := os.Open("./main.go") if err != nil { fmt.Println("open file failed!, err:", err) return } // 关闭文件 file.Close() } 为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。 读取文件 file.Read() 基本使用 Read方法定义如下: func (f *File) Read(b []byte) (n int, err error) 它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0 和 io.EOF 。 举个例子: func main() { // 只读方式打开当前目录下的main.go文件 file, err := os.Open("./main.go") if

go语言基础语法

烈酒焚心 提交于 2020-01-02 22:38:42
go语言基础语法 定义变量 在go语言中有两种定义变量的方法: var的方式,如下 var a = 1 将a变量赋值1 第二种方式 ":=",如下: a := 1 和上述一样,将a变量赋值1 `注: 变量名 := 变量值,这种方式只适用于第一次赋值变量时,如果变量已赋值,如上的a已经赋值为1,此时如果想重新赋值在使用a := 2这种方式会报错,更改赋值直接a = 2即可` 定义函数: 在go语言中没有class关键字,没有类的概念,go主要是面向函数和面向接口的编程语言。 定义函数的关键字 func,如下: 语法:[ ]里面的内容为可选项 func 函数名([参数名] [参数类型]) [函数返回值类型]{ 函数具体逻辑 [return] [返回的内容] } 循环: 在go语言中只有for循环没有其他循环 基本写法: for i := 0; i <= 10 ;i++{ 循环体内容 } 死循环: for { 循环体内容 } 接收传来的变量,定义条件循环: for ; i >= 10; i++{ 循环体内容 } 4**. 判断 1.if判断: if 条件{ 处理逻辑 }else{ 处理逻辑 } switch和case判断 语法: switch [变量名] { case 条件1: 处理逻辑 case 条件2: 处理逻辑 default: 处理逻辑 }

Go语言出现后,Java还是最佳选择吗?

我的梦境 提交于 2020-01-02 16:08:18
点击这里,查看 异步与协程的关系,手工异步/Wisp性能比较,适应的Workload等更多重要内容 简介 : 阿里妹导读:随着大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈,Java也因此被质疑是否不再适应最新的云场景了。4年前,阿里JVM团队开始自研Wisp2,将Go语言的协程能力带入到Java世界。 Java平台一直以生态的繁荣著称,大量的类库、框架帮助开发者们快速搭建应用。而其中大部分Java框架类库都是基于线程池以及阻塞机制来服务并发的,主要原因包括: Java语言在核心类库中提供了强大的并发能力,多线程应用可以获得不俗的性能; Java EE的一些标准都是线程级阻塞的(比如JDBC); 基于阻塞模式可以快速地开发应用。 但如今,大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈。Java也因此被质疑是否不再适应最新的云场景了。 4年前,阿里开始自研Wisp2。它主要是用在IO密集的服务器场景,大部分公司的在线服务都是这样的场景 (离线应用都是偏向于计算,则不适用)。它在功能属性上对标Goroutine的Java协程,在产品形态、性能、稳定性上都达到了一个比较理想的情况。到现在,已经有上百个应用,数万个容器上线了Wisp1/2。Wisp协程完全兼容多线程阻塞的代码写法

Go语言学习笔记(七)杀手锏 Goroutine + Channel

南楼画角 提交于 2019-12-31 11:20:30
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 Goroutine Go语言的主要的功能在于令人简易使用的并行设计,这个方法叫做Goroutine,通过Goroutine能够让你的程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go语言也非常地适合网络服务。 我们通过go让其中一个函数同步运行,如此就不需要等待该函数运行完后才能运行下一个函数。 func main() { // 通过 `go`,我们可以把这个函数异步执行,这样就不会阻塞往下执行。 go loop() // 执行 Other } Goroutine是类似线程的概念(但Goroutine并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine就像轻量级的线程,但我们称其为并发,一个Go程序可以运行超过数万个 Goroutine,并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个Goroutine,通过GOMAXPROCS参数你能够限制Gorotuine可以占用几个系统线程来避免失控。 在内置的官方包中也不时能够看见Goroutine的应用,像是net/http中用来监听网络服务的函数实际上是创建一个不断运行循环的Goroutine。 设置同时执行的cpu数(GOMAXPROCS) GOMAXPROCS