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

Golang数组Array和切片slice使用

数组 数组在go语言中为值类型 数组之间可以用= =或!=比较,但是数组长度也是类型的一部分,因此不同长度的数组为不同的类型,如下,这是两个不同类型,因为数组长度不一样,不能用==或!=比较= = 下面ap和at数组是不同类型 ap:=[5]int{3:2}//下标3的值赋值为2 at:=[6]int{} 数组遍历 //数组遍历,i是数组当前下标,p是当前下标对应的值,i可以用_下划线代替,表示忽略 as := [3]int{1, 2, 3} for i, p := range as { f.Println(i, "---", p) pa[i] = &as[i] } //还可以常用的遍历循环 le:=len(as) for i:=0;i阅读全文

博文 2017-09-30 09:35:17 Link_Biao

《Go编程基础》

《Go编程基础》是一套针对 Google 出品的Go语言的视频语音教程,主要面向新手级别的学习者。 * 第1课:[Go开发环境搭建](https://github.com/Unknwon/go-fundamental-programming/blob/master/lectures/lecture1.md)([土豆网](http://www.tudou.com/programs/view/hlDq2A0vNes/) [优才网](http://www.ucai.cn/course/chapter/69/3210/4555) [网易云课堂](http://study.163.com/course/courseLearn.htm?courseId=306002#/learn/video?les...阅读全文

开源项目 2013-04-13 16:00:00 Unknwon

Go语言_range(范围)理解

一、Go语言中的range Go 语言中 range 关键字用于 for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素; 在数组和切片中它返回元素的索引值, 在集合中返回 key-value 对的 key 值。 二、代码举例 package main import "fmt" func main() { //这是我们使用range去求一个slice的和。使用数组跟这个很类似 nums := []int{2, 3, 4} sum := 0 for _, num := range nums { sum += num } fmt.Println("sum:", sum) //在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使...阅读全文

博文 2018-07-26 00:30:00 OctoptusLian

golang slice

#slice append 实现 s2 := append(s1, *) 切片s1上记录的切片信息复制给s2, 1.如果s1指向的底层array长度不够,append的过程会发生如下操作:内存中不仅新开辟一块区域存储append后的切片信息,而且需要新开辟一块区域存储底层array(复制原来的array至这块新array中),最后再append新数据进新array中,这样,s2指向新array。 2.如果s1指向的底层array长度够, s2和s1指向同一个array,append的结果是内存中新开辟一个区域存储新切片信息。 开辟一块区域存储底层array 使用下面的策略: 1.如果 增加的 len < s的cap 则 新s的cap*2 2.如果 增加的 len > s的cap 则 新s的c...阅读全文

博文 2017-09-21 09:33:13 1071954237

使用gofmt格式化代码

对于一门编程语言来说,代码格式化是最容易引起争议的一个问题,不同的开发者可能会有不同的编码风格和习惯,但是如果所有开发者都能使用同一种格式来编写代码,开发者就可以将宝贵的时间专注在语言要解决的问题上。 gofmt介绍 Golang的开发团队制定了统一的官方代码风格,并且推出了gofmt工具(gofmt或go fmt)来帮助开发者格式化他们的代码到统一的风格。gofmt是一个cli程序,会优先读取标准输入,如果传入了文件路径的话,会格式化这个文件,如果传入一个目录,会格式化目录中所有.go文件,如果不传参数,会格式化当前目录下的所有.go文件。 gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能,具体来说会进行如下的转换: 去除数组、切片、Map初始化时不必要的类型声明: 如下形...阅读全文

博文 2018-07-17 13:34:43 simpleapples

golang slice 排序

如下示例为,在一个Person切片中,按年龄大小进行排序 package main import ( "fmt" "sort" ) /*slice 排序示例*/ type Person struct { Age int } type PersonSlice []Person func (s PersonSlice) Len() int { return len(s) } func (s PersonSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s PersonSlice) Less(i, j int) bool { return s[i].Age < s[j].Age } func main() { persons := Pe...阅读全文

博文 2018-11-13 22:34:39 小风吹的我乱了

【golang】切片添加和删除一个元素

前言 在做leetcode熟悉语法的时候,需要对一个切片进行操作。删除操作还好,go圣经有提到,但是增加元素就让我抓了个狂。最后在同事帮助下找到了合适的语法。 正文 -删除元素 l := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} newL := append(l[0:5], l[6:]...) -增加元素 l := []int{0, 1, 2, 3, 4, 6, 7, 8, 9} newL := append(l[0:5], append([]int{5}, l[5:]...)......阅读全文

博文 2019-10-15 20:33:44 aside section ._1OhGeD

golang开发流程及注意事项

golang开发流程及注意事项 1、开发流程 1.1. 复杂框架类服务架构流程 明确整个业务流程 划分独立处理模块,弄清楚那些模块会出现并发 明确基本数据结构 a、request b、response c、error错误处理 抽象接口 针对接口编程,我们必须的定义好每一个环节的接口,这里有一个点必须的注意:就是我们在实现接口的时候,NewXXX()获取实现结构类型的返回值必须是借口对象,便于统一处理 明确调度器的职责 中间件 a、各个独立模块之间如何通信,如何统一管理各个木块之间的通道,通道管理器 b、如何让各个独立模块统一听从调度器的调度,停止信号处理器、contex包的使用 c、独立模块的管理和限流,实体池 d、统一的实体标记管理,Id生成器 注意:这里有一个限流的问题,一般情况下,我们...阅读全文

博文 2019-01-18 15:34:51 yongfutian

golang json库gjson的使用

官方的json库, 只支持整体的序列化与反序列化. 像其它语言的库, json库都支持单个getValue/setValue这类操作. 找了下golang相关的开源json库, GJSON star数不错,支持的查询功能很丰富. 但是没有写入接口. 找了一圈也没有 找到有写入功能的json库. 能想到的只有定义类型序列化或map序列化了. 以下是正文, 翻译自项目readme: 开始 开始使用GJSON之前, 先安装Go, 然后运行go get: $ go get -u github.com/tidwall/gjson 获取值 Get查询指定路径, 通过.来区分. 比如"name.last"或者"age". 如果找到了匹配路径, 将返回结果. package main import "git...阅读全文

博文 2018-07-09 17:34:54 最近不在

(Go)不要使用append插入元素

标题好像有点唬人哦…. 起因是我在给Slice做Insert函数,给几个版本封装时做了一些性能测试。结果出人意料! import ( "fmt" "reflect" "time" ) func copyInsert(slice interface{}, pos int, value interface{}) interface{} { v := reflect.ValueOf(slice) v = reflect.Append(v, reflect.ValueOf(value)) reflect.Copy(v.Slice(pos+1, v.Len()), v.Slice(pos, v.Len())) v.Index(pos).Set(reflect.ValueOf(value)) retur...阅读全文

博文 2016-11-22 04:00:05 Begosu

go语言测试----切片删除

package main import ( "fmt" "math/rand" //"time" ) func main() { vect := make([]int, 100000) for i, _ := range vect { vect[i] = i } for i := 0; i < 10; i++ { k := rand.Intn(100000) //这里有可能会有重复的值,但我们假定有10个不同的值 vect[k] = -1 } for i, v := range vect { if v == -1 { //当V=-1时,假定是不需要的数据 vect = append(vect[:i], vect[i+1:]...) } } //测试一下 for i, v := range v...阅读全文

博文 2015-06-17 23:05:44 zistxym

Go语言中不同类型切片之间的相互转换

将 []T 切片转换为 []byte 类似C语言中将其他类型的数组转换为char数组: func ByteSlice(slice interface{}) (data []byte) { sv := reflect.ValueOf(slice) if sv.Kind() != reflect.Slice { panic(fmt.Sprintf("ByteSlice called with non-slice value of type %T", slice)) } h := (*reflect.SliceHeader)((unsafe.Pointer(&data))) h.Cap = sv.Cap() * int(sv.Type().Elem().Size()) h.Len = sv.Len...阅读全文

博文 2015-05-12 21:00:03 chai2010

如何快速的随机从 map 中返回一个值

前言 本文翻译自 lukechampine.com/hackmap.htm… go 的 map 源码解析都会引用的一片文章。 第一部分:问题 从一个切片中随机的获取一个值是非常简单的,可以使用map.Int(n),这样就可以从[0,n)中随机的返回一个值,从而可以从切片中随机的返回一个元素 func randSliceValue(xs []string) string { return xs[rand.Intn(len(xs))] } 复制代码这个方法是非常好的,因为耗费的时间和内存都是O(1)的。但是呢,对于 map 而言,没有简单并且等效的方式来做到随机从 map 中获取一个值。我们获取 map 中的数据有两种方式,取值(e.g. m["foo"])或者range。所以,如何根据这两种方...阅读全文

博文 2020-05-05 23:34:25 胡大海

GoLang 字符串处理大全

GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 欢迎加入: 高级运维工程师之路 598432640 任何一门语言都有它的好处,Golang的长处就是在于它的高并发能力,所以现在练习好Golang的用法,有利于你找一份好的工作哟~在学习任何一本语言,它的基本数据类型我们应该都得熟记于心,今天我们处理的主角就是字符串。让我们一起看看Golang对字符串的用法吧。我们此处主要针对strings这个包的某些方法的用法做演示。 1.Contains 1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/ta...阅读全文

博文 2017-09-30 09:30:01 yinzhengjie

golang大量字符串拼接方法

虽然方便,但是使用+=操作符并不是在一个循环中往字符串末尾追加字符串最有效的方式,一个有效的方式是准备好一个字符串切片([]string),然后使用strings.Join()函数一次性将所有字符串串联起来。但是在go中还有一个更好的方法,其原理类似于java中的stringBuilder package main import ( "bytes" "fmt" ) func main() { var buffer bytes.Buffer //Buffer是一个实现了读写方法的可变大小的字节缓冲 for { if piece, ok := getNextString(); ok { /* func (b *Buffer) WriteString(s string) (n int, err e...阅读全文

博文 2018-01-04 22:33:04 coder_kev

来自老司机golang面试官的经验分享:面试你很大几率会遇到的go语言面试题

正在准备golang面试的小伙伴,很荣幸,你能看到这篇文章,希望每一个看到这篇分享的小伙伴都能找到自己称心如意的工作!​ 编程语言类:Go是什么?使用Go编程有什么好处?Go支持类型继承吗?Go支持运营商超载吗?Go支持方法重载吗?Go支持指针算术吗?Go支持通用编程吗?Go是一个区分大小写的语言吗?Go中变量的静态类型声明是什么?Go中变量的动态类型声明是什么?你能在Go中的单个声明中声明多种类型的变量吗?如何在Go中打印变量的类型?什么是指针?break语句的目的是什么?继续声明的目的是什么?goto语句的目的是什么?解释'for'循环的语法。解释在Go中创建函数的语法。你能从函数中返回多个值吗?您可以将参数传递给方法的方式有多少?将参数传递给函数的默认方式是什么?Go中的函数作为值是什...阅读全文

博文 2019-04-10 23:34:41 QFdongdong

golang 字典map

当在哈希表中查找某个与键值对应的元素值时,我们需要先把键值作为参数传给这个哈希表。哈希表会先用哈希函数(hash function)把键值转换为哈希值。  哈希值通常是一个无符号的整数。一个哈希表会持有一定数量的桶(bucket),也可称之为哈希桶,这些哈希桶会均匀地储存其所属哈希表收纳的那些键-元素对。  因此,哈希表会先用这个键的哈希值的低几位去定位到一个哈希桶,然后再去这个哈希桶中,查找这个键。由于键-元素对总是被捆绑在一起存储的,所以一旦找到了键,就一定能找到对应的元素。  随后,哈希表就会把对应的元素值作为结果返回。只要这个键-元素对存在于哈希表中就一定会被查找到,因为哈希表增、改、删键-元素对时候的映射过程,跟上面描述的一样。  也就是说,字典map不会独立存储任何键的值,但会独...阅读全文

博文 2018-09-27 23:34:42 one_zheng

Go语言切片的用法和本质

Go 切片:用法和本质 原文链接 http://blog.golang.org/go-slices-usage-and-internals 引言 Go的切片类型为处理同类型数据序列提供一个方便而高效的方式。 切片有些类似于其他语言中的数组,但是有一些不同寻常的特性。 本文将深入切片的本质,并讲解它的用法。 数组 Go的切片是在数组之上的抽象数据类型,因此在了解切片之前必须要先理解数组。 数组类型定义了长度和元素类型。例如, [4]int 类型表示一个四个整数的数组。 数组的长度是固定的,长度是数组类型的一部分( [4]int 和 [5]int 是完全不同的类型)。 数组可以以常规的索引方式访问,表达式 s[n] 访问数组的第 n 个元素。 var a [4]int a[0] = 1 i :=...阅读全文

博文 2016-04-13 22:00:06 cqbmax

Go new和make的区别 && 数组和切片

Go new和make的区别以及切片的本质 make、new操作 make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。 内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要: new返回指针。 内建函数make(T, args)与new(T)有着不同的功能,make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部arr...阅读全文

博文 2017-02-12 18:00:09 xxggy

实现有序map之go

Go Map介绍 Go 中 Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用链式hash表来实现的。 c++中的实现 在C++ STL 中map 采用红黑树实现,可以实现有序的Map. Go 中实现 实现原理 这个实现方法的主要的方法是用空间换取时间。通过list 和 map 两种数据结构,保存相同的一份数据。list 用来做顺序遍历,map 用来做查找,删除操作 实现代码 package main import ( "container/list" "fmt" ) type Keyer interface...阅读全文

博文 2017-11-06 05:04:41 因心而来

Go代码格式化

对于一门编程语言来说,代码格式化是最容易引起争议的一个问题,不同的开发者可能会有不同的编码风格和习惯,但是如果所有开发者都能使用同一种格式来编写代码,开发者就可以将宝贵的时间专注在语言要解决的问题上。 gofmt介绍   Golang的开发团队制定了统一的官方代码风格,并且推出了gofmt工具(gofmt或go fmt)来帮助开发者格式化他们的代码到统一的风格。gofmt是一个cli程序,会优先读取标准输入,如果传入了文件路径的话,会格式化这个文件,如果传入一个目录,会格式化目录中所有.go文件,如果不传参数,会格式化当前目录下的所有.go文件。   gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能,具体来说会进行如下的转换: 去除数组、切片、Map初始化时不必要的类型声明:...阅读全文

博文 2019-02-27 20:34:42 北春南秋

golang bytes buffer代码剖析

//上数据结构,bytes Buffer type Buffer struct { buf []byte // byte切片 off int // 从&buf[off]地址读数据, 从&buf[len(buf)]地址写数据 runeBytes [utf8.UTFMax]byte // avoid allocation of slice on each WriteByte or Rune bootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation. lastRead readOp // last read operation, so that Unread* ca...阅读全文

博文 2015-10-25 17:00:02 webyh

Go 语言 bufio 包介绍

[原文链接](https://medium.com/golangspec/introduction-to-bufio-package-in-golang-ad7d1877f762) [bufio](https://golang.org/pkg/bufio/) 用来帮助处理 [I/O 缓存](https://www.quora.com/In-C-what-does-buffering-I-O-or-buffered-I-O-mean/answer/Robert-Love-1)。 我们将通过一些示例来熟悉其为我们提供的:Reader, Writer and Scanner 等一系列功能 ## bufio.Writer 多次进行小量的写操作会影响程序性能。每一次写操作最终都会体现为系统层调用,频繁...阅读全文

博文 2017-12-04 08:18:54 jliu666

golang中的三个点 '...' 的用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jeffrey11223/article/details/79166724 ‘…’ 其实是go的一种语法糖。 它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数。 第二个用法是slice可以被打散进行传递。 下面直接上例子: func test1(args ...string) { //可以接受任意个string参数 for _, v:= range args{ fmt.Println(v) } } func main(){ var strss= []string{ "qwr", "234", "yui", "cvbc", } test1(strss...) //切片...阅读全文

博文 2018-12-06 19:31:35 jeffrey11223

Go 小知识之 Go 中如何使用 set

今天来聊一下 Go 如何使用 set,本文将会涉及 set 和 bitset 两种数据结构。 # Go 的数据结构 Go 内置的数据结构并不多。工作中,我们最常用的两种数据结构分别是 slice 和 map,即切片和映射。 其实,Go 中也有数组,切片的底层就是数组,只不过因为切片的存在,我们平时很少使用它。 除了 Go 内置的数据结构,还有一些数据结构是由 Go 的官方 container 包提供,如 heap 堆、list 双向链表和ring 回环链表。但今天我们不讲它们,这些数据结构,对于熟手来说,看看文档就会使用了。 我们今天将来聊的是 set 和 bitset。据我所知,其他一些语言,比如 Java,是有这两种数据结构。但 Go 当前还没有以任何形式提供。 # 实现思路 先来看一篇...阅读全文

博文 2019-06-02 15:42:39 poloxue

GOLANG 1.9 语言规范

简介 本文是GO语言的使用手册。对于更多的信息,请前往 golang.org。 GO 语言是一门通用的系统编程语言。它是一种强类型语言,支持自动垃圾收集,并且对语言层面对并发编程进行了支持。GO 程序以包的形式进行组织,对程序间的依赖关系进行高效的管理。当前实现方式使用传统的编译/链接模型生成二进制可执行文件。 GO语言语法紧凑且规范,故而便于如集成开发环境这样的自动化工具对其进行分析。 标识符 语法使用扩展的巴科斯范式(EBNF)描述: Production = production_name "=" [ Expression ] "." . Expression = Alternative { "|" Alternative } Alternative = Term { Term } ....阅读全文

博文 2017-09-02 07:32:15 u013148156

golang包sql查询结果树形化反射扫描器

### 主要功能 > 可以搭配gorm的sql结果扫描函数Scan、Find等,将结果直接传入本包提供的树形化函数(ScanToTreeData),快速实现树形化 > 支持无限级树形化(自己嵌套自己)、有限级个性化树形化 > github 仓库地址,欢迎使用,反馈使用意见,顺便点点 star https://github.com/qifengzhang007/sql_res_to_tree ### 核心代码段 ```code // 接受树形结果的结构体要求如下: // 1.主键必须使用 primaryKey:"yes" 标签定义,类型必须是 int int64 in32 等int系列,不能使用 string 等其他类型...阅读全文

开源项目 2021-02-22 00:04:16 张三丰

Go bytes包

Go bytes包 bytes包基本方法的使用 package main import ( "bytes" ) func writeUInt16(buff []byte, data uint16) { for i := 0; i < 2; i++ { buff[i] = byte(data >> uint(i*8)) } } func spilt(r rune) bool { if r == 'c' { return true } return false } func main() { println("hello world") buff1 := make([]byte, 2) // 创建一个切片 writeUInt16(buff1, uint16(12)) buff2 := make(...阅读全文

博文 2017-02-10 08:00:40 xxggy

Go 实现洗牌算法

shuffle算法,我把它叫做洗牌算法因为他和我们洗扑克牌的方式很像,它的目标正好与各种的sort算法相反,即把一个有序(或者无序)的一系列元素打乱,以满足需求。 如果你是python或者ruby程序员可能你觉得很简单,因为他们在语言层面上实现了很多很方便的函数,然而Go语言要想打乱数组或者切片中数据的顺序,需要自己实现的。 Ruby中有一个叫shuffle的方法: Ruby array = [1, 2, 3, 4, 5] array.shuffle # shuffles the array! 12 array = [1, 2, 3, 4, 5] array.shuffle # shuffles the array! Python也同样非常的简单: Python import random ...阅读全文

博文 2017-07-11 02:02:43 谢权

深入理解golang — 数组(array)、切片(slice)、map

我比较喜欢先给出代码,然后得出结论 数组 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 arr := [...]int{1, 2, 3} 9 //打印初始的指针 10 fmt.Printf("the pointer is : %p \n", &arr) 11 printPointer(arr) 12 } 13 14 func printPointer(any interface{}) { 15 fmt.Printf("the pointer is : %p \n", &any) 16 } 结果 1 the pointer is : 0xc082008580 2 the pointer is : 0xc0820001d0...阅读全文

博文 2014-10-05 08:24:15 aqsmoke

GoLang练习实例100之001----切片转换为Map

package main import "fmt" //切片转换为Map func slice_To_Map(s_key, s_value []string) (map[string]string) { mapObj := map[string]string{} for s_key_index := range s_key { mapObj[s_key[s_key_index]] = s_value[s_key_index] } return mapObj } func main() { s_key := []string{"a", "b", "c", "d", "e"} s_value := []string{"1", "2", "3", "4", "5"} r_map := slice_...阅读全文

博文 2018-03-20 00:33:04 不折腾难受斯基

【原创】golang读取xls写入到xlsx中

前一段时间想要用golang读取xls文件里的数据,并写入到xlsx中,xls的读写国内网上的教程鲜有能参考的,因此将自己的处理的过程整理了下供需要的小伙伴们参考,由于是初学golang,水平有限,欢迎大家批评指正。 test.xls里的数据 package main import ( "log" "os" "github.com/extrame/xls" "github.com/tealeg/xlsx" ) var xlsxTitle = []string{"字段1", "字段2", "字段3", "字段4"} var cell *xlsx.Cell func main() { pwd, _ := os.Getwd() targetPath := pwd + `\result.xlsx` ...阅读全文

博文 2020-01-16 09:32:43 逢高_4882

golang fmt占位符

golang fmt格式“占位符” qing123 · 2015-03-21 03:00:01 · 43307 次点击 · 预计阅读时间 2 分钟 · 大约1分钟之前 开始浏览 这是一个创建于 2015-03-21 03:00:01 的文章,其中的信息可能已经有所发展或是发生改变。 golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。 定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式。 Printf("%v", people) {zhangsan}, %+v 打印结构体时,会添加字段...阅读全文

博文 2018-07-14 18:30:00 Csir

Go 反射:根据类型创建对象-第二部分(复合类型)

> 这是关于 Golang 中根据类型创建对象系列博客的第二篇,讨论的是创建复合对象。第一篇在[这里](https://studygolang.com/articles/12434) ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-reflect/cover1.png) 在前一篇博客中,我解释了 go reflect 包 `type` 和 `kind` 的概念。这篇博客,我将深入探讨这些术语。因为相比原始类型,`type` 和 `kind` 对于复合类型来说含义更多。 ## 类型和种类 “类型” 是程序员用来描述程序中数据和函数的元数据。`type` 在 Go 的运行时和编译器中有不同的含义。 可...阅读全文

博文 2018-03-09 09:18:56 polaris

GO语言变量逃逸分析

引言 内存管理的灵活性是让C/C++程序猿们又爱又恨的东西,比如malloc或new一块内存我可以整个进程使用。但是,如果这块内存在某个函数中new了,但是暂时不能释放那就是悲剧开始了。鬼知道何时释放合适及是不是我还记得我new过它。所以后来很多语言都限制了内存管理或者优化了内存管理机制,添加gc机制来“辅助”程序猿们编程。变量分配在堆上还是栈上不是由是否new/malloc决定,而是通过编译器的“逃逸分析”来决定。什么是逃逸分析 在编译程序优化理论中,逃逸分析是一种确定指针动态范围的方法——分析在程序的哪些地方可以访问到指针。也是就是说逃逸分析是解决指针作用范围的编译优化方法。编程中常见的两种逃逸情景: 1,函数中局部对象指针被返回(不确定被谁访问) 2,对象指针被多个子程序(如线程 协程...阅读全文

博文 2019-07-09 21:32:41 空格键_11aa

Go中字符串的遍历

首先说一下go中的字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。 Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题不会再困扰程序员。 字符串一旦赋值了,字符串就不能修改了:在Go中字符串是不可变的。 下面介绍字符串的三种遍历方式,根据实际情况选择即可。 常规遍历方式: var str = "Hello world!" for i := 0; i < len(str); i++ { fmt.Printf("str[%d]=%c\n", i, str[i]) } 运行结果: image 该遍历方式==缺点==:遍历...阅读全文

博文 2018-07-16 20:34:48 波涛澎湃

Go 语言机制之数据和语法的设计哲学(Design Philosophy On Data And Semantics)

## 前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针、栈、堆、逃逸分析和值或者指针传递。这是最后一篇,重点介绍在代码中使用值和指针的数据和语义的设计哲学。 以下是本系列文章的索引: 1. [Go 语言机制之栈与指针](https://studygolang.com/articles/12443) 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) 3. [Go 语言机制之内存剖析](https://studygolang.com/articles/12445) 4. [Go 语言机制之数据和语法的设计哲学](https://studygolang.com/art...阅读全文

博文 2018-03-04 08:48:15 gogeof

Go 语言在命令行以表格的形式输出结构体切片

刚写的小工具,可以在命令行以表格的形式输出结构体切片 * 表格每列自动对齐 * 支持自动适应列宽 * 结构体的字段支持所有数据类型(字符串,切片,映射等) 例如可以很方便清晰地将数据库查询结果列表(结构体切片)在命令行以表格的形式输出。 项目 Github 主页: 对你有用的话,给个 star 支持一下吧~ ```go package main import ( "fmt" "github.com/modood/table" ) type House struct { Name string Sigil string Motto strin...阅读全文

golang常见面试题

1. 切片与数组对比 (1). 数组 数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。 数组的长度是数组类型的一部分,所以[3]int 和 [4]int 是两种不同的数组类型。 (2). 切片 切片表示一个拥有相同类型元素的可变长度的序列。 切片是一种轻量级的数据结构,它有三个属性:指针、长度和容量。 切块结构如下: type Slice struct { ptr unsafe.Pointer len int cap int } (3). 关系 一个底层数组可以对应多个slice,这些slice可以引用数组的任何位置,彼此之间的元素还可以重叠。 viso1.jpg 2. 结构体 3. interfac...阅读全文

博文 2018-06-28 21:34:44 百味纯净水

golang slice Append

s2 := append(s1, *) 切片s1上记录的切片信息复制给s2,1.如果s1指向的底层array长度不够,append的过程会发生如下操作:内存中不仅新开辟一块区域存储append后的切片信息,而且需要新开辟一块区域存储底层array(复制原来的array至这块新array中),最后再append新数据进新array中,这样,s2指向新array。2.如果s1指向的底层array长度够,s2和s1指向同一个array,append的结果是内存中新开辟一个区域存储新切片信息。开辟一块区域存储底层array 使用下面的策略:1.如果 增加的 len < s的cap 则 新s的cap*22.如果 增加的 len > s的cap 则 新s的cap = 老cap + 增加数据的 le...阅读全文

博文 2014-10-04 19:27:29 咖啡伴侣

golang传值和传引用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyk2396/article/details/78893828 1.定义: b = a; b.modify(); 如果b的修改不会改变a的值,那么是传值;否则,是传引用 2.golang中大多数是传值的,有: 基本类型:byte,int,bool,string 复合类型:数组,数组切片,结构体,map,channnel3.数组: 3.1 传值 func main() { var array = [3]int{0, 1, 2} var array2 = array slice2[2] = 5 fmt.Println(array, array2) }输出结果: [0 1 2] [0 1 5] 3....阅读全文

博文 2019-03-04 17:31:37 cyk2396

Golang多协程并发工作池

本文一个简单的golang工作池,仅供交流和学习使用。golang工作池的作用是可以限制goroutine的启动数量。 //NewTask是放到工作池当中运行的函数。使用的时候需要先实例化他 w := pool.NewTask(func() error { fmt.Println(time.Now());return nil }) //实例化工作池 p := pool.NewPool(3) //这里启用另外一个goroutine向worker当中写入,不然会出现all goroutines are asleep,需要从管道中获得一个数据,而这个数据必须是其他goroutine线放入管道的 go func() { for { p.Worker <- w //把需要运行的函数依次放入工作池。 }...阅读全文

博文 2018-10-07 16:34:39 IT无崖子

gjson

golang中gjson 开始 $ go get -u github.com/tidwall/gjson JSON串 获取值 Get查询指定路径, 通过.来区分. 比如"name.last"或者"age". 如果找到了匹配路径, 将返回结果. 同时有 GetMany 方法批量获取值, 也有 GetBytes 方法获取字节切片. package main import "github.com/tidwall/gjson" const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}` func main() { value := gjson.Get(json, "name.last") println(value.Str...阅读全文

博文 2019-09-29 17:33:07 aside section ._1OhGeD

go语言中字段序列化与反序列化的总结

一、概括 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,现在是主流的数据格式,常用于web开发中前端与后端进行数据交互的一种方式 二、在go中常见的几种序列化成json的方式 1、将结构体序列化成json package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"name"` // 姓名 Age int `json:"age"` // 年龄 Gender string `json:"gender"` // 性别 Score float64 `json:"score"` // 分数 Course []string `json:"cou...阅读全文

博文 2019-12-25 16:34:27 水痕001

go语言将表数据动态转成切片(字段任意拓展)

package main import ( "log" "fmt" "database/sql" _ "github.com/go-sql-driver/mysql" ) //先把字段的值都当成字符串 func Rows2SliceMap(rows *sql.Rows) (list []map[string]string) { //字段名称 columns, _ := rows.Columns() //多少个字段 length := len(columns) //每一行字段的值 values := make([]sql.RawBytes, length) //保存的是values的内存地址 pointer := make([]interface{}, length) // for i := ...阅读全文

博文 2018-11-25 12:34:39 xxfaxy

Go 切片的 append 操作总结

预备 切片是对其底层数组的某一段的引用。 切片有 len 和 cap 两个属性,代表切片的引用长度和切片的容量(从切片的引用起点位置到其底层数组最末端的长度。因为其底层数组的长度是固定的,这也就是意味着容量是指切片可引用的最大宽度)。 append 函数 slice2 := append(slice1, 23, 15) 以上对切片 slice1 进行 append 操作。该操作遵循以下原则: append 函数对一个切片 slice1 进行追加操作,并返回另一个长度为 len(slice1) + 追加个数 的切片,原切片不被改动,两个切片所指向的底层数组可能是同一个也可能不是,取决于第二条: slice1 是对其底层数组的一段引用,若 append 追加完之后没有突破 slice1 的容量,...阅读全文

博文 2019-08-24 00:02:40 Xavier

《go语言从入门到进阶实战》_徐波

摘录 Go语言是Google公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。 Go语言不使用虚拟机,只有运行时(runtime)提供垃圾回收和goroutine调度等。 Go语言使用自己的链接器,不依赖任何系统提供的编译器、链接器。因此编译出的可执行文件可以直接运行在几乎所有的操作系统和环境中。 从Go 1.5版本之后,Go语言实现自举,实现了使用Go语言编写Go语言编译器及所有工具链的功能。 Go语言可以利用自己的特性实现并发编译,并发编译的最小元素是包。从Go 1.9版本开始,最小并发编译元素缩小到函数,整体编译速度提高了20%。 Go语言的并发是基于goroutine,goroutine类似于线程,但并非线程。可以将goroutine理解为一种虚拟线程。Go语言运行时会参与...阅读全文

博文 2019-01-01 20:34:47 木鱼cavalry

GO语言中container/list使用详解

go中container中list的使用详解 1. func New() *List{} 初始化一个列表,返回类型为一个list对象 a := list.New() # 在函数内部 a = list.New() 输出: &{{0xc00006a300 0xc00006a300 } 0} 2. func (l List) Back() Element{} 返回链表的最后一个元素,返回类型元列表中的元素。 x := a.Back() fmt.Println(strings.Repeat("-----------", 10)) fmt.Println(x) &{0xc00006a300 0xc00006a330 0xc00006a300 b} 3. func (l List)...阅读全文

博文 2019-05-16 14:35:23 qq5c9c828bc8d4b