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

Go - Slice 切片

## 概述 切片是一种动态数组,比数组操作灵活,长度不是固定的,可以进行追加和删除。 `len()` 和 `cap()` 返回结果可相同和不同。 ## 声明切片 ``` //demo_7.go package main import ( "fmt" ) func main() { var sli_1 [] int //nil 切片 fmt.Printf("len=%d cap=%d slice=%v\n",len(sli_1),cap(sli_1),sli_1) var sli_2 = [] int {} //空切片 fmt.Printf("len=%d cap=%d slice=%v\n",len(sli_1),cap(sli_2),sli_2) var sli_3 = [] int {1...阅读全文

博文 2019-07-05 10:00:38 XinLiang

golang中的映射

1. Map 概念:map是一种特殊的数据结构,一种键值对的无序集合。相当于python中的字典 2. 创建和初始化map 使用make声明map dict := make(map[string]int) 使用map字面量的方式声明map dict := map[string]string {"key1": "value1", "key2": "value2"} dict := map[int][]string{} 声明了一个存储字符串切片的map 从map中删除一项 delete(dict, "key1") 删除键为key1的键值对 map在函数间传递是并不会制造该map的一个副本。实际上,当传入一个map给函数时,并对这个map进行修改时,所有对这个map的引用都会察觉到这个修改。 No...阅读全文

博文 2019-04-03 15:34:42 孤风追影

(全栈须知)2.全栈数据基础(理解)

前言 本文开始规范使用标记语法《Markdown 语法编写》 。对于没有实际经验的情况来说,也应该记住基本数据类型,以便于快速上手应用。 1、Redis 数据类型 Redis 数据类型Redis支持五种数据类型: a.一维度 string(字符串)-- SET / GET hash(哈希)-- HMSET / HGET 时间复杂度O(1):一次完成;hash可以存储对象(数组式): HSET KEY_NAME FIELD_NAME FIELD_VALUE; b.二维度 list(列表)-- LPUSH / [ LPOP | LRANGE | ... ]有序 set(集合)-- SADD / [ SRANDMEMBER | SMEMBERS | ... ]无序 zset(有序集合)-- ZAD...阅读全文

博文 2019-08-25 09:02:35 沧浪水

探索 Go 语言数据类型的内部实现

向新程序员讲解 Go 语言的时候,必要的是解释 Go 各种数据值在内存中的组织来给他们建立正确的思想,知道哪些操作是开销昂贵的,哪些是不昂贵的。这篇文章就是关于基本类型,结构,数组和切片的内部实现原理。基本类型让我们从一个简单的例子开始 图1 变量 i 的类型是 int, 在内存中用一个32比特位的字来表示。j 的类型是 int32 ,由于显示类型转换。即使 i 和 j 由相同的内存布局,他们本质上还是不同的类型:在 Go 中直接 i = j 赋值将会产生一个错误,我们必须显示的转化 j,i = int(j)。值 f 的类型是 float,在内存中用 32 比特位的浮点值格式表示,它和 int32 有相同的内存使用量但是内部布局是不同的,感兴趣的可以去了解一个浮点数如何在内存中表示。结构体和...阅读全文

博文 2020-05-29 13:32:54 CXX_FLAGS

golang panic堆栈日志解读

问题由来 以前出现panic问题,总是习惯通过日志中给出的代码行,去“猜测”是哪个变量出了问题, 如果推断不出来,就多加入一些日志,重现panic,再继续定位。 昨天又遇到了panic的问题,看到屏幕上打印了很多堆栈日志,转念一想: 如果现网出现了panic但日志信息不够怎么办,总不能先加日志等下次重现后再定位吧? 然后尝试仔细阅读堆栈日志时,却多出了一些疑惑: 为什么定义是: func Fun1(slice []string, t *Test, i int) 但堆栈日志显示: main.Fun1(0xc000078f48, 0x2, 0x4, 0x0, 0x7) /Users/leidingyu/workspace/go_proj/src/git.code.oa.com/SNG_EDU_G...阅读全文

博文 2020-01-11 21:32:42 竹一先生_阳明学子

Go解密:数组、切片

