Go语言中文网 为您找到相关结果 560

golang面试基础系列-传值&传指针(二)

在 Go 中函数传递参数有传值和传指针两种类型,本文将从细节之处剖析两者的不同。 先看一个demo: package main import ( "encoding/json" "fmt" ) type Girl struct { Name string `json:"name"` DressColor string `json:"dress_color"` } func (g Girl) SetColor(color string) { g.DressColor = color } func (g Girl) GetJson() string { data, _ := json.Marshal(&g) return string(data) } func main() { g := Gir...阅读全文

博文 2019-06-23 19:02:37 热爱coding的稻草

Golang百万级高并发实例

前言 感谢Handling 1 Million Requests per Minute with Go 这篇文章给予的巨大启发。 基础 我们使用Go语言,基本上是因为他原生支持的高并发:Goroutine 和 Channel;Go 的并发属于 CSP 并发模型的一种实现;CSP 并发模型的核心概念是:“不要通过共享内存来通信,而应该通过通信来共享内存”。 简单用法 我一开始学习Go语言的时候,遇到大访问量的时候,会先创建一个带缓冲的channel,然后起一个Go协程来逐个读取channel中的数据并处理。说他是并发是因为他没有占用主线程,而是另起了一个协程独自运行。但是这没有实现请求之间的并发。特别注意:Go语言中的map不是并发安全的,要想实现并发安全,需要自己实现(如加锁),或者使用sy...阅读全文

redis快速理解

## 基础 redis是可基于内存亦可持久化的日志型、Key-Value数据库. 类似于memcached,但是支持更复杂的数据结构List、Set、Sorted Set等,并且有持久化的功能 ### 特性 1. 单进程单线程模型,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销 2. 操作具有原子性 3. 其数据库完全保存在内存中,仅使用磁盘进行持久化 4. 丰富的数据类型 5. 支持分布式,可以将数据复制到任意数量的从机(slave)中 6. 支持事务 单个步骤处理一组命令,原子意味着要么处理所有命令,要么都不处理 命令序列化,按顺序执行 原子性 三阶段: 开始事务 - 命令入队 - 执行事务 - 取消事务 命令:MULTI/EXEC/DISCARD 7. 发...阅读全文

博文 2019-12-03 18:33:38 bytemode

从零学习 Go 语言(07):数据类型之指针

Hi,大家好呀,我是一个刚学习 Go 语言不久的新手,在入门 Golang 的这段时间里,我写了很多详细的学习笔记,很适合新手学习噢。这些文章已经发布在我的个人微信公众号里:《Go编程时光》里,今天开始将文章内容搬运到这里,希望有更多的人看到,给更的人带来帮助,但是这里文章会相对滞后,想获取最新文章,可以前往关注《Go编程时光》,请放心关注,这是一个纯分享的号,完全没有广告。 **系列导读 ** [从零学习 Go 语言(01):一文搞定开发环境的搭建](https://studygolang.com/articles/27365) [从零学习 Go 语言(02):学习五种变量创建的方法](https://studygolang.com/articles/27432) [从零学习 Go 语言(...阅读全文

博文 2020-03-31 10:53:01 hello_wbm

使用Golang sync.Pool节约内存

package main import ( "fmt" "sync" ) func main() { var numCalcsCreated int calcPool := &sync.Pool{ New: func() interface{} { numCalcsCreated += 1 mem := make([]byte, 1024) return &mem }, } //用4kb初始化pool calcPool.Put(calcPool.New()) calcPool.Put(calcPool.New()) calcPool.Put(calcPool.New()) calcPool.Put(calcPool.New()) const numWorkers = 1024 * 1024 ...阅读全文

博文 2019-06-08 23:32:42 FredricZhu

go语言slice的理解

Golang slice yongsean 作者 2017.02.17 00:07 打开App 创建切片,len、cap、append b := make([]int, 5) println(len(b), cap(b)) // 输出结果是:5, 5 fmt.Println(b) // 输出结果是:[0 0 0 0 0] 上述代码是生成默认占用5个0值的切片,下面的输出结果是另一回事 b := make([]int, 0, 5) println(len(b), cap(b)) // 输出结果是:0, 5 fmt.Println(b) // 输出结果是:[] 上述代码是生成cap长度为5,实际使用长度为0的切片,在指定的cap内进行append操作,是不会发生内存拷贝扩容操作。 b := ma...阅读全文

博文 2017-07-05 16:00:06 oxspirt

golang-101-hacks(13)——二维切片

注:本文是对golang-101-hacks中文翻译。 Go支持多维切片,再此只对二维切片切片做介绍。日常生活中通常会使用到二维切片,而多维似乎并不多见。如果你经常使用多维切片,个人认为代码极不友好,也不容易维护,因此可以试试有没有更好的方法去解决多维的问题;另外的原因是多维切片和二维切片的原理是一样的,如果你对二维切片理解的很好,可以做到一通百通。 查看下面的demo package main import "fmt" func main() { s := make([][]int, 2) fmt.Println(len(s), cap(s), &s[0]) s[0] = []int{1, 2, 3} fmt.Println(len(s[0]), cap(s[0]), &s[0][0]) ...阅读全文

博文 2019-06-06 01:32:41 羊羽share

关于网上各种GO语言GC文章的一些困惑和个人理解

目前网上有很多不错的介绍GO语言三色标记GC的文章和源码分析,这里推荐一篇个人感觉写的比较不错的从源码层面解析GO GC的博客Golang 垃圾回收剖析。看这些文章的过程中也产生了一些困惑,这里分享一下个人的思考,如果有不准确的地方欢迎大家批评指正。 困惑1:什么是root对象? 介绍go gc的文章都会提到,在三色标记的过程中,从root对象开始遍历找出所有的活跃对象,但我收集到的资料里没有提到什么是root。那什么是root对象呢? 全局变量:可执行文件的.data和.bss域记录了全局变量的内存地址,被这写内存地址指向的内存是活跃对象。 go routine stack:go routine的的局部变量如果分配在堆上,需要GC来管理内存的回收,go routine的stack有类似于程...阅读全文

HyperLogLog 算法在监控场景中的运用

HyperLogLog 算法在监控场景中的运用 背景介绍 OpsMind 低代码开发平台监控模块,为了支撑B站众多监控数据的管理场景,研发人员在分布式层做了众多优化工作。为了更好的掌握每个 metric 自身的空间占用以及各个存储节点的时序分布情况,需要对每个指标的时序数目(基数)有一个大致的预估(允许存在误差),以便于 OpsMind 系统能更加合理的均衡各个存储节点的负载。 为何选用 HyperLogLog OpsMind 系统指标的形式与 prometheus 完全兼容(在此 prometheus 基础上做了一些拓展),一个监控指标(metric)的时序数,可以看做是该指标所有 labels 的组合(对 labels 求 fingerprint)数目。在对每个指标时序集合进行统计的过程...阅读全文

博文 2020-03-16 17:38:14 啊哟喂_

golang-101-hacks(11)——切片结构

切片有3部分组成 a)指针:指向底层数组中首位置; b)长度(类型为int):切片的有效元素个数; b)容量(类型为int):切片的容量。 看下面的代码: package main import ( "fmt" "unsafe" ) func main() { var s1 []int fmt.Println(unsafe.Sizeof(s1)) } 在64位置系统中打印结果是24(指针和整数类型都是占8个字节) 在下面的栗子中,使用gdb设置断点查看slice结构,代码如下 package main import "fmt" func main() { s1 := make([]int, 3, 5) copy(s1, []int{1, 2, 3}) fmt.Println(len(s1),...阅读全文

博文 2019-06-01 01:34:40 羊羽share

golang快速入门[5.2]-go语言是如何运行的-内存概述

前文 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速入门[2.3]-go语言开发环境配置-linux golang快速入门[3]-go语言helloworld golang快速入门[4]-go语言如何编译为机器码 golang快速入门[5.1]-go语言是如何运行的-链接器 前言 总的来说一个程序的生命周期可以概括为: 编写代码 => 编译 => 链接 => 加载到内存 => 执行 在上一篇文章中,我们详细介绍了go语言编译链接的过程 在本文中,我们将对内存进行简单介绍 在下文中,我们将介绍内存分配以及go语言中的内存分配 内存 在计算机中,术语"内存"又叫做主存,通常指的是可寻址的半导...阅读全文

博文 2020-02-19 15:32:43 唯识相链2

深入理解 Go map:初始化和访问元素

从本文开始咱们一起探索 Go map 里面的奥妙吧,看看它的内在是怎么构成的,又分别有什么值得留意的地方? 第一篇将探讨初始化和访问元素相关板块,咱们带着疑问去学习,例如: 初始化的时候会马上分配内存吗? 底层数据是如何存储的? 底层是如何使用 key 去寻找数据的? 底层是用什么方式解决哈希冲突的? 数据类型那么多,底层又是怎么处理的呢? ... 原文地址:深入理解 Go map:初始化和访问元素 数据结构 首先我们一起看看 Go map 的基础数据结构,先有一个大致的印象 hmap type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer ol...阅读全文

博文 2019-03-05 21:34:46 煎鱼

Go语言学习笔记2/2

chap04 并发编程 1.Go语言支持语言级别轻量级别线程,称之为goroutine,由Go语言运行时runtime管理。如下多线程实例: package main import ( "fmt"; "sync"; "runtime" ) var counter int = 0 func Count(lock *sync.Mutex){ lock.Lock() counter++ fmt.Println(counter) lock.Unlock() } func main(){ lock:=&sync.Mutex{} for i:=0;i<10;i++ { go Count(lock) } for { lock.Lock() c:=counter lock.Unlock() runtime....阅读全文

博文 2016-08-29 14:00:07 conanswp

golang——用简单的方式理解指针

定义 指针,就是保存对象的内存地址。用指针的好处就是节约内存空间。 定义一个指针类型的变量很简单,就是在变量名前加* //基础类型指针 var ps *string var pi *int var pf *float64 var pb *bool //结构体指针 type Person struct { name string age int } var pperson *Person 使用 在把指针使用的得心应手之前,首先要熟悉go语言中这两个操作符:*与&。 先说说&。&变量名,表示对变量取地址。&可以理解为一个方法简写,这个方法的唯一参数是变量名,返回值是一个内存地址(即一个指针类型变量)。&的使用如下: //先定义指针 var ps *string //再定义变量 var s str...阅读全文

博文 2019-07-25 19:32:42 玉笛誰家聽落梅

for...range的坑

由于本人是python开发出身,知识浅薄,没有学习过指针、内存之类的知识,如今转为golang,多少都会踩一些指针之类的坑,本章就记录一下自己踩过的相关的坑 当我们用golang写for循环时,一定要注意一个事情,那就是for后面跟的变量每次循环都是同一个指针地址!详情请看代码 package main import ( "fmt" ) func main() { sList := []string{"1", "2", "3"} for _, v := range sList { fmt.Printf("%p \n", &v) } } 输出结果(每次输出的地址都不同,但是三行都是同一个值) 0xc00000e1e0 0xc00000e1e0 0xc00000e1e0 这说明,当Go在运行fo...阅读全文

博文 2019-11-13 23:04:51 更多精彩内容golang for,range的坑yhao917面试题cosWriterC语言指针朱森2018最全的iOS面试题及答案编程新视野2018最全的iOS面试题及答案zweic

从go的channel谈起

先来温故一下channel的概念: Channels are a typed conduit through which you can send and receive values with the channel operator, <-. 一种管道类型,通过<-操作符接收或发送数据,我们通过一个实例来了解一下管道的特性 启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100 初看一下,很容易想到要用channel,话不多说,先看代码 package main import ( "sync" ) var ( wg = sync.WaitGroup{} signalOdd = make(chan b...阅读全文

有关 strings.Builder 内存分配问题?

写到第十一个的时候,就发生了内存分配。为什么会这样? ```go func numAllocs(fn func()) uint64 { defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) var m1, m2 runtime.MemStats runtime.ReadMemStats(&m1) fn() runtime.ReadMemStats(&m2) return m2.Mallocs - m1.Mallocs } func TestStrings_numAllocs(t *testing.T) { // Builder’s inner slice’s capacity: 10 // Builder’s ...阅读全文

载:深入 Go 内存分配超级棒的文章:Go 内存分配器可视化指南

载:深入 Go 内存分配超级棒的文章:Go 内存分配器可视化指南本文译者:coldnight译文原链接:https://github.com/coldnight/go-memory-allocator-visual-guide当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂。一切看起来都像一个神秘的黑盒子。因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥离才能去理解它。我们将通过这篇文章来一层层的剥离这些细节。如果你想学习所有关于 Go 内存分配器的知识,那么这篇文章正适合你。物理内存和虚拟内存每一个内存分配器都需要运行在由底层操作系统管理的虚拟内存空间(Virtual Memory Space)之上。下图是一个物理内存单...阅读全文

博文 2019-12-23 01:33:03 meng_philip123

go并发编程笔记

go语言高级编程笔记 并发编程 一、并发编程的相关概念 1、并发编程概念:使多个任务【程序】可以在同一时间执行以便能够更快的得到结果 2、多元程序:允许操作系统同时运行多个程序,cpu来回切换,缺点:对系统资源进行无限制的抢夺造成程序频繁发生死锁现象 3、串行程序:只能被顺序执行的指令列表 4、并行程序:可以在并行的硬件上执行的并发程序 5、并发程序:被并发的执行的两个或两个以上的串行程序的统称 6、并发系统 7、并发程序的不确定性:没有明确的执行顺序 8、并发程序的内部交互 同步的原则:某个资源同一时刻只能被一个程序占用 同步的作用:避免在并发访问共享资源时可能存在的冲突,以及确保在互相传递数据时能够顺利的接通 二、多进程编程 1、IPC:多进程程序中,程序之间需要互相协作完成任务,而多个...阅读全文

错误处理

Error Handing with Golang Go errors are values. Naming:Error types end in "Error" and error variables start with "Err" or "err". error:程序还可以继续运行,错误可以被修复或丢弃 error是个简单的内建接口 type error interface { Error() string } 自定义error范例 // PathError records an error and the operation and file path that caused it. type PathError struct { Op string // "open", "unli...阅读全文

博文 2020-02-03 19:32:40 吃猪的蛇

10.笔记go语言——并发

10.笔记go语言——并发 goroutine goroutine 是由 Go 运行时环境管理的轻量级线程。 go f(x, y, z) 开启一个新的 goroutine 执行 f(x, y, z) f , x , y 和 z 是当前 goroutine中定义的,但是在新的 goroutine 中运行 `f`。 goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步。sync 提供了这种可能,不过在Go 中并不经常用到,因为有其他的办法。 package main import ( "fmt" "time" ) func say(s string) { for i:= 0; i < 5; i++ { time.Sleep(100* time.Millisecond) fmt...阅读全文

博文 2017-10-02 12:31:02 notbaron

Go语言学习笔记2/2

chap04 并发编程 1.Go语言支持语言级别轻量级别线程,称之为goroutine,由Go语言运行时runtime管理。如下多线程实例: package main import ( "fmt"; "sync"; "runtime" ) var counter int = 0 func Count(lock *sync.Mutex){ lock.Lock() counter++ fmt.Println(counter) lock.Unlock() } func main(){ lock:=&sync.Mutex{} for i:=0;i<10;i++ { go Count(lock) } for { lock.Lock() c:=counter lock.Unlock() runtime....阅读全文

博文 2016-09-08 09:00:49 conanswp

GO-函数学习

函数的声明 go的函数声明通过func这个关键字,params是他的形参设置,result是他的return值 当设置params后调用func必须传入对应函数参数,当设置result后也必须有return,且params和result类型符合声明的 func name(params) (result) { } // 普通函数的声明 func getMax(num1 int, num2 int) (min int, max int) { // 推荐直接赋值给需要return的值 if num1 > num2 { max = num1 min = num2 } else { max = num2 min = num1 } return // 每一个函数必须要有return } 可变参数类型函数...阅读全文

博文 2018-12-02 03:34:40 GGBO0M

Go语言之slice特性

1 slice介绍和说明 golang的数据结构也很多,如List,array,map等,但是有个很特别的数据结构是slice,也叫切片。经常看到很多和数组的定义有关的操作是 make([]string, 10)。那么什么是slice呢?其实slice也算是golang语言特有的数据结构,底层是以数组作为支撑;啥概念呢,就是说在申请一块内存进行数组的存放的时候,slice就像数组对外开放的一扇窗口,让你看到想给你看到的内容。这个比喻还是有些贴切的,但是对于理解slice的内存存储和特性来说还远远不够,在学习一个语言特性的时候,我比较推荐的学习方法是,实践一遍,看看例子,然后再根据自己碰到的问题场景,选择合适的解决方案。那么咱们来看例子和运行结果。2 slice使用例子和特性整数和字符串的sl...阅读全文

博文 2019-01-27 07:34:42 华哥Dean

golang 和 C++ 的内存对齐

内存对齐规则 有效对齐值是固定值和结构体中最长数据类型长度中较小的那个。固定值系统默认为 32 位是 4, 64 位是 8,#pragma pack(n)设置了则是对应的 n。 结构体第一个成员的 offset 为 0,以后每个成员相对于结构体首地址的 offset 都是 min{该成员大小, 有效对齐值}的整数倍,如有需要编译器会在成员之间加上填充字节。 结构体的总大小为 有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。 C++内存对齐 常见类型占用内存大小 类型/编译器 16 位编译器 32 位编译器 64 位编译器 bool 1 1 1 char 1 1 1 char* 2 4 8 int 2 4 4 float 4 4 4 double 8 8 8 long l...阅读全文

博文 2020-05-20 16:45:32 玖零儛

golang面试基础系列-传值&传指针(二)

在 Go 中函数传递参数有传值和传指针两种类型,本文将从细节之处剖析两者的不同。 先看一个demo: package main import ( "encoding/json" "fmt" ) type Girl struct { Name string `json:"name"` DressColor string `json:"dress_color"` } func (g Girl) SetColor(color string) { g.DressColor = color } func (g Girl) GetJson() string { data, _ := json.Marshal(&g) return string(data) } func main() { g := Gir...阅读全文

博文 2019-06-23 19:32:39 热爱coding的稻草

golang 切片在函数传递

背景: 切片当参数传递时,无法append package main func test(a []int){ a=append(a,1,2,3) // print [89 4 5 6 1 2 3] } func main(){ var s []int=[]int{89,4,5,6} test(s) fmt.Println(s) } 原因: go语言中切片是地址传递,test函数添加的1,2,3后被分配了新的地址,s切片还是指向原来的地址,a和s内存地址不一样 image.png 解决方法:推荐方法2 1.在test函数返回新的切片,main函数接受返回结果 package main import "fmt" func test(a []int)(b []int){ b=append(a,1,...阅读全文

博文 2020-06-03 11:33:00 jojo1313

golang问题interface和nil

interface和nil 上菜代码 package main import ( "fmt" ) func main() { var a interface{} // 获取console输入 fmt.Scan(&a) fmt.Println(a) } 输出结果: console -------------------------> 对比代码 package main import "fmt" func main() { var a string fmt.Scan(&a) fmt.Println(a) } 输出结果: console -------------------------> 123 123 问题描述 第一种情况:编译没有报错,可以执行,但是不能输入。 第二种情况:编译没...阅读全文

博文 2018-07-06 18:34:47 Tim_SSS

Go语言实战笔记(二十六)| Go unsafe 包之内存布局

《Go语言实战》读书笔记,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续笔记。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。 unsafe,顾名思义,是不安全的,Go定义这个包名也是这个意思,让我们尽可能的不要使用它,如果你使用它,看到了这个名字,也会想到尽可能的不要使用它,或者更小心的使用它。 虽然这个包不安全,但是它也有它的优势,那就是可以绕过Go的内存安全机制,直接对内存进行读写,所以有时候因为性能的需要,会冒一些风险使用该包,对内存进行操作。 Sizeof函数Sizeof函数可以返回一个类型所占用的内存大小,这个大小只有类型有关,和类型对应的变量存储的内容大小无关,比如bool型占用一个字节、int8也占用一个...阅读全文

博文 2017-08-30 02:02:19 飞雪无情

golang chanel

golang 推荐通过消息来共享内存,而不是通过共享内存来通信 chanel 是一等公民可以作为函数参数,函数返回值 chanel 必须有接受者,否则会deadlock func worker(id int, c chan int) { fmt.Println(123) // for n := range c { // fmt.Printf("Worker %d received %c\n", // id, n) // } } func chanDemo() { channel := make(chan int,3) go worker(0, channel) channel <- 'a' + 0 channel <- 'a' + 1 channel <- 'a' + 2 channel <...阅读全文

Golang 通道,同步等待组 并发爬虫

Golang:通道,同步等待组 并发爬虫 在Go的并发编程中有一句很经典的话:不要以共享内存的方式去通信,而要以通信的方式去共享内存。 在Go语言中并不鼓励用锁保护共享状态的方式在不同的Goroutine中分享信息(以共享内存的方式去通信)。而是鼓励通过channel将共享状态或共享状态的变化在各个Goroutine之间传递(以通信的方式去共享内存),这样同样能像用锁一样保证在同一的时间只有一个Goroutine访问共享状态。 当然,在主流的编程语言中为了保证多线程之间共享数据安全性和一致性,都会提供一套基本的同步工具集,如锁,条件变量,原子操作等等。Go语言标准库也毫不意外的提供了这些同步机制,使用方式也和其他语言也差不多。 image WaitGroup WaitGroup,同步等待组。...阅读全文

博文 2020-01-14 03:32:41 鬼子口音

兄弟连区块链培训之Go语言学习获取命令行参数

“区块链+时代无疑会是下一个风口,然而现在的区块链行业专业型人才正在遭遇瓶颈”兄弟连教育区块链学院院长尹成表示,“希望能通过兄弟连教育区块链培训学院为社会为企业培养并输送更多优质的区块链高精尖型技术人才。 部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?可以使用flag库和os库。 1.flag库的使用 Go语言标准库提供了用于快迅解析命令行参数的flag包,大致的使用步骤如下: a.通过flag.String(),flag.Bool(),flag.Int()等方式来定义命令行中需要使用的参数。 b.在定义完flag后,通过调用flag.Parse()来进行对命令行参数的解析。 c.获取flag.String(),flag.Bool(),fla...阅读全文

博文 2018-08-15 14:35:23 兄弟连区块链培训

[GO语言]Golang String字符串的操作大全

字符串是不可变值类型,内部用指针指向 UTF-8 字节数组。 • 默认值是空字符串 ""。 • 用索引号访问某字节,如 s[i]。 • 不能用序号获取字节元素指针,&s[i] 非法。 • 不可变类型,无法修改字节数组。 • 字节数组尾部不包含 NULL。 使用索引号访问字符 (byte)。 package main func main() { s := "abc" println(s[0] == '\x61', s[1] == 'b', s[2] == 0x63) } 输出结果: true true true 使用 " ` " 定义不做转义处理的原始字符串,支持跨行。 package main func main() { s := `a b\r\n\x00 c` println(s) } 输...阅读全文

博文 2020-05-15 17:38:35 小龙in武汉

Golang切片slice

切片slice 其本身并不是数组,它指向底层的数组 package main import ( "fmt" ) func main() { var s1 []int //这样的话就完成了slice的声明,如果是数组的话,必须在中括号当中必须有明确的数字或3个点 fmt.Println(s1) } 作为变成数组的替代方案,可以关联底层数组的局部或全部 package main import ( "fmt" ) func main() { var s1 []int //这样的话就完成了slice的声明,如果是数组的话,必须在中括号当中必须有明确的数字或3个点,这是个空slice a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0} fmt.Println(s1) ...阅读全文

博文 2017-09-30 14:30:01 skymyyang

10 Go 并发编程

Go 并发编程 选择 Go 编程的原因可能是看中它简单且强大,那么你其实可以选择C语言;除此之外,我看中 Go 的地方还有原生支持并发编程,对于开发网络编程有着一定的优势,实际上很多地方也谈到,Go 目前是作为云编程的最为流行的编程语言。Go 从语法层面支持并发编程,这可能是其他语言不多见的地方。其实,无所谓孰优孰劣,关键是你如何应用。 在谈并发编程之前,似乎需要知道什么是并发编程,为什么要并发编程? 并发程序指立即可以对多个任务进行的程序,注意这里是立即而非同时,同时处理多个任务,通常叫并行。如何理解立即呢?假定A、B、C三个人在快餐店排队点餐准备吃饭,如果快餐店接到A的订单,告诉A受到订单,并不理会B,C,而是等A的订单完成后,对A结账处理,再依次服务B和C。这种模式叫顺序式或者说独占式...阅读全文

博文 2018-12-23 19:34:42 PRE_ZHY

FileHeader contains filtered or unexported fields

golang 处理文件上传的时候会用到 http.Request.FormFile() func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) 直接查godoc 的文档 FileHeader 是这样描述的 type FileHeader struct { Filename string Header textproto.MIMEHeader Size int64 // contains filtered or unexported fields } 这个注释 contains filtered or unexported fields 是什么?? 查看源码发下,这个文档中少说明...阅读全文

博文 2019-02-20 23:34:43 cc180912

golang-接口

Go语言规定,只要实现了接口里面的方法,就是该接口的实现类 接口变量里面有什么? 实现者的类型 和 实现者的指针 接口变量自带指针 接口变量同样采用值传递,几乎不需要使用接口的指针 指针接收者实现只能以指针方式使用;值接收者都可以用 定义一个接口 package main import ( "fmt" "interfaces/mock" "interfaces/real" "time" ) /** Go语言规定,只要实现了接口里面的方法,就是该接口的实现类 接口变量里面有什么? 实现者的类型 和 实现者的指针 接口变量自带指针 接口变量同样采用值传递,几乎不需要使用接口的指针 指针接收者实现只能以指针方式使用;值接收者都可以用 。。。。 type Retriever struct {} ty...阅读全文

博文 2019-12-17 22:32:42 爱吃豆包

Golang并发编程

在Go语言中,语言本身就已经实现和支持了并发, 我们只需要通过go关键字来开启goroutine即可。 gouroutine其实就是一种协程,类似其他语言中的coroutine, 是在编译器或虚拟机层面上的多任务。它可以运行在一个或多个线程上,但不同于线程,它是非抢占式的,所以协程很轻量。 func main() { for i := 0; i < 1000; i++ { go func(ii int) { for { fmt.Printf("Hello %d\n", ii) } }(i) } time.Sleep(time.Millisecond) } 上述代码就开启了1000个协程,在1ms内不断的打印字符串,这里需要注意两个点: time.Sleep 在main函数退出前,Sleep了...阅读全文

博文 2019-01-14 19:34:43 java高并发

Golang指针初探

初次接触Golang语言,对Go的了解暂时还比较局限。 在这里对Go指针进行了简单学习,感觉跟之前学的C指针是差不多的。 Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。 在地址前加上*则是取相应地址相关值的操作。 练习代码如下: package main import "fmt" func main() { var a int = 10 var b string = "hello world" var c bool = true var d float32 = 0.002 var e float64 = 0.00000003 fmt.Printf("a变量的地址: %x,a的值为:%d\n", &a,*&a) fmt.Printf("变量的地址: %x\n", &...阅读全文

博文 2018-07-06 01:34:47 我去买个大橘子

golang基础--控制语句

go基础之控制语句 补充知识 指针 与其他语言不同,在Go中不支持指针运算即->运算符,而直接采用.选择符来操作指针目标对象的成员。 操作符&取变量的地址,使用*通过指针间间接访问目标对象 默认值位nil,而非NULL 实例代码如下 //指针的使用 package main import "fmt" func main() { a := 1 //定义一个变量,类型位int a++ //必须单独放一行 var p *int = &a // 指针p指向a的内存地址 fmt.Println(p) //访问p fmt.Println(*p) //取p内存地址指向的值 } 运行结果 shell 0xc04200e0b8 //内存地址 2 //地址指向的值 判断if控制语句 条件表达式没有括号 支持一个...阅读全文

博文 2018-07-12 13:30:39 failymao

Go语言之Once

自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/DRjuGDwE04f0Yy9QvpYufAsync.Once是sync包中的一个对象,它只有一个方法Do,这个方法很特殊,在程序运行过程中,无论被多少次调用,只会执行一次。1.适用场景:在一个进程之中,如果一个函数里面的一部分代码,希望在很多协程都执行的时候,只被执行一次,那么Once便起到了作用。例如:初始化进程中的共享内存,它只希望被该进程初始化一次,其他协程不需要初始化操作。例子: 结果分析:从上面的输出结果可以看出,使用了once.Do之后,onceBody()函数中的代码植被调用了一次。其他的协程依然还在运行,但是并没有去执行onceBody()函数中的代码。2. 源码如下所示:Once的数据...阅读全文

博文 2019-12-23 17:33:01 灰常出色

Go语言入门(一)

Go语言入门(一) Go语言简介 官方介绍 Google推出的一门编程语言 开源编程语言,结构简单,可靠,高效 Go语言的主要开发者 2007年有Robert Griesemer,Rob Pikle,Ken Thompson主持开发 2009年11月开源 Go语言的特点 简洁,快速,安全 并发,开源 内存管理,数据安全,编译迅速 跨平台 Go语言环境安装 安装步骤如下 下载地址: https://studygolang.com/dl 根据平台安装不同的安装包 安装路径不要出现中文 开发环境 Goland: 破解方法参考(https://www.cnblogs.com/zhangguosheng1121/p/11448194.html) Vscode 第一个Go语言程序 helloworld ...阅读全文

博文 2020-02-29 22:33:11 wx5b285b48ed74e

golang slice和string重用

相比于 c/c++,golang 的一个很大的改进就是引入了 gc 机制,不再需要用户自己管理内存,大大减少了程序由于内存泄露而引入的 bug,但是同时 gc 也带来了额外的性能开销,有时甚至会因为使用不当,导致 gc 成为性能瓶颈,所以 golang 程序设计的时候,应特别注意对象的重用,以减少 gc 的压力。而 slice 和 string 是 golang 的基本类型,了解这些基本类型的内部机制,有助于我们更好地重用这些对象 slice 和 string 内部结构 slice 和 string 的内部结构可以在 $GOROOT/src/reflect/value.go 里面找到 type StringHeader struct { Data uintptr Len int } type...阅读全文

博文 2018-11-27 18:34:42 Chole121

golang中slice的注意事项

1. slice本质上是基于数组的一种数据结构(struct),是数组的一种透视。 2. slice的数据结构为: ```go type slice struct { array unsafe.Pointer len int cap int } ``` 请注意, array是一个指针类型。 3. slice作为数组的一部分透视来使用: ```go testArr := [5]int{0, 1, 2, 3, 4} sliceFromArr := testArr[1:3] fmt.Println(sliceFromArr) // [1, 2] sliceFromArr[0] = 11 fmt.Println(testArr) //[0 11 2 3 4] fmt.Printf("len: %d,...阅读全文

有点不安全却又一亮的 Go unsafe.Pointer

有点不安全却又一亮的 Go unsafe.Pointer 在上一篇文章《深入理解 Go Slice》中,大家会发现其底层数据结构使用了 unsafe.Pointer。因此想着再介绍一下其关联知识 前言 在大家学习 Go 的时候,肯定都学过 “Go 的指针是不支持指针运算和转换” 这个知识点。为什么呢? 首先,Go 是一门静态语言,所有的变量都必须为标量类型。不同的类型不能够进行赋值、计算等跨类型的操作。那么指针也对应着相对的类型,也在 Compile 的静态类型检查的范围内。同时静态语言,也称为强类型。也就是一旦定义了,就不能再改变它 错误示例 func main(){ num := 5 numPointer := &num flnum := (*float32)(numPointer) f...阅读全文

博文 2019-03-26 09:31:44 EDDYCJY

时序数据库 InfluxDB(四)

相关文章:时序数据库 InfluxDB(一)时序数据库 InfluxDB(二)时序数据库 InfluxDB(三)时序数据库 InfluxDB(四)时序数据库 InfluxDB(五)时序数据库 InfluxDB(六) 存储引擎 InfluxDB 数据的写入如下图所示: 所有数据先写入到 WAL( Write Ahead Log )预写日志文件,并同步到 Cache 缓存中,当 Cache 缓存的数据达到了一定的大小,或者达到一定的时间间隔之后,数据会被写入到 TSM 文件中。 为了更高效的存储大量数据,存储引擎会将数据进行压缩处理,压缩的输入和输出都是 TSM 文件,因此为了以原子方式替换以及删除 TSM 文件,存储引擎由 FileStore 负责调节对所有 TSM 文件的访问权限。 Comp...阅读全文

Golang面试之Linux系统

参考 深入理解Linux的CPU上下文切换 CPU上下文切换 Linux 是一个多任务操作系统,它支持同时运行的任务数量远大于 CPU 个数。其实这些任务没有真正的同时运行,是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、从哪里开始运行,需要系统事先设置好 CPU 寄存器和程序计数器。CPU 寄存器是 CPU 内置的容量小、速度极快的内存。而程序计数器则是用来存储 CPU 正在执行的指令位置、或即将执行的下一条指令位置。它们都是 CPU 在运行任务前必须依赖的环境,也被叫做 CPU 上下文。 上下文切换,就是先把前一个任务的 CPU 上下文保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳...阅读全文

博文 2020-05-08 23:32:45 网管同学

2019-07-30

进程 线程 进程是操作系统提供给我们的一个抽象;我们通过创建进程来使用CPU、读写内存/硬盘、进程IO操作。 每个进程最少会有一个线程,通过线程来执行命令,进程下可以通过创建多个线程来加速执行速度,进程下的线程共享进程的各种资源,包括内存,IO等。 线程共享内存带来了方便,但同时共享导致了竞态资源问题;为了解决这个问题,操作系统提供了 Mutex - Mutual Exclusion 互斥锁,降低性能解决共享带来的问题。 线程 协程 当我们创建线程的时候需要 系统调用,内核会创建一个新的线程,这个线程通过操作系统来进行调度。 协程,又叫做用户态线程,顾名思义,是在用户空间创建的线程,golang取消线程,使用协程来替代。 协程相比线程,优点在于占用内存空间小,可以无限制创建;因为是用户进程自...阅读全文

博文 2019-07-30 22:32:42 小程有话说

go 内存管理

内存分配步骤 go 给对象分配内存的主要流程: object size > 32K,则使用 mheap 直接分配。 object size < 16 byte,使用 mcache 的小对象分配器 tiny 直接分配。 (其实 tiny * 就是一个指针,暂且这么说吧。) object size > 16 byte && size <=32K byte 时,先使用 mcache 中对应的 size class 分配。 如果 mcache 对应的 size class 的 span 已经没有可用的块,则向 mcentral 请求。 如果 mcentral 也没有可用的块,则向 mheap 申请,并切分。 如果 mheap 也没有合适的 span,则向操作系统申请。 关键数据结构 mcache 我...阅读全文

博文 2019-12-10 17:33:14 斜不靠谱