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

slice in golang

在go语言中,数组是有特定长度和元素类型共同组成的一种类型,比如[4]int表示4个integer。而[4]int和[5]int是两个完全不同的类型! slice slice是基于数组构建的,在数组的基础上提供了更多的操作和便利方法。在go语言的源码中,slice的定义如下: type slice struct { array unsafe.Pointer len int cap int } // An notInHeapSlice is a slice backed by go:notinheap memory. type notInHeapSlice struct { array *notInHeap len int cap int } 对于第二个notInHeapSlice的声明,对g...阅读全文

博文 2019-01-29 17:34:48 程屁凹

8.切片

Go语言基础之切片 | Golang 本文主要介绍Go语言中切片(slice)及它的基本使用。 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 例如: func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ sum = sum + v } return sum } 这个求和函数只能接受[3]int类型,其他的都不支持。 再比如, a := [3]int{1, 2, 3} 数组a中已经有三个元素了,我们不能再继续往数组a中添加新元素了。 切片 切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含地址...阅读全文

博文 2020-04-05 13:32:44 雪上霜

golang实现简化版桶算法

/** * 简化版桶算法 * 通过一维数组保存对应数字在一维数组中出现的个数,然后遍历一维数组达到排序的效果 * 这里一位数组是排序列表的范围,必须10以内的数字列表排序, 则一维数组大小为11 (N+1) * * 涉及知识点: * @随机数功能 * @时间处理和格式化 */ package main import ( "fmt" "math/rand" "time" ) func main() { var scoreList [11]int score := [5]int{5, 3, 5, 2, 8} for _, v := range score { scoreList[v]++ } fmt.Println(scoreList) var result []int // fmt.Print...阅读全文

博文 2020-05-25 03:32:49 全栈运维

Golang - 调度剖析【第三部分】

本篇是调度剖析的第三部分,将重点关注并发特性。回顾:第一部分第二部分 简介 首先,在我平时遇到问题的时候,特别是如果它是一个新问题,我一开始并不会考虑使用并发的设计去解决它。我会先实现顺序执行的逻辑,并确保它能正常工作。然后在可读性和技术关键点都 Review 之后,我才会开始思考并发执行的实用性和可行性。有的时候,并发执行是一个很好的选择,有时则不一定。 在本系列的第一部分中,我解释了系统调度的机制和语义,如果你打算编写多线程代码,我认为这些机制和语义对于实现正确的逻辑是很重要的。在第二部分中,我解释了Go 调度的语义,我认为它能帮助你理解如何在 Go 中编写高质量的并发程序。在这篇文章中,我会把系统调度和Go 调度的机制和语义结合在一起,以便更深入地理解什么才是并发以及它的本质。 什么是...阅读全文

博文 2018-12-11 13:34:41 sxssxs

Go 切片绕坑指南

在Go中按值传递时,为什么有时会更改切片? 不知道大家有没有发现在一个函数内部对切片参数进行了排序后也会改变函数外部原来的切片中元素的顺序,但是在函数内向切片增加了元素后在函数外的原切片却没有新增元素,更奇怪的是添加并排序后,外部的切片有可能元素数量和元素顺序都不会变,这是为什么呢?我们通过三个小测验来解释造成这个现象的原因。测验一下面的代码的输出什么? func main() { var s []int for i := 1; i <= 3; i++ { s = append(s, i) } reverse(s) fmt.Println(s) } func reverse(s []int) { for i, j := 0, len(s) - 1; i < j; i++ { j = len(...阅读全文

博文 2020-03-02 01:32:47 Java天天

Golang基础之Map

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 map的定义 Go语言中 map的定义语法如下: map[KeyType]ValueType 其中, KeyType:表示键的类型。 ValueType:表示键对应的值的类型。 map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为: make(map[KeyType]ValueType, [cap]) 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。 map基本使用 map中的数据都是成对出现的,map的基本使用示例代码如下: func main() { scoreMap := make(map[stri...阅读全文

博文 2020-03-25 12:32:43 DevilRoshan

【golang】slice底层函数传参原理易错点

切片底层结构 切片的底层结构主要包括引用数组的地址data,切片长度len与切片容量cap。 type SliceHeader struct { Data uintptr Len int Cap int } 以切片为参数调用函数 Go语言中,如果以切片为参数调用函数时,有时候会给人一种参数采用了传引用的方式的假象:因为 在被调用函数内部可以修改传入的切片的元素。 任何可以通过函数参数修改调用参数的情形,都是因为函数参数中传人了指针参数(只有底部结构有指针地址类型,都可以改变原值,因为虽然函数拷贝了参数的地址,但地址指向一个内存,所以能修改原来值) func add(arr []int) { arr[0] = 99 } func main() { var a = make([]int, 2, ...阅读全文

博文 2020-04-23 10:32:54 dongzaidong

Go语言学习 Day 02

Go语言学习 [TOC] Day 02 官方文档补充 格式化 - tab缩进 注释 - 单行// - 多行/*..*/ 命名 - 包名:小写字母命名,不应使用下划线或驼峰记法。 - 接口名 - 只包含一个方法的接口应当以该方法的名称加上 - er 后缀来命名,如 Reader、Writer、 Formatter、CloseNotifier 等 - 驼峰记法:Go 中约定使用驼峰记法 MixedCaps 或 mixedCaps 而非下划线的方式来对多单词名称进行命名 分号 Go语言使用分号结尾,但词法分析器会使用一条简单的规则来自动插入分号,代码中不必写分号。 如果新行前的标记为语句的末尾,则插入分号. if i < f() // wrong! { // wrong! 此处词法分析器会插入分号...阅读全文

博文 2019-08-29 17:34:45 右左君

Rust 入门 (四)

所有权是 rust 语言独有的特性,它保证了在没有垃圾回收机制下的内存安全,所以理解 rust 的所有权是很有必要的。接下来,我们来讨论所有权和它的几个特性:借用、切片和内存结构。 什么是所有权 Rust 的核心特性是所有权。各种语言都有它们自己管理内存的方式,有些是使用垃圾回收机制,有些是手动管理内存,而 rust 使用的是所有权机制来管理内存。 所有权规则 所有权规则如下: rust 中的每个值都有一个自己的变量。 rust 值在同一时间只能绑定一个变量。 变量超出作用域,值会自动被销毁。 不懂没关系,跳过往后看。 变量作用域 rust 语言的变量作用域和其他语言是类似的,看例子: { // 变量 s 还没有被声明,s 在这里是无效的 let s = "hello"; // 变量 s 是...阅读全文

博文 2019-12-05 15:34:23 单鹏飞

如何控制Go编码JSON数据时的行为

今天来聊一下我在Go中对数据进行 JSON 编码时遇到次数最多的三个问题以及解决方法,大家来看看是不是也为这些问题挠掉了不少头发。 自定义JSON键名 这个问题加到文章里我是有所犹豫的,因为基本上大家都会,不过属于同类问题我还是放进来了,对新接触Go 的同学更友好些。 我们先从最常见的一个问题说,首先在Go 程序中要将数据编码成JSON 格式时通常我们会先定义结构体类型,将数据存放到结构体变量中。 type Address struct { Type string City string Country string } type CreditCard struct { FirstName string LastName string Addresses []*Address Remark ...阅读全文

博文 2020-02-02 21:34:16 kevinyan

Go语言学习(二):字符串

在Go中字符串作为内建类型,和C语言是不一样的。C中没有字符串类型, 所有需要通过字符数组来表示字符串,并以指针来传递。在Go中字符串是一个定长字符数组,所以当其创建之后就无法直接改变了。1、错误的字符串长度的获取: 从字符串字面值看len(s)的结果应该是7,但在Golang中string类型的底层是通过byte数组实现的,在unicode编码中,中文字符占两个字节,而在utf-8编码中,中文字符占三个字节而Golang的默认编码正是utf-8.2、正确的字符串长度获取: 那么问题来了,rune[ ]是个啥?有时需要将一个类型转换为另一个类型。在 Go 中可以做到,不过有一些规则。首先,将一个值转换为另一个是由操作符(看起来像函数:byte())完成的,并且不是所有的转换都是允许的。Go语...阅读全文

博文 2020-02-20 19:32:49 算命的Chalk

Golang 标准库:strings 包的应用

strings包 Go语言标准库中也存在这样一个名为strings包,额外封装一些方法用于处理字符串。 包含判断 前后缀包含 func main() { //前后缀包含 var str string = "This is a fat cat" var str1 string = "Hello Boss!" var str2 string = "Lucy is name My" fmt.Printf("T/F? Does the string \"%s\" have prefix %s?\n", str, "is") //str的前缀是否包含"is"? fmt.Printf("%t\n", strings.HasPrefix(str, "is")) //使用HasPrefix方法判断前缀 fm...阅读全文

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

golang 系列教程(三)—— 语法介绍

概要 本章介绍golang基本的语法。golang语法相对来说比较简单,掌握本章内容即可满足语法方面的基本开发需要。 局部变量定义 func test1() { var a int // 定义临时变量a } 复制代码全局变量定义 var a int // 定义全局变量a 复制代码变量初始化 var b string = "apache" //数组初始化 var strAry = [10]string{"aa", "bb", "cc", "dd", "ee"} //切片初始化 var s = make([]string, 0) //字典初始化 var m = map[string]int{ "apple":1, "watermeter":2, } 复制代码条件选择 var a string =...阅读全文

博文 2019-08-18 03:04:19 叶不闻

【Golang 基础】Go 语言的数组

Go 语言中的数组 定义数组的格式:var [n], 其中 n >= 0; package basic import "fmt" func DeclaratArray(){ // 定义指定长度的数组 var arr1 [5]int fmt.Println(arr1) // [0 0 0 0 0] // 不设置数组长度 arr2 := [...]int{} fmt.Println(arr2) // [] // 定义指定长度的数组,并赋值 arr3 := [2]int{ 1, 5 } fmt.Println(arr3) // [1 5] } 通过 new 关键字声明数组,返回一个指向该数组的指针; package basic import "fmt" func...阅读全文

博文 2019-03-26 02:34:42 爱写作的程序猿

Golang笔记

--[切片和数组]-- 切片本质上是一组指向数组特定片段的指针,所以切片不可能单独存在,即使直接make一个切片,其背后也隐藏着一个数组来实际存储数据。var a [2]int //定义的是一个2长度的数组var b []int //定义的是一个切片b=a //这个赋值在语法上是不成立的var matrixA [][2]inta=matrixA[0] //因为是数组的拷贝,这里进行值拷贝,a和matrixA互不影响var matrixB [][]intb = matrixB[0] 因为是切片的拷贝,这里只是一个指针引用,修改数组中的值会影响b--[异常机制 defer]--defer func example() {***}这里example函数无论写在父函数的什么位置,都只会在发生异常或者...阅读全文

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

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

Dig101:Go之聊聊struct的内存对齐

Dig101: dig more, simplified more and know more 经过前边几篇文章,相信你也发现了,struct几乎无处不在。 string,slice和map底层都用到了struct。 今天我们来重点关注下struct的内存对齐, 理解它,对更好的运用struct和读懂一些源码库的实现会有很大的帮助。 在此之前,我们先明确几个术语,便于后续分析。 字(word) 是用于表示其自然的数据单位,也叫machine word。字是电脑用来一次性处理事务的一个固定长度。 字长 一个字的位数(即字长)。 现代电脑的字长通常为16、32、64位。(一般N位系统的字长是 N/8 字节。) 电脑中大多数寄存器的大小是一个字长。CPU和内存之间的数据传送单位也通常是一个字长。还...阅读全文

博文 2020-02-19 10:34:17 newbmiao

如何在Go中使用切片容量和长度

来做一个快速测验-以下代码输出什么? vals := make([]int, 5) for i := 0; i < 5; i++ { vals = append(vals, i) } fmt.Println(vals) Run it on the Go Playground → https://play.golang.org/p/7Pg... 如果猜到了[0 0 0 0 0 0 1 2 3 4],那么你是正确的。 等一下为什么不是[0 1 2 3 4]? 如果答错了,也不担心。从其他语言过渡到Go时,这是一个相当普遍的错误,在本文中,我们将介绍为什么输出不符合你的预期以及如何利用Go的细微差别来提高代码效率。 Slices vs Arrays 在Go中,既有数组又有切片。切片和数组之间有很多...阅读全文

博文 2019-11-17 12:32:45 KevinYan

Golang Tips

Go的数组只能有固定的长度,传入变量作为数组长度时,只能创建为定义了size的切片 length := 5 array := [length]int // error: non-constant array bound length array := make([]int, length) Go没有内置的比较整数大笑的方法,需要自己实现 func max(a int, b int) int { if a >= b { return a } else { return b } } Go没有内置的判断array或map是否存在某一个元素的方法,需要通过判断普通的get的error实现 // implement array/list contains func contains(array []i...阅读全文

博文 2020-05-16 02:32:43 Lyudmilalala

【Golang 基础】Go 语言中的基本类型

Go 语言中的基础类型   在 Go 编程语言中,数据类型用于声明函数和属性。数据类型的出现时为了把数据分成所需要用大数据的时候才需要申请大内存,这样可以充分的列用内存。 数值类型 布尔型 bool 布尔型的值只可以是常量 true 或者 false,默认值为 false。 字符串类型 string 编码统一为 UTF-8 编码标识 Unicode 文本,默认值为空字符串。 整型(默认值为 0) uint8: 无符号 8 位整型(0 ~ 255); uint16:无符号 16 位整型(0 ~ 65535); uint32:无符号 32 位整型(0 ~ 4294967295); uint64:无符号 64 位整型(0 ~ 18446744073709551615); int8:有符号 8 位整...阅读全文

博文 2019-03-16 11:34:41 龙泷VK

Golang包——bufio

bufio是“buffered I/O”的缩写 bufio.Reader type Reader struct { buf []byte // 缓存 rd io.Reader // 底层的io.Reader // r:从buf中读走的字节(偏移);w:buf中填充内容的偏移; // w - r 是buf中可被读的长度(缓存数据的大小),也是Buffered()方法的返回值 r, w int err error // 读过程中遇到的错误 lastByte int // 最后一次读到的字节(ReadByte/UnreadByte) lastRuneSize int // 最后一次读到的Rune的大小(ReadRune/UnreadRune) } 初始化函数 //NewReader函数用来返回一个...阅读全文

博文 2019-04-02 20:34:40 羊羽share

如何控制Go编码JSON数据时的行为

今天来聊一下我在Go中对数据进行 JSON 编码时遇到次数最多的三个问题以及解决方法,大家来看看是不是也为这些问题挠掉了不少头发。 自定义JSON键名 这个问题加到文章里我是有所犹豫的,因为基本上大家都会,不过属于同类问题我还是放进来了,对新接触 Go 的同学更友好些。 我们先从最常见的一个问题说,首先在Go 程序中要将数据编码成JSON 格式时通常我们会先定义结构体类型,将数据存放到结构体变量中。 type Address struct { Type string City string Country string } type CreditCard struct { FirstName string LastName string Addresses []*Address Remark...阅读全文

博文 2020-02-02 20:32:38 Kevin

golang学习笔记(一)——golang基础和相关数据结构

小白前端一枚,最近在研究golang,记录自己学习过程中的一些笔记,以及自己的理解。 go中包的依赖管理 go中的切片 byte 和 string go中的Map go中的struct结构体 go中的方法 go中的interface接口 interface{} 原文在我的博客中:https://github.com/forthealll... 欢迎star~ 1、go中包的依赖管理 首先要了解的是GOPATH的含义,GOPATH是go命令依赖的重要变量,可以通过: go env 来查看相应的开发环境中GOPATH的值,也可以通过export GOPATH指定: export GOPATH = /usr/local/go 指定GOPATH目录后, GOPATH目录包含了3个子目录: src存放...阅读全文

博文 2018-12-26 15:34:44 yuxiaoliang

Go 切片绕坑指南

在Go中按值传递时,为什么有时会更改切片? 不知道大家有没有发现在一个函数内部对切片参数进行了排序后也会改变函数外部原来的切片中元素的顺序,但是在函数内向切片增加了元素后在函数外的原切片却没有新增元素,更奇怪的是添加并排序后,外部的切片有可能元素数量和元素顺序都不会变,这是为什么呢?我们通过三个小测验来解释造成这个现象的原因。 测验一 下面的代码的输出什么? func main() { var s []int for i := 1; i <= 3; i++ { s = append(s, i) } reverse(s) fmt.Println(s) } func reverse(s []int) { for i, j := 0, len(s) - 1; i < j; i++ { j = le...阅读全文

博文 2019-11-13 23:34:26 kevinyan

DAY6 GOLANG (六) 数组与切片

数组的定义 var 数组名 [ 数组大小]数据类型 var a [5]int 数组必须定义长度,且一个数组不能动态改变长度。不要担心这个限制,切片(slice)可以弥补这个不足 四种初始化数组的方式 var numArr01 [3]int =[3]int{1, 2, 3} var numArr02 = [3]int{5, 6, 7} //这里的 [...]是规定的写法 var numArr03 = [...]int{8, 9 ,10} var numArr04 = [...]int{1: 800, 0: 900, 2:999} 数组是值类型 在 Go 中数组是值类型而不是引用类型。这意味着当数组变量被赋值时,将会获得原数组(:也就是等号右面的数组)的拷贝。新数组中元素的改变不会影响原数组中元...阅读全文

Go语言之数组与切片

数组数组简介数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。注意:和C中的数组相比,又是有一些不同的:Go中的数组是值类型,换句话说,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份如果Go中的数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针。这个和C要区分开。因此,在Go中如果将数组作为函数的参数传递的话,那效率就肯定没有传递指针高了。数组的长度也是Type的一部分,这样就说明[10]int和[20]int是不一样的数组...阅读全文

博文 2020-05-02 23:34:50 蓝色记忆

Go语言入门(四)Map&函数

map&函数 map类型 map的申明和定义 map是一个key-value的数据结构,是引用类型的数据结构,需要初始化 初始化的时候容量可以定义,也可以不定义 map必须初始化才能使用,否则会panic var a map[key的类型]value的类型 func defineMap() { var user map[string]int = make(map[string]int) user["abc"] = 38 fmt.Printf("user:%v\n",user) a := make(map[string]int) a["jack"] = 1001 a["handsome"] = 1002 a["shark"] = 1003 //根据key获取value fmt.Printf("...阅读全文

博文 2020-03-17 21:33:15 wx5b285b48ed74e

第十一天:golang学习笔记之sort

★sort | sort 包为切片及用户定义的集合的排序操作提供了原语. Interface接口 sort包有一个接口,实现了这个接口就被认为是可排序的,就可以使用sort包的函数了: type Interface interface { // 长度 Len() int // 是否 i < j,升序排序 Less(i, j int) bool // 交换i,j两个元素 Swap(i, j int) } PS:接受者是slice的话不需要用指针 Sort函数 对于实现了Interface接口的变量来说可以使用快排,时间复杂度O(n*log(n)): func Sort(data Interface) 不过快排是不稳定的,可能会被打乱顺序,可以用归并排序,时间复杂度O(n*log(n)): fu...阅读全文

博文 2019-12-28 21:32:43 Macmillan_

golang reflect 反射包

基础类型描述 Type Kind type Kind uint 基础类型常量 const ( Invalid Kind = iota Bool Int Int8 Int16 Int32 Int64 Uint Uint8 Uint16 Uint32 Uint64 Uintptr Float32 Float64 Complex64 Complex128 Array Chan Func Interface Map Ptr Slice String Struct UnsafePointer ) func String 获取类型字符名称 func (k Kind) String() string intType := reflect.Int typeName := intType.String() /...阅读全文

博文 2019-07-30 03:32:39 直立猿

Golang之控制语句

if条件判断 package main //if 条件判断 import "fmt" func main (){ age := 19 if age > 18{ fmt.Printf("澳门线上赌场开业啦") }else if age<18 && age>0{ fmt.Printf("快去上网课吧!!") }else{ fmt.Printf("error!") } } 复制代码for循环 在Go语言中,只有for循环,没有C语言中的while循环。 break 和continue可以改变控制流, break表示从当前循环跳出,结束循环。 continue表示跳过此次循环,进行下一次循环。 for循环包括两种: ​ 1.类似C语言中的循环 需要注意的是,必须将{与for循环的末尾放在同一行。否则...阅读全文

博文 2020-04-09 11:34:57 南风古灶

Golang学习笔记-数组

数组 Go数组声明需要指定元素类型以及元素个数,格式如下: var variable_name [SIZE] variable_type var values [10] int Go使用大括号初始化数组中的元素,如果元素没有指定初始值,默认为零值。 func main() { var values=[10] int{1,2,3,4} println(values[0])//1 println(values[4])//0 } 如果数组有初始值,数组大小使用...代替,Go将会根据元素个数来设置数组大小。 func main() { var values=[...] int{1,2,3,4} println(len(values))//4 } Go支持多维数组,格式如下: var variabl...阅读全文

博文 2019-09-27 23:33:00 aside section ._1OhGeD

Golang——切片slice

切片是一个拥有相同类型元素的可变长度的序列,底层基于数组类型进行封装。 切片是一个引用类型,内部结构包括地址(切片中第一元素的指向的内存空间)、大小(切片中目前元素的个数)和容量(底层数组最大能存放的元素个数),必须初始化才能使用。 值类型,整型、浮点型、布尔型、字符串、数组,声明时就有初始值。 引用类型,声明时候的初始值是nil。nil在内存中是没有位置。 var 变量名 []变量类型 切片使用 func main() { // 直接声明使用 var a = []int{1, 2, 3} fmt.Println(a) //[1 2 3] fmt.Println(a[1]) //2 fmt.Printf("a:%T\n", a) //a:[]int //从数组中得到切片 var b = [1...阅读全文

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

11. 数组和切片

11. 数组和切片 数组 数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(译者注:当然,如果是 interface{} 类型数组,可以包含任意类型) 数组的声明 一个数组的表示形式为 [n]T。n 表示数组中元素的数量,T 代表每个元素的类型。元素的数量 n 也是该类型的一部分(稍后我们将详细讨论这一点)。 可以使用不同的方式来声明数组,让我们一个一个的来看。 package main import ( "fmt" ) func main() { var a [3]int //int array with length 3 fmt.Println(a) } var a[3]int 声明了一个长...阅读全文

博文 2019-08-29 11:32:55 泷汰泱

2019-11-29

[toc]# golang内置类型的底层数据结构## slice切片 ```go//[]int16type = struct []int16 { int16 *array; int len; int cap;//[]bytetype = struct []uint8 { uint8 *array; int len; int cap;}``` - slice中 array 是一个指针,它指向的是一个Array - len 代表的是这个slice中的元素长度 - cap 是slice的容量### 特性slice的Array存储在**连续内存**上: 1. 随机访问很快,适合用下标访问,缓存命...阅读全文

Go Web编程--深入学习解析HTTP请求

之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规范地在项目中应用数据库。不过一直漏掉了一个环节是服务器接收到请求后如何解析请求拿到想要的数据,Go语言使用net/http包中的Request结构体对象来表示HTTP请求,通过Request结构对象上定义的方法和数据字段,应用程序能够便捷地访问和设置HTTP请求中的数据。 一般服务端解析请求的需求有如下几种 HTTP请求头中的字段值 URL 查询字符串中的字段值 请求体中的Form表单数据 请求体中的JSON格式数据 读取客户端的上传的文件 今天这篇文章我们就按照这几种常见的服务端对HTTP请求的...阅读全文

博文 2020-02-25 10:32:47 Kevin

golang学习--slice

切片定义 切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。 数组与切片 切片的数据实际是通过数组来保存的,每个切片都有三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。 举个栗子,底层数组a := [8]int{0, 1, 2, 3, 4, 5, 6, 7}; 切片s1 := a[:5],切片和数组对应关系: Go-slice-2020-05-12-15-23-13 切片s2 := a[3:6],切片和数组对应关系: Go-slice-2020-05-12-15-44-43 指向同一个底层数组的切片修改值 切片是指向底...阅读全文

博文 2020-05-12 19:32:47 玖零儛

Golang切片slice存储微探索

问题 不断将获取的信息存储进切片slice中,为了方便更新信息中的某些字段,建立了一个key和切片项地址的map,一边在切片中存储信息,一边建立Key-Value关系,导致通过key取到的值并不正确,也导致需要更新的字段没有更新,代码类似于: var dataSlice []interface{} var keyToData = make(map[string]interface{}) var id = 0 for info := fetchInfo(key) { dataSlice = append(dataSlice, info) // keyToData[key] = &info keyToData[key] = &dataSlice[id] id++ } info := keyToD...阅读全文

博文 2019-05-24 03:34:40 树袋Papa

3.2.8Golang的map

总目录:https://www.jianshu.com/p/e406a9bc93a9 Golang - 子目录:https://www.jianshu.com/p/8b3e5b2b4497 map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 map的定义 语法: map[键数据类型]值数据类型 map类型的变量默认初始值为nil,需要使用make()函数来分配内存。 语法: make(map[键数据类型]值数据类型, [容量]) map的基本使用 package main import "fmt" func main() { // 定义一个map 并初始化 长度最好在初始化时就设置好 scoreMap := make(map[str...阅读全文

博文 2020-03-17 23:32:46 寒暄_HX

Golang学习笔记--Slice

slice切片(Slice)由指针、长度、容量组成,属于引用类型,是一种基于数组的可变长数据类型,与数组array类型关系密切,其中: 1. 指针指向所引用数组的特定元素,该元素为slice的首元素,但不一定是数组的首元素 2.长度(len)为切片的长度 3.容量,从指针指向的数组的位置,到数组最后元素位置的长度 使用append可以向切片添加元素,像slice添加元素,实际上是向slice所引用的数组添加元素,如果对应数组存在空间添加,则直接添加元素,当切片所引用的数组空间已满,无法再添加元素时,则底层,会新建一个匿名数组,并将slice内的元素从旧的数组中copy到新的匿名数组,该匿名数组的大小,为slice的容量*2,slice则指向这个新的匿名数组,同时在数组中添加元素,完成appe...阅读全文

golang基本题目相关

package main import ( "fmt" "runtime" "strings" "sync" "time" "unsafe" ) //死锁 func main01() { t := time.NewTicker(time.Second * 5) // defer t.Stop() 解决死锁方案,在此处用defer关闭 for range t.C { fmt.Println(1) //stop关闭信号,不关闭通道通信,导致死锁 // t.Stop() } } //字符串处理 func main02() { //只要字符串包含fedabc任何一个就去掉,而且和顺序无关,所以整体都被去除了 s := strings.TrimRight("abcdefedcba", "fedabc"...阅读全文

博文 2020-05-12 19:33:02 强某某

Go字符串初探

这篇博文的知识,主要是阅读了Go的官方博客在2013年发表的一篇,名为《Strings, bytes, runes and characters in Go》的文章,里面解释了Go语言中的string、byte以及rune类型以及Go中的编码方式等内容。 相关概念的辨析 字符串、字符、字节、位: 位bit:bit是计算机中最小的存储单位,一个bit表示一个二进制位,存储0或1。 字节byte:一个byte由8个bit组成。在Go中,byte也是一种类型,其底层实际上是一种uint8类型的别名,主要是为了区分字节类型和uint8类型,可以指代一个ASCII的字符。 字符:字符表示一个可以正常显示的一个符号,譬如一个字符串abc,其中a、b、c都是字符,在Go中,一个字符对应一个rune类型值。...阅读全文

博文 2020-05-02 23:34:50 周小路

golang切片

切片是对数组的抽象 slice 总是指向底层的一个 array。 slice 是一个指向 array 的指针,这是其与 array 不同的地方; slice 是引用类型,这意味着当赋值某个 slice 到另外一个变量,两个引用会指向同一个 array。slice功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 定义切片 var identifier []type 使用make()函数来创建切片 // var slice1 []string = make([]string, len) //简写 sl := make([]int, 10) //也可以指定容量 sl := make([]T, length, capacity) 切...阅读全文

博文 2019-12-30 19:32:41 程序小白菜

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-02-19 10:32:41 newbmiao

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

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

博文 2019-08-01 09:32:40 波罗学

带你学够浪:Go语言基础系列 - 8分钟学复合类型

文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定。可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握。基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Golang 这趟新车。 Hurry up , Let's go ! 前面我们学习过 Golang 中基础数据类型,比如内置类型 int string bool 等,其实还有一些复杂一点点,但很好用的复合类型,类似 C 中的数组和 struct、C++ 中的 map ,今天我们就来学习 Go 中的复合类型。 通过本文的学习你将掌握以下知识: 结构体 指针类型...阅读全文

博文 2020-06-08 01:33:10 柠檬橙1024

Golang——流程控制

常用if和for,switch和goto属于扩展的 注意:Go 没有三目运算符,所以不支持 ?: 形式的条件判断。 if else func main() { a := 1 if a < 0 { //格式比较严格,{不换行 fmt.Println("小于0") } else if a == 0 { fmt.Println("等于0") } else { //格式比较严格,{不换行 fmt.Println("大于0") } } if判断特殊写法 在if表达式之前添加一个执行语句,再根据变量值进行判断。 func main() { if a := 1; a < 0 { fmt.Println("小于0") } else if a == 0 { fmt.Println("等于0") } else ...阅读全文

博文 2020-05-10 19:33:12 Cici冬雪

1018. Binary Prefix Divisible By 5 with Golang

题目描述 Given an array A of 0s and 1s, consider N_i: the i-th subarray from A[0] to A[i] interpreted as a binary number (from most-significant-bit to least-significant-bit.) Return a list of booleans answer, where answer[i] is true if and only if N_i is divisible by 5. Example 1: Input: [0,1,1] Output: [true,false,false] Explanation: The input numbers...阅读全文

博文 2019-06-11 11:32:42 帅气的昵称都有人用了

golang中slice处理遇到的一个关于引用的坑

前两天在解扫地机器人算法的问题时,遇到一个坑 部分代码如下: func move2(startPoint Point) [][]Point { allFootPrint := [][]Point{{startPoint}} for i := 0; i < N; i++ { allNewFootPrint := make([][]Point, 0) for len(allFootPrint) > 0 { curFootPrint := allFootPrint[len(allFootPrint)-1] allFootPrint = allFootPrint[:len(allFootPrint)-1] last := curFootPrint[len(curFootPrint)-1] for _...阅读全文

博文 2019-08-22 15:33:51 ustb80

learn go with tests 学习笔记(二) 数组与切片

知识点 先写测试! Go 有内置的计算测试 覆盖率的工具,它能帮助你发现没有被测试过的区域。我们不需要追求 100% 的测试覆盖率,它只是一个供你获取测试覆盖率的方式。只要你严格遵循 TDD 规范,那你的测试覆盖率就会很接近 100%。 运行: `go test -cover` 你会看到: PASS coverage: 100.0% of statements 数组 数组初始化: 数组的容量是我们在声明它时指定的固定值。我们可以通过两种方式初始化数组: [N]type{value1, value2, ..., valueN} e.g. numbers := [5]int{1, 2, 3, 4, 5} [...]type{value1, value2, ..., valueN} e.g. nu...阅读全文

博文 2020-05-28 21:32:46 硌手小石头

手把手golang教程——数组与切片

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第五篇,这一篇我们将会了解golang中的数组和切片的使用。 数组与切片 golang当中数组和C++中的定义类似,除了变量类型写在后面。 比如我们要声明一个长度为10的int型的数组,会写成这样: var a [10]int 复制代码 数组的长度定义了之后不能改变,这点和C++以及Java是一样的。但是在我们日常使用的过程当中,除非我们非常确定数组长度不会发生变化,否则我们一般不会使用数组,而是使用切片(slice)。 切片有些像是数组的引用,它的大小可以是动态的,因此更加灵活。所以在我们日常的使用当中,比数组应用更广。 切片的声明源于数组,和Python中的list切片类似,我们通过指定左右区间的范围来声...阅读全文

博文 2020-05-17 22:34:25 承志