最近在翻阅Go部分源代码,略有涉及到数组(array)和切片(slice)的实现,本文出自Arrays, slices (and strings): The mechanics of 'append'(https://blog.golang.org/slices) 的中文翻译版本,我并没有完全按照原文翻译,部分内容我重新做了解释以及加入个人理解,还有部分内容我做了适当的删除和简化,如果不当之处多多指正。 ·介绍 ·数组 ·Slice:Slice Header ·函数传递Slice ·Slice 指针:方法接收器 ·make ·copy ·append:示例 介绍 编程语言中最常见的一个概念是数组,看起来是似乎很简单,但在将数组添加到编程语言时必须考虑许多问题,例如: 固定大小或可变大小? 大...阅读全文

博文 2020-02-07 00:32:40 shaoyuan1943

golang文件操作-读操作的常见方式汇总

1、ioutil读取整个文件(io/ioutil) ioutil的方式能够读取整个文件,只需传入文件名,操作简单。该操作方式需要把文件读入内容,效率高,同样占用内存也高 func ReadFile(filename string) ([]byte, error)ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。 // ioutil.ReadFile读取整个文件 func main() { content, err := ioutil.ReadFile("./main.go") if err != nil { fmt.Println("read file f...阅读全文

博文 2020-03-08 19:32:40 司国瑞

小结

在计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是字节。一个存储单元(一个地址),可以存储一个字节,也就是8个二进制位。计算机的存储器容量是以字节为最小单位来计算的,对于一个有128个存储单元的存储器,可以说它的容量为128字节。 地址总线,是用来传输数据所在地址的,而32位系统一般有32根地址总线,那么所能传输的最大数据地址就是2^32,这里所指的地址是真实的数据地址,即物理地址。用户在使用计算机时能够访问的最大内存不单是由CPU地址总线的位数决定的,还需要考虑操作系统的实现。实际上用户在使用计算机时,进程访问到的地址都是逻辑地址,并不是真实的物理地址,逻辑地址是由操作系统提供的,并维护了逻辑地址和物理地址的映射。对于32位的windows操作系统,提...阅读全文

博文 2018-12-05 21:34:45 越塔打哭你

Go36-36,37-字符串

unicode与字符编码 字符编码的问题,是计算机领域中非常基础的一个问题。 Unicode编码 Go语言中的标识符可以包含任何Unicode编码可以表示的字母字符。可以直接把一个整数数值转换为一个string类型的值。被转换的整数值应该是一个有效的Unicode码点,否则会显示为一个“�”字符: package main import "fmt" func main() { s1 := '你' // 这是一个字符类型,不是字符串 fmt.Println(int(s1)) // 字符“你”转为整数是20320 s2 := rune(20320) fmt.Println(string(s2)) s3 := rune(-1) // 不用费心找一个不存在的Unicode码点,用-1就好 fmt.P...阅读全文

博文 2019-02-02 13:35:14 骑士救兵

使用Go开发前端应用(三)

前言 在写这个系列第一篇文章的时候,有些朋友可能不知道wasm能够使用在什么场景,虽然在评论里面有提及,但是没有上具体的例子,这篇文章,使用一个具体的例子来示范下wasm的使用场景。这篇文章主要会讲以下几个方面的东西: md5简单介绍 使用Go计算文件md5 使用js计算文件md5 性能对比 文件秒传什么实现的? md5的简单介绍 md5 简单的说就是它是一种散列算法,在以前有很多网站或者系统,都是使用 md5 来加密的,md5 的特征是,任意长度的输入,它都可以给你生成一个128位的结果出来,而且只要输入不一样,输出的结果肯定不一样(现在据说会有hash碰撞,不过我们这里不讨论)。128位使用16进制的数字表示就是32位了。不过,在现在的系统中,应该是没有再使用md5来加密密码的了,因为 ...阅读全文

博文 2020-05-07 10:35:31 zhongzhong05

golang基本用法速查

Hello World! package main import "fmt" func main() { fmt.Println("Hello World!") } 引入模块 引入内置模块 //单个引入 import "fmt" //引入多少个 import ( "fmt" "os" ) 引入第三方模块 规则: 默认从 GOPATH 下 src 目录开始找 import 的路径到目录终止, 不会到文件, 每个目录就是一个模块, 一般最终目录名即模块名 默认的模块名由 go 文件首行 package 定义, 多个 go 文件的 package 可以相同, 同一模块的 go 文件应该放置于同一个目录 模块可以使用别名 通过 govendor 可以方便进行项目迁移 import ( "github...阅读全文

博文 2020-02-12 07:32:56 supertab

Reflect-Go一分钟快速入门

Reflect 本文侧重讲解reflect反射的实践应用,适合新手初窥门径。 reflect两个基本功能 reflect.TypeOf() 动态获取输入数据的类型 reflect.ValueOf() 动态获取输入数据的值 func TypeOf(i interface{}) Type func ValueOf(i interface{}) Value 复制代码通过reflect.Type和reflect.Value支持的方法,可以对输入的动态数据进行解析。 那么了解reflect.Type和reflect.Value提供的方法尤为重要,因为比较多,此介绍放在文末。 reflect.Kind 在reflect.Type和reflect.Value上调用Kind()方法,可以得到reflect....阅读全文

博文 2020-01-12 18:34:18 Tinson

golang nil slice & empty slice 笔记

示例代码 package main import ( "fmt" ) func main() { a := []string{"A", "B", "C", "D", "E"} a = nil fmt.Println(a, len(a), cap(a)) } result: [] 0 0 说明: a 是 一个nil 的slice package main import ( "fmt" ) func main() { a := []string{"A", "B", "C", "D", "E"} a = a[:0] //空的slice fmt.Println(a, len(a), cap(a)) } result [] 0 5 说明 a是长度是0的emtpy slice nil slice vs ...阅读全文

博文 2020-06-06 19:32:41 lidashuang

golang学习笔记--切片slice 与数组 arr

因为我是写php的,刚开始写go的时候老是被数组坑。因为在go中的数组是固定长度,所以会存在越界的时候。而在go中也很少直接使用数组。更多的时候会使用slice(切片)。 数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的长度是固定的。和数组对应的类型是Slice(切片),它是可以增长和收缩动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组。 数组的声明,需要指出数组内部元素类型,以及数组的长度 var name [len]type 如:声明一个长度为5的Int 类型数组 var numbers [5]int 数组元素的访问也是跟大多数语言一样,可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。内置的...阅读全文

博文 2019-08-05 21:02:37 旧梦发癫

一篇文章理解 golang 中切片与数组的关系

起始 在 golang 文档中,对数组与切片有一些详细的讲解,本文主要讲解数组与切片的关系 由于是个人理解,可能有些偏差,烦请指正 数组 golang 的数组比较简单,我们理解几个概念即可 数组是固定长度与容量,并且具有相同类型的一组值 此定义的数组长度为 5 ,那么容量也会固定为 5 数组的索引都是从 0 开始的 记住,我们在此定义了一个 int 类型的数组,长度容量均为 5,在后面的切片讲解中,我们将对此数组进行切片 // 此定义的数组长度为 5 ,那么容量也会固定为 5 arr := [5]int{0, 1, 2, 3, 4} // 数组 p = 0xc00001c0f0,arr = [0 1 2 3 4],len = 5,cap = 5 fmt.Printf("数组 p = %p,a...阅读全文

博文 2020-03-07 23:34:20 Enda

Reflect-Go一分钟快速入门

Reflect 本文侧重讲解reflect反射的实践应用,适合新手初窥门径。 reflect两个基本功能 reflect.TypeOf() 动态获取输入数据的类型 reflect.ValueOf() 动态获取输入数据的值 func TypeOf(i interface{}) Type func ValueOf(i interface{}) Value 通过reflect.Type和reflect.Value支持的方法,可以对输入的动态数据进行解析。那么了解reflect.Type和reflect.Value提供的方法尤为重要,因为比较多,此介绍放在文末。 reflect.Kind 在reflect.Type和reflect.Value上调用Kind()方法,可以得到reflect.Kind类...阅读全文

博文 2020-01-10 17:32:41 tinson

【Go】slice的一些使用技巧

文链接:https://blog.thinkeridea.com/201901/go/slice_de_yi_xie_shi_yong_ji_qiao.html slice 是 Go 语言十分重要的数据类型,它承载着很多使命,从语言层面来看是 Go 语言的内置数据类型,从数据结构来看是动态长度的顺序链表,由于 Go 不能直接操作内存(通过系统调用可以实现,但是语言本身并不支持),往往 slice 也可以用来帮助开发者申请大块内存实现缓冲、缓存等功能。 在 Go 语言项目中大量的使用 slice, 我总结三年来对 slice 的一些操作技巧,以方便可以高效的使用 slice, 并使用 slice 解决一些棘手的问题。 slice 的基本操作 先熟悉一些 slice 的基本的操作, 对最常规的 ...阅读全文

博文 2019-01-24 23:34:41 thinkeridea

Golang slice(切片) 和 array 区别

Autor: PalappleDate: 2020-03-06tag: Array,slice,Golang 最近在学习Golang,发现有两个定义数组的数据结构,有点儿困惑,自己做个对比,也希望给大家一点启示 数据结构 array类型 值引用类型 var variable_name [SIZE] variable_type slice类型 slice是一个引用类型,是一个动态的指向数组切片的指针 slice是可以动态增长的数组 var identifier []type 创建方法 var slice1 []type = make([]type, len) 也可以简写为 slice1 := make([]type, len) 也可以指定容量,其中capacity为可选参数。 make([]T...阅读全文

博文 2020-03-20 14:33:05 palapple

6.Go语言基础之map

1.map 1.1map介绍 Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。 map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化后才能使用。 1.2map定义 map定义语法如下: map[KeyType]ValueType 其中, KeyType表示键的类型。 ValueType表示键对应的值的类型。 map类型的变量,默认初始值为nil,需要使用make()函数来分配内存。语法为: make(map[KeyType]ValueType, [cap]) 其中cap表示map的容量,该参数虽然不是必须的,但是我们需要在初始化map的时候为其指定一个合适的容量。 1.3map的基本使用 package main import ...阅读全文

博文 2019-12-12 10:33:13 DevOperater

一篇文章理解 golang 中切片与数组的关系

起始 在 golang 文档中,对数组与切片有一些详细的讲解,本文主要讲解数组与切片的关系 由于是个人理解,可能有些偏差,烦请指正 数组 golang 的数组比较简单,我们理解几个概念即可 数组是固定长度与容量,并且具有相同类型的一组值 此定义的数组长度为 5 ,那么容量也会固定为 5 数组的索引都是从 0 开始的 记住,我们在此定义了一个 int 类型的数组,长度容量均为 5,在后面的切片讲解中,我们将对此数组进行切片 // 此定义的数组长度为 5 ,那么容量也会固定为 5 arr := [5]int{0, 1, 2, 3, 4} // 数组 p = 0xc00001c0f0,arr = [0 1 2 3 4],len = 5,cap = 5 fmt.Printf("数组 p = %p,a...阅读全文

博文 2020-03-06 14:32:45 enda

golang标准库之sort

简介 标准库sort实现了4种排序方法,插入排序、堆排序、快排和归并排序,但是并没有暴露给用户接口。sort包会根据数据选择最优的排序方法(其实只使用了3种,归并排序除外)。 接口 用户需要实现以下接口才能使用sort包的排序功能。 type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements ...阅读全文

博文 2020-05-30 03:32:44 风铃草613

深入理解Go之==

概述 相信==判等操作,大家每天都在用。之前在论坛上看到不少人在问 golang ==比较的结果。看到很多人对 golang 中==的结果不太了解。确实,golang 中对==的处理有一些细节的地方需要特别注意。虽然平时可能不太会遇到,但是碰到了就是大坑。本文将对 golang 中==操作做一个系统的介绍。希望能对大家有所帮助。 类型 golang 中的数据类型可以分为以下 4 大类: 基本类型:整型(int/uint/int8/uint8/int16/uint16/int32/uint32/int64/uint64/byte/rune等)、浮点数(float32/float64)、复数类型(complex64/complex128)、字符串(string)。 复合类型(又叫聚合类型):数组...阅读全文

博文 2019-08-20 11:32:44 孤雨

golang[32]-区块链-base58

base58Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号。设计Base58主要的目的是:避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。不使用"+“和”/"的原因是非字母或数字的字符串作为帐号较难被接受。没有标点符号,通常不会被从中间分行。大部分的软件支持双击选择整个字符串。base58编码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545...阅读全文

博文 2019-02-21 15:35:52 jonson_jackson

Go 语言的 4 个特性改动

文链接:Go 语言的 4 个特性改动 在 Go1.1 可以看到某个版本的 Go 语言一些改动文档(修改 URL 参数查看别的版本)。 其中以 Go1.1#language 标签下关于语言特性方面的尤为重要。 在每个 Go 语言新版本发布后浏览一下,是个良好的习惯。 下面我会从 Go1.1 到 Go1.11 以来挑 4 个值得讨论的改动来跟大家分享一下。 三索引切片 版本: Go1.2 在现有数组或切片下,使用第二个冒号来指示新生成的切片的容量。 func TestThreeIndex(t *testing.T) { s := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} s1 := s[2:4] // 等价于 s[2:4:cap(s)],省略取 cap(s)。 ...阅读全文

【Go语言踩坑系列(三)】数组与切片

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 要点 本文关注Go语言数组和切片相关的语言特性。 数组和切片以及字符串的关系 相同点 Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现。 差别 Go语言的数组是一种值类型,虽然数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的。 Go语言字符串底层数据也是对应的字节数组,但是字符串的只读属性禁止了在程序中对底层字节数组的元素的修改。字符串赋值只是复制了数据地址和对应的长度,而不会导致底层数据的复制。 Go语言切片的行为更为灵活,切片的结构和字符串结构类似,但是解除...阅读全文

博文 2020-03-21 17:32:41 NoSay

golang中的数组和切片

1. 数组 概念:数组是具有相同唯一类型的一组已编号且长度固定的数据项序列;这种类型可以是任意的原始初始类型,如整型,字符串或者是自定义类型,数组的长度必须是一个常量表达式,并且是一个非负整数。数组的长度也是数组类型的一部分,所以[8]int和[6]int是属于不同类型的。 2. 数组的声明格式 格式如下 var indentifier [len] type var a [7] int 3. 数组的初始化 var b = [5]string {"name", "age", "score", "weight", "height"} var c = []int {1, 2, 3, 4, 5} var d = [...]int {2, 4, 6, 8, 10} 从技术角度来讲d是个切片 var k...阅读全文

博文 2019-04-03 15:34:43 孤风追影

关于 Python_你一定没读过的8个技巧

介绍 Python 功能和小技巧的文章网上有无数篇,比如变量解压缩,partial 偏函数,枚举可迭代对象... 但关于 Python 我们能说的还有很多。所以今天我将向大家展示一些我知道和有使用过的特性,这些特性在其它文章或博客中很少被提及:### 消毒字符串输入对用户输入内容进行消毒几乎适用于你写的每一个程序。通常来说转换字符大小写的操作就足够了,有时候用 Regex 正则表达式就能完成,但对于比较复杂的情况,我们有更好的办法:```user_input = "This\nstring has\tsome whitespaces...\r\n"character_map = {ord('\n') : ' ',ord('\t') : ' ',ord('\r') : None}user_in...阅读全文

博文 2019-12-14 19:32:40 是程序员吖

golang基础---Slice切片

切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度也没有元素赋值的类型(相比叫array) 数组的基本操作如下 ,类似与python中列表切片的操作,详见实例 package main import "fmt" func main() { var s1 []int //这样就是一个slice类型,既没有长度也没有元素赋值 a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //这是一个数组 s2 := a[5:10] //切片,索引5到10的元素,不包含索引为10 s3 := a[:3] //切片,索引1-3...阅读全文

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

golang学习笔记10:数组切片Slice

Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。定义切片你可以声明一个未指定大小的数组来定义切片:var identifier []type切片不需要说明长度。或使用make()函数来创建切片:var slice1 []type = make([]type, len)也可以简写为slice1 := make([]type, len)也可以指定容量,其中capacity为可选参数。make([]T, length, capacity)这里 len 是数组的长度并且也是切片的初始长度。切片初始化s :=[] int {...阅读全文

博文 2018-10-21 00:34:38 编程老司机

Go语言学习笔记(3)

数组 Golang 中,数组是值类型。 数组的声明 var arr [10]int 数组的初始化 var arr1 [3]int = [3]int{1, 2, 3} var arr2 = [3]int{4, 5, 6} var arr3 = [...]int{7, 8, 9} var arr4 = [...]int{1: 100, 2: 200, 3: 300} 用 for-range 遍历数组 基本语法: for index, value := range 数组变量{ } 其中:index 为数组下标,value 是该下标位置的值。 长度是数组类型的一部分 长度是数组类型的一部分,就是说数组不可以脱离长度而存在。听起来不太明白,我们来看下面的一个示例就明白了,这真的是一个大坑。 假设,我们...阅读全文

博文 2019-01-30 10:34:45 丹枫无迹

go 的数组和切片

什么是数组? 数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成 数组定义的方法? 方式一 package main import "fmt" func arraytest() { var x [3] int fmt.Println(x) } // 输出 [0 0 0] func main() { arraytest() } 使用快速声明数组 x3 :=[3] int {112,78} fmt.Println(x3) 输出 [112 78 0] // 数组值的获取 var x2[3] int x2[0] = 1 //第一个元素 x2[1] = 11 x2[2] = 22 fmt.Println(x2) 输出 [1 11 22] // 使用for 循环获取数组...阅读全文

博文 2020-01-07 03:33:10 水滴石川1

用Go实现冒泡排序、选择排序和快速排序的运行效率

//环境和语言版本:go version go1.13 windows/amd64/********************************代码如下:*****************************************/package mainimport ( "fmt" "math/rand" "time")func main() { // b := [...]int{7, 89, 99, 55, 2235, 515, 88, 22, 2} // b2 := [...]int{7, 89, 99, 55, 2235, 515, 88, 22, 2} // // b3 := [...]int{7, 89, 99, 55, 2235, 515, 88, 22, 2} //...阅读全文

博文 2020-02-11 17:56:29 whalert

golang-101-hacks(18)——map类型访问

Map是一种指向哈希表的引用类型,可以使用map构造一个“键值”类型的数据库,这在实际编程中非常高效。例如,下面的代码是统计切片中每个元素的总数: package main import ( "fmt" ) func main() { s := []int{1, 1, 2, 2, 3, 3, 3} m := make(map[int]int) for _, v := range s { m[v]++ } for key, value := range m { fmt.Printf("%d occurs %d times\n", key, value) } } 运行结果 3 occurs 3 times 1 occurs 2 times 2 occurs 2 times 此外,根据Go spe...阅读全文

博文 2019-06-09 11:02:40 羊羽share

golang切片内存应用技巧

在 Go 语言中切片是使用非常频繁的一种聚合类型,它代表变长的序列,底层引用一个数组对象。一个切片由三个部分构成:指针、长度和容量。指针指向该切片自己第一个元素对应的底层数组元素的内存地址。 切片的类型声明如下: type slice struct { array unsafe.Pointer len int cap int } 复制代码多个切片之间可以共享底层数组的数据,并且引用的数组区间可能重叠。利用切片 的这个特性我们可以在原有内存空间中对切片进行反转、筛选和去重等操作,这样就不用声明一个指向新内存的切片来存储结果,从而节省了内存空间以及扩展底层数组的消耗,这在切片长度足够大时效果就会非常显著。 下面这些例子都是在切片底层数组的内存空间上进行的操作,需要注意的是这些操作在底层数组上生成...阅读全文

博文 2019-12-03 20:34:21 kevinyan

Dig101: Go之for-range排坑指南

好久没写了,打算今年做个Dig101系列,挖一挖技术背后的故事。 也可以移步微信版阅读 Dig101: dig more, simplified more and know more golang常用的遍历方式,有两种: for 和 for-range。 而for-range使用中有些坑常会遇到,今天我们一起来捋一捋。 0x01 遍历取不到所有元素指针? 如下代码想从数组遍历获取一个指针元素切片集合 arr := [2]int{1, 2} res := []*int{} for _, v := range arr { res = append(res, &v) } //expect: 1 2 fmt.Println(*res[0],*res[1]) //but output: 2 2 复制代...阅读全文

博文 2020-01-05 14:34:21 newbmiao

使用sort包排序

在程序开发中,不可避免的需要给数据集进行排序,如果在语言级别不提供支持的话,我们则需要自己写算法进行数据的处理,麻烦还不一定高效。 幸好Golang在标准包中,官方有提供sort包中Sort()函数提供排序功能。并且天然支持[]int,[]float64,[]string切片的排序查找功能,并且也能够实现对自定义类型集合的排序。 下面我们先来看下golang中Sort函数的结构是什么样的。 func Sort(data Interface) { n := data.Len() quickSort(data, 0, n, maxDepth(n)) } 可以看到,该函数接收的唯一的参数就是待排序集合,该集合应是一个Interface,而我们如果需要让自定义类型的集合能够被排序,则需要实现该int...阅读全文

博文 2020-04-13 09:32:43 YXWKY

并发编程的数据竞争问题以及解决之道

Go语言以容易进行并发编程而闻名,但是如果稍不注意,并发程序可能导致的数据竞争问题(data race)就会经常出现在你编写的并发程序的待解决Bug列表中-- 如果你不幸在代码中遇到这种错误,这将是最难调试的错误之一。 今天这篇文章里我们首先来看一个导致数据竞争的示例程序,使用go命令行工具检测程序的竞争情况。然后我们将介绍一些在不改变程序核心逻辑的情况下如何绕过并解决并发情况下的数据竞争问题的方法。最后我们会分析用什么方法解决数据竞争更合理以及留给大家的一个思考题。 本周这篇文章的主旨概要如下: 并发程序的数据竞争问题。 使用go命令行工具检测程序的竞争情况。 解决数据竞争的常用方案。 如何选择解决数据竞争的方案。 一道测试自己并发编程掌握程度的思考题。 数据竞争 要解释什么是数据竞争我们...阅读全文

博文 2020-05-28 12:32:47 Kevin

ARTS 第12周

ARTS 第12周分享 [TOC] Algorithm 单向链表的实现 [参考代码] type HeroNode struct { No int Name string NickName string next *HeroNode } type HeroList struct { head *HeroNode } //新建节点 func NewHeroNode(no int, name, nickName string) *HeroNode { return &HeroNode{No: no, Name: name, NickName: nickName} } // 新建链表 func NewHeroList() HeroList { return HeroList{NewHeroNode(...阅读全文

博文 2019-06-23 23:32:43 陈卧虫

Golang 复合数据类型:映射

映射(map) 映射是一种数据结构,用于存储一系列无序的键值对,映射基于键来存值,能够快速检索数据。键就像索引一样,指向与该键关联的值。 映射的实现 Go语言中 map 的底层是哈希(hash)表实现的,它的源码在 $GOROOT/src/pkg/runtime/hashmap.go/ 可以查看它的实现细节。Go语言的 map 是一个数组列表,不是像 C++ 一样使用红黑树,与传统的 hashmap 一样,Go语言的 map 由一个个 bucket 组成。在这个数组列表中的每一个元素都被称为 bucket 的结构体,每个 bucket 可以保存为 8 个键值对,所有元素将被 hash 算法填入到数组的 bucket 中;当 bucket 填满后,会使用一个 overflow 指针来扩展一个 ...阅读全文

博文 2020-06-03 15:32:39 sunlingbot

Golang --对切片进行元素唯一化处理

package Tools import "sort" //对[]string 类型的切片进行元素唯一化处理,返回来的元素已经排好序 func SetString(arr []string) []string { newArr := make([]string, 0) for i := 0; i < len(arr); i++ { repeat := false for j := i + 1; j < len(arr); j++ { if arr[i] == arr[j] { repeat = true } } if !repeat { newArr = append(newArr, arr[i]) } } sort.Strings(newArr) return (newArr) } //对...阅读全文

博文 2020-01-15 23:32:42 stardust_0000

DjanFey的基础库解读--io包(multi.go)

package my_io type eofReader struct { } func (eofReader) Read([]byte) (int, error) { return 0,EOF } type multiReader struct { readers []Reader } func (mr *multiReader) Read(p []byte) (n int, err error) { for len(mr.readers)>0{ // 对展开嵌套multiReaders的优化(Issue 13558) // 如果readers只有一个元素且也是multiReader类型的,直接将元素的readers赋值给最外层的readers if len(mr.readers)==1{...阅读全文

博文 2020-03-07 13:35:10 DjanFy

golang语言基础篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ITcombox/article/details/48035117 go语言特性:◆ 自动垃圾回收具备系统自动释放资源◆更丰富的内置类型map类型、slice类型(类似vector)◆函数多返回值跟lua/erlang一样,支持函数多返回值,优化输入输出参数、结构体参数等传递◆错误处理defer/recover/panic,defer用于资源的释放,go语言不提供构造和析构,recover截取错误处理流程,一般在使用defer的关键字函数中使用;若在无异常的goroutine中使用recover,会导致此goroutine所在的进程打印错误信息后,直接退出◆匿名函数a := fun() / a(...阅读全文

博文 2018-12-06 19:31:34 itcombox

Go36-42,43-bufio包

bufio包 这是另一个与I/O操作强相关的代码包。bufio是“buffered I/O”的缩写,这个代码包中的程序实体实现的I/O操作都内置了缓冲区。 主要数据类型 bufio包中的数据类型主要有: Reader Scanner Writer和ReadWriter 与io包中的数据类型类似,这些类型的值也都需要在初始化的时候,包装一个或多个简单I/O接口类型的值。这里的简单I/O接口类型指的就是io包中的那些简单接口。 缓冲区的作用(bufio.Reader) bufio.Reader类型的值内的缓冲区其实就是一个数据存储中介,它介于底层读取器与读取方法及其调用方之间。所谓的底层读取器,就是在初始化此类值的时候传入的io.Reader类型的参数值。 Reader值的读取方法一般会先从其所...阅读全文

博文 2019-02-06 21:35:13 骑士救兵

Golang——map

Map是无序的、基于key-value的数据结构,内部使用散列表hash实现。 Map是引用类型,声明时是nil,必须初始化才能使用。 map[keytype]valuetype map类型变量默认初始值是nil,需要使用make()函数进行初始化 make(map[keytype]valuetype, [cap]) map声明和初始化 func main() { //声明 var a map[string]int fmt.Println(a == nil) //true //初始化,容量可以写,建议编程时候加上 a = make(map[string]int, 10) fmt.Println(a == nil) //false // 声明map并初始化 b := map[int]strin...阅读全文

博文 2020-05-21 23:32:46 Cici冬雪

Go语言的数据类型

## 1 概述 Go语言作为类C语言,支持常规的基础数据类型的的同时,支持常用的高级数据类型。他们是: * 整数,int,uint,int8,uint8,int16,uint16,int32,uint32,int64,uint64 * 浮点(小数),float32,float64 * 复数,complex * 字符,byte,rune * 字符串,string * 布尔,bool * 指针,pointor * 数组,array * nil * 切片,slice。(引用类型) * 映射,map * 结构体,struct * 接口,interface * 函数,func() 本篇相当于一个类型索引。包含了Go语言中的全部类型。具体每种类型的操作,请参见具体章节! ## 2 整数,int 支持的整...阅读全文

博文 2018-10-30 22:01:19 hanzkering

一个TCP长连接设备管理后台工程(八)

前篇 一个TCP长连接设备管理后台工程(一) 一个TCP长连接设备管理后台工程(二) 一个TCP长连接设备管理后台工程(三) 一个TCP长连接设备管理后台工程(四) 一个TCP长连接设备管理后台工程(五) 一个TCP长连接设备管理后台工程(六)一个TCP长连接设备管理后台工程(七) Github仓库地址 TCP服务器 前面的所有内容都是为了实现一个基于jtt808协议的TCP服务器而做的工作,我们现在需要吧上面讲解的内容整合起来,让各个模块协调工作,完成一整套的服务流程。 配置加载 先说一下配置加载,对于一个应用程序,为了增加其灵活性,不可避免的需要使用配置文件。综合个方面考虑,我选择使用toml格式的配置文件,解析库使用"github.com/BurntSushi/toml" # conf...阅读全文

博文 2019-12-31 18:32:40 qiuzhiqian

Go总结(2)

struct go中struct结构默认字段都会有零值,故不能用nil来判断struct是否为空,可通过额外的字段来判断struct是否填充或为空 type Demo struct{ ready bool name string //其他字段 } 在初始化的时候必须将ready设置为true var d Demo if !d.ready{ //do stuff } Web工作方式 Go通过ListenAndServer来建立web服务器,底层是初始化一个server对象,然后调用net.Listen("tcp",addr)来监听端口。 调用srv.server(net.Listener)函数来处理接收客户端请求。函数里面为一个for{},首先通过accept接受请求,接着创建一个Conn,最...阅读全文

博文 2019-01-22 18:34:42 dack

闭包,sync使用细节

代码 先看代码如下: func main() { var a []int for i := 0; i < 100; i++ { go func() { a = append(a, i) }() } time.Sleep(2 * time.Second) fmt.Println(a) } 这段测试代码是想要一个元素为0到100的切片,但是这一小段代码隐藏了很多的问题。 闭包函数 先看这段代码的执行结果: [10 12 13 13 13 13 21 24 25 28 28 28 28 28 28 29 29 29 36 38 39 39 40 41 41 41 41 41 41 45 45 45 45 46 47 48 49 50 51 52 61 61 61 61 61 61 61 61 61...阅读全文

博文 2019-02-20 11:34:42 estu

leetcode_443

Golang: 思路:需要注意的是,这题并不要求你改变输入参数里切片的长度,换句话来说:输入[a,a,b,b,b,c],并不需要你将这个数组变成[a,2,b,3,c],而是只要修改为[a,2,b,3,c,c],并返回5即可。那么就可以用双指针,再加一个下标表示从当前哪个位置开始修改数组,这样就能完成这道题。当然,仍然需要处理数组到达最后一位的情况。 代码如下: func compress(chars []byte) int { if len(chars)<=1 { return len(chars) } wri:=1//(从当前这位开始写) i,j:=0,1 for j阅读全文

博文 2020-02-01 19:32:46 淳属虚构

Golang(四)语言特性(上)

Golang是一种强类型的通用系统编程语言,具有垃圾回收机制并明确支持并发编程。go程序由包构成,这允许对依赖关系进行高效的管理;它的语法规则且紧凑,允许通过诸如集成开发环境之类的自动化工具进行简单的分析.......都是关于Golang语言特性的一些总结,本文将结合官方文档对Golang的语言特性进行一一阐述 记法 使用扩展的Backus-Naur格式(EBNF)指定语法格式,形如 Production = production_name "=" [ Expression ] "." . Expression = Alternative { "|" Alternative } . Alternative = Term { Term } . Term = production_name | ...阅读全文

博文 2019-10-12 01:32:43 aside section ._1OhGeD