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

golang截取字符串

//截取字符串 start 起点下标 length 需要截取的长度 func Substr(str string, start int, length int) string { rs := []rune(str) rl := len(rs) end := 0 if start < 0 { start = rl - 1 + start } end = start + length if start > end { start, end = end, start } if start < 0 { start = 0 } if start > rl { start = rl } if end < 0 { end = 0 } if end > rl { end = rl } return stri...阅读全文

博文 2015-06-18 17:04:30 u012210379

golang substring

在java下习惯了String.subString(start,end) 然后再golang继续敲substring木有了,看了下代码,也是原生支持的 但是百度发现有些人竟然把字符串转成字符数组再根据下标取,简直误人子弟 go的string 支持直接根据 index 截取字符串的 例如 str := "hello world" fmt.Print(str[0:5]) 运行的时候将会输出 hello 很简单...阅读全文

博文 2015-02-28 03:00:01 modprobe

go语言实现两个数组合并(merge)

//x数组,i:x数组的起始下标 y数组,j:y数组的起始下标 //说明:x和y数组都是有序的数组 func merge(x []int, i int, y []int, j int) []int { xlen := len(x)//x数组的长度 ylen := len(y)//y数组的长度 z := make([]int, xlen+ylen)//创建一个大小为xlen+ylen的数组切片 k := 0//数组切片z的下标 for i if x[i] < y[j] {//把小数放在数组切片z里 z[k] = x[i] i++ } else { z[k] = y[j] j++ } k++ } for i != xlen {//把x到xlen-1的数据也存入z中 z[k] = x[i] k++...阅读全文

博文 2014-10-04 19:26:25 zongjh

golang silce/append的使用

初始化 切片可以通过数组来初始化,也可以通过内置函数make()初始化 .初始化时len=cap,在追加元素时如果容量cap不足时将按len的2倍扩容 查看示例代码,在线运行示例代码 s :=[] int {1,2,3 } 直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3 s := arr[:] 初始化切片s,是数组arr的引用 s := arr[startIndex:endIndex] 将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片 s := arr[startIndex:] 缺省endIndex时将表示一直到arr的最后一个元素 s := arr[:endIndex] 缺省startIndex时将表示...阅读全文

博文 2015-08-13 11:00:12 webyh

Go语言截取字符串

go没有像php或js那样的Substr函数,而且如果直接用string加下标的方式输出的话,输出的是UTF8编码。 Go语言中用下标访问string类型(中文字符),输出的是什么编码? 下面提供简单的字符串截取方法: rs := []rune(str) fmt.Println(string(rs[起始位置:截取长度])) $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('

    ').addClass('pre-numbering').hide(); $(this).addClass(...阅读全文

博文 2016-04-30 00:00:02 Jesounao

golang 数组 slice 乱序

数组乱序 方法1.sliceOutOfOrder 选定随机数r 将下标r和下边i交换,i– ,就是和当前最后一位交换 方法2.rand.Perm(数组长度) 将原数组下标按照随机出来的数据赋值给另一数组 package main import "fmt" import "math/rand" import "time" var ( rr = rand.New(rand.NewSource(time.Now().UnixNano())) a1 = [2]int{} a2 = [10]int{} ) func main() { a := []int{0, 1} for i := 0; i < 10000; i++ { randslice() //fmt.Println(rr.Intn(10)) ...阅读全文

博文 2015-10-20 18:00:37 csapr1987

go语言实现两个数组合并(merge)(二)

package main import ( "fmt" ) func Merge() { a := []int{3,6,9, 4,5,45} z := merge2(a, 0, 2, 5, 6) fmt.Printf("%#v\n", z) } //x数组,下标p,q,r 元素个数m。x[p]~x[q]及x[q+1]~x[r]已按递增排序 func merge2(x []int, p, q, r, m int) []int { z := make([]int, m) k := 0 a := q b := q + 1 for p if x[p] z[k] = x[p] p++ } else { z[k] = x[b] b++ } k++ } for p != a+1 { z[k] = x[p]...阅读全文

博文 2014-10-04 19:26:25 zongjh

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

rune

在Go当中 string底层是用byte数组存的,并且是不可以改变的。 例如 s:="Go编程" fmt.Println(len(s)) 输出结果应该是8因为中文字符是用3个字节存的。 len(string(rune('编')))的结果是3 如果想要获得我们想要的情况的话,需要先转换为rune切片再使用内置的len函数 fmt.Println(len([]rune(s))) 结果就是4了。 所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下表访问...阅读全文

go语言中int和byte转换

主机字节序 主机字节序模式有两种,大端数据模式和小端数据模式,在网络编程中应注意这两者的区别,以保证数据处理的正确性;例如网络的数据是以大端数据模式进行交互,而我们的主机大多数以小端模式处理,如果不转换,数据会混乱 参考;一般来说,两个主机在网络通信需要经过如下转换过程:主机字节序 —> 网络字节序 -> 主机字节序 大端小端区别 大端模式:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端 低地址 --------------------> 高地址 高位字节 地位字节 小端模式:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端 低地址 --------------------> 高地址 低位字节 高位字节 什么是高位字...阅读全文

博文 2018-11-11 12:34:39 wuzhc

堆排序算法及go语言实现

堆分最大堆、最小堆。 以最大堆为例。 最大堆是一个完全二叉树。 并且要求每个结点的值必须大于他的两个子节点。 所以他的根结点一定是最大值。 但是左右结点大小不一定。 用数组表示的二叉树,可以这样表达: i的子节点下标为 2*i + 1 和 2 * i + 2. i的父节点下标为 (i-1)/2。 对于数组长度length,大于length/2的下标一定没有子节点. 排序思想是构建最大堆,之后根节点就是最大的一个了,把根结点拿出来,再把剩下的堆整理成最大堆,再把根拿出来。循环直到最后一个元素。 func HeapSort(values []int) { buildHeap(values) for i := len(values); i > 1; i-- { values[0], values[...阅读全文

博文 2016-04-15 16:00:02 zhaoguoguang

二分查找法(Golang版本)

一组数据要进行二分查找,那么这个要查找的元素是有序,并且是连续存放(数组)。这样才可以进行二分查找。 下面首先来创建一个文件和数组 package main import ( "fmt" "math" ) type DataStruct struct { Data []int } func main() { a1 := DataStruct{[]int{1, 2, 5, 7, 15, 25, 30, 36, 39, 51, 67, 78, 80, 82, 85, 91, 92, 97}} fmt.Println(a1) } 数组a1是一个从小到大的有序数组,总共有18个元素 假设说我要查找30这个值,如果按照循环的查找方法,找到30这个值要执行7次。那么如果是按照二分查找呢?好吧,二分查找的...阅读全文

博文 2017-05-08 03:00:28 Zorn

window.history.go()方法

history是你浏览过的网页的url(简单的说就是网址)的集合,也就是你的浏览器里的那个历史记录。它在js里是一个内置对象,就跟document一样,它有自己的方法,go就是其中一个。 这个方法的参数是一个数字,它指定要定位的url相对当前页面url位置的下标。当前的url下标为0,所以window.history.go(-1)就是要定位到相对当前页面下标为-1的页面,也就是之前刚刚访问的页面。 再举个例子: 你在地址栏访问百度页面(http://www.baidu.com),这时history里就把这个地址加到了它的集合里,并且将下标定为0. 通过搜索,你访问了新浪的页面(http://www.sina.cn),浏览器又将这个网址放在了history里,并将这个网址的下标定为0,而之前访...阅读全文

博文 2016-09-12 09:00:04 u012028371

Golang 语言中的 Slice

概念 Slice切片是对底层数组Array的封装,在内存中的存储本质就是数组,体现为连续的内存块,Go语言中的数组定义之后,长度就已经固定了,在使用过程中并不能改变其长度,而Slice就可以看做一个长度可变的数组进行使用,最为关键的,是数组在使用的过程中都是值传递,将一个数组赋值给一个新变量或作为方法参数传递时,是将源数组在内存中完全复制了一份,而不是引用源数组在内存中的地址,为了满足内存空间的复用和数组元素的值的一致性的应用需求,Slice出现了,每个Slice都是都源数组在内存中的地址的一个引用,源数组可以衍生出多个Slice,Slice也可以继续衍生Slice,而内存中,始终只有源数组,当然,也有例外,后边再说。 用法 1.Slice的定义 Slice可以通过两种方式定义,一种是从源数...阅读全文

Go学习笔记之复合数据

个人理解的复合数据是由其他数据格式复合而成。 1、array 数组的类型格式为单个数据单元类型+长度构成,如 [2]int,其中 [2] 代表数组的长度,而 int 代表每个单元都是整形。 数组的元素操作也是通过操作下标,即 arr[1] ,取出数组 arr 中的第2个元素,数组下标从0开始算起。 数组的长度可以通过 len(arr) 获取数组 arr 的长度。 1-1 声明和初始化 数组声明格式为 var 数组名 [数组长度]元素类型 例如: var arr [2]int arr[0] = 1 // 声明以后,就可以使用index进行赋值 声明数组后,未进行初始化,则每个数据单元的初值是单元数据类型的默认值,例如 int 就是 0 ,string 是空 "" 声明的同时也可以初始化 var...阅读全文

博文 2015-06-17 20:08:20 hnxxwyq

<13> go collection-func

集合的操作: import ( "fmt" "strings" ) // 返回数组下标,找不到返回-1 func Index(vs []string, t string) int { for i, v := range vs { if v == t { return i } } return -1 } // 是否包含t字符串 func Include(vs []string, t string) bool { return Index(vs, t) >= 0 } // 任何一个字串符合f即返回true func Any(vs []string, f func(string) bool) bool { for _, v := range vs { if f(v) { return true }...阅读全文

博文 2015-12-26 15:00:01 a11101171

老虞学GoLang笔记-数组和切片

数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的入参传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。 初始化 数组的初始化有多种形式,查看示例代码 , 在线运行示例代码 [5] int {1,2,3,4,5} 长度为5的数组,其元素值依次为:1,2,3,4,5 [5] int {1,2} 长度为5的数组,其元素值依次为:1,2,0,0,0 。在初始化时没有指定初值的元素将会赋值为其元素类型int的默认值0,string的默认值是"" [...] int {1,2,3,4,5} 长度为5的数组,其长度...阅读全文

博文 2015-07-21 15:00:03 Gopher老虞

golang模仿c代码写的100的阶乘代码

``` package main import ( "fmt" "math" ) //获取阶乘的位数 func Get(number int) int { sum := 1.0 for i := 1; i < number+1; i++ { sum += math.Log10(float64(i)) } return int(sum) } //初始化结果数组 func InitArray(length int) []int { array := make([]int, length) array[0] = 1 return array } //开始计算阶乘的值 func Getvalue(number int) ...阅读全文

golang版KMP算法 实现判断旋转词

参照java版的写的,作者学习golang,进过一番折腾终于对kmp算法了解了,有不对的地方改正 1 package main 2 3 import ( 4 "fmt" 5 // "strings" 6 ) 7 8 //判断是否为旋转词 9 func isRotation(a, b string) bool { 10 if a == "" || b == "" { //如果俩个输入的字符串为空的话 直接return false 11 return false 12 } 13 b2 := b + b //把b相加起来拼成长 串 14 return getIndexOf(b2, a) != -1 //如果getIndexOf 为-1 则返回false 15 } 16 17 func getInd...阅读全文

博文 2016-08-30 16:00:00 hitxwk

《Go语言编程》中calc修改后可在Windows执行的源码

 《Go语言编程》中 第一个项目是calc,按照作者在书中的描述,在linux下运行没有问题。但经过实践,程序运行后不能打印出书中所描述的效果。 经过测试,发现windows命令行在执行calc add 2 3时,把calc也作为一个参数,这样使得真个程序中的参数数组下标与书中描述的有所不同。 现上传修改后的程序,供大家参考。 calc.go package main import "os" import "fmt" import "simplemath" import "strconv" var Usage = func() { fmt.Println("USAGE: calc command [arguments] ...") fmt.Println("\nThe commands a...阅读全文

博文 2016-02-24 11:00:01 wilsonzane

HDU 2722 Here We Go(relians) Again

Here We Go(relians) Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 162 Accepted Submission(s): 99 Problem Description The Gorelians are a warlike race that travel the universe conquering new worlds as a form of recreation. Given their violent, fun-loving nature, keeping their leaders aliv...阅读全文

博文 2016-02-03 23:00:04 sgeteternal

Go语言核心——slice切片

Slice是长度可变的元素序列(数组不可变),每个元素都有相同的类型。slice类型写作[]T,其中T代表slice中的元素类型;slice和数组写法很像,只是没有指定长度。 数组和slice之间的联系非常紧密。slice是非常轻量的数据结构,它是引用类型,指向底层的一个数组,该数组被称之为slice的底层数组,slice可以访问底层数组的某个子序列,也可以访问整个数组。一个slice由三个部分组成:指针、长度、容量,指针指向了slice中第一个元素对应的底层数组元素的地址,因为slice未必是从数组第一个元素开始,因此slice中的第一个元素未必是数组中的第一个元素。长度对应slice中的元素数目,长度是不能超过容量的;容量一般是从slice中第一个元素对应底层数组中的开始位置,到底层数组...阅读全文

博文 2016-04-28 08:00:01 zealifree005

(一)GoLang小记 —— 数组与数组切片

一、创建方式 主要分为: 1、完整创建; 2、切片创建; //创建数组(声明长度) var array1 = [5]int{1, 2, 3} fmt.Printf("array1--- type:%T \n", array1) rangeIntPrint(array1[:]) //创建数组(不声明长度) var array2 = [...]int{6, 7, 8} fmt.Printf("array2--- type:%T \n", array2) rangeIntPrint(array2[:]) //创建数组切片 var array3 = []int{9, 10, 11, 12} fmt.Printf("array3--- type:%T \n", array3) rangeIntPrin...阅读全文

博文 2016-10-19 11:00:17 水果糖

leetcode刷题记录Array篇(26&27~Remove Element)

26.Remove Duplicates from Sorted Array 题目:Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with constant memory. 翻译:给定一个排序好了的数组,删除重复的位置,使每个元素只显示一次并返回新的长度。不要为另一个数组分配额外的空间,您必须使用常量内存来进行此操作。 思路:就是去除数组中重复的数,不过要求...阅读全文

博文 2017-04-24 12:54:00 L千年老妖

golang 多个值对比

package main import ( "fmt" "reflect" ) func main() { fmt.Println(contrast(1, 2, 3)) } func contrast(val ...interface{}) bool { var ( flag bool = true val_len int = len(val) next_key int ) //循环传递过来的数据 for key := 0; key < val_len; key++ { next_key = key + 1 //防止数组越界 如果获取下个key 超过数组的长度说明取完了 如果等于也说明这个下标对比完了 if next_key > val_len || next_key == val_len ...阅读全文

博文 2016-11-28 12:00:06 liangguangchuan

leetcode刷题记录Array篇(1&4~Two Sum&Median of Two Sorted Arrays)

今天写了一道比较简单的和一道难的 #Two Sum 题目:Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. 简单翻译,就是在一个数组中寻找相加和target值相等的两个数的下标,只要返回最先匹配的,并且下标相等的不算。 golang代码: package main import ( "fmt" ) func main()...阅读全文

博文 2017-04-19 08:56:48 L千年老妖

go语言学习笔记

//变量声明 i := 10; //直接声明并赋值 j := 100; i,j=j,i //变换i,j的值 fmt.Printf("i=%d j=%d\n",i,j)//格式化输了 fmt.Println("i=",i);//不能使用%d等 var a int var b [10]int var c []int //数组切片,相当于vector可变数组 var s string var p *int //指针 var m map[string]int //key为string类型,value为int类型 var fun func(a int) int //函数 var st struct ( //结构体 f int str string ) //或者也可以这样一起声明 var ( v1 in...阅读全文

博文 2016-01-21 10:00:02 u011466175

golang substring

在java下习惯了String.subString(start,end) 然后再golang继续敲substring木有了,看了下代码,也是原生支持的 但是百度发现有些人竟然把字符串转成字符数组再根据下标取,简直误人子弟 go的string 支持直接根据 index 截取字符串的 例如 str := "hello world" fmt.Print(str[0:5]) 运行的时候将会输出 hello 很简单...阅读全文

博文 2016-11-08 03:00:05 modprobe

Golang数组和切片

数组 声明数组 数组同样使用倒置的方式来声明,并且声明数组的时候需要指定数组长度。所以声明数组需要使用[数组长度]类型的方式来声明,如果需要在声明的同时初始化,还可以添加{}初始化列表。 //声明数组 var array1 [2]int array1[0] = 1 array1[1] = 2 fmt.Println(array1) //声明的同时初始化 array2 := [3]int{1, 2, 3} fmt.Println(array2) 数组一旦声明,长度就是固定不可变的了。 访问数组 这个比较简单,和一般编程语言一样。下面是一个小例子。 //访问数组 numbers := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} for i := 0; i < l...阅读全文

博文 2017-07-07 15:07:01 乐百川

Golang range 的一些坑

先举个栗子: package main import ( "fmt" ) type Foo struct { Bar string } func main() { list := []Foo{Foo{"bar1"}, Foo{"bar2"}, Foo{"bar3"}} for i, v := range list { v.Bar = "change" + string(i) } fmt.Println(list) } 我们期望的结果是 [{change1} {change2} {change3}] 但是实际输出的结果是 [{test1} {test2} {test3}] 为什么没有改变? 其实 for range 中的 v 是一个数组元素值的拷贝, 而不是数组元素本身。所以,修改数组元素需要...阅读全文

博文 2018-10-18 20:34:39 youmisun

golang nocopy

在现实的项目开发过程中,都有 Nocpoy 对象的需求,那么如何在golang中实现这个特性呢?查看 src/sync中的包,很多都有 noCopy 结构体,其定义如下: // noCopy may be embedded into structs which must not be copied // after the first use.//// See https://golang.org/issues/8005#issuecomment-190753527 // for details. type noCopy struct{} // Lock is a no-op used by -copylocks checker from `go vet`. func (*noCopy) L...阅读全文

博文 2018-07-09 23:34:42 sanerersan

golang插入排序算法

插入排序算法原理:顺序从序列中取一个数与左侧的元素们做比较,如果左侧的元素比取的数大,就向右移,直到把取的数插入到不小于左侧元素的位置处。类似于扑克牌的点数排序。 package main import "fmt" func main() { numbers := []int{6, 2, 7, 3, 8, 5} InsertSort(numbers) fmt.Println(numbers) } func InsertSort(values []int) { length := len(values) if length <= 1 { return } for i := 1; i < length; i++ { tmp := values[i] // 从第二个数开始,从左向右依次取数 key...阅读全文

博文 2018-07-02 21:35:45 ustb80

Golang学习(12)——regex包

Golang学习 - regexp 包------------------------// 函数// 判断在 b(s、r)中能否找到 pattern 所匹配的字符串func Match(pattern string, b []byte) (matched bool, err error)func MatchString(pattern string, s string) (matched bool, err error)func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)// 将 s 中的正则表达式元字符转义成普通字符。func QuoteMeta(s string) string-------...阅读全文

博文 2017-02-10 10:19:39 1160636144

golang选择排序算法

选择排序的原理: 每次从余下的数中找最小的,并排到余下的数的最开头。 package main import "fmt" func main() { numbers := []int{6, 2, 7, 5, 8, 9} SelectSort(numbers) fmt.Println(numbers) } func SelectSort(values []int) { length := len(values) if length <= 1 { return } for i := 0; i < length; i++ { min := i // 初始的最小值位置从0开始,依次向右 // 从i右侧的所有元素中找出当前最小值所在的下标 for j := length - 1; j > i; j--...阅读全文

博文 2018-07-02 21:35:45 ustb80

go语言数组

1 go语言数组简介 数组是Go语言编程中最常用的数据结构之一。顾名思义,数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。 在Go语言中数组是一个值类型(value type)。是真真实实的数组,而不是一个指向数组内存起始位置的指针,也不能和同类型的指针进行转化,这一点严重不同于C语言。所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。如果将数组作为函数的参数类型,则在函数调用时该参数将发生数据复制。因此,在函数体中无法修改传入的数组的内容,因为函数内操作的只是所传入数组的一个副本。 2 数组定义 定义方式如下 var arr [n]type n表示数组长度,type表示数组存储类型。 在Go语言中,...阅读全文

博文 2016-09-07 02:01:07 wangzhanzheng

go语言数组

1 go语言数组简介 数组是Go语言编程中最常用的数据结构之一。顾名思义,数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。 在Go语言中数组是一个值类型(value type)。是真真实实的数组,而不是一个指向数组内存起始位置的指针,也不能和同类型的指针进行转化,这一点严重不同于C语言。所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。如果将数组作为函数的参数类型,则在函数调用时该参数将发生数据复制。因此,在函数体中无法修改传入的数组的内容,因为函数内操作的只是所传入数组的一个副本。 2 数组定义 定义方式如下 var arr [n]type n表示数组长度,type表示数组存储类型。 在Go语言中,...阅读全文

博文 2016-09-07 02:00:02 wangzhanzheng

使用go实现的排序算法

go实现的部分排序算法,待整理 // algorithm project main.go package main import ( "fmt" ) func main() { arr := []int{50, 45, 42, 30, 25, 20, 20, 5, 60, 3, 23, 50, 29, 235, 9} //arr := []int{50, 235, 60} fmt.Println(arr) fmt.Println("----------") //直接插入排序 //arr1 := insertSort(arr) //arr1 := selectSort(arr) //a, b := selectMinAndMax(arr, 0, 14) //arr1 := selectSort...阅读全文

博文 2017-09-25 11:34:46 light

TODO:字节的那点事Go篇

TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64)在Golang中string底层是由byte数组组成的。fmt.Println(len(“dsd好”))输出的长度是6fmt.Println(len(string(rune(‘好’))))输出的长度是3fmt.Println(len([]rune(“好的2s”)))输出的长度是4所以用string存储unicode的话,如果有中文(中文是由3个字节组成),按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下标访问。UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称...阅读全文

博文 2017-02-10 15:50:56 OneTODO

2018-08-16-string rune byte 的关系

在Go语言中string 底层是用byte数组存储的,并且是不可以改变的 例如 s:="Go编程" fmt.Println(len(s))输出结果应该是8因为中文字符是用3个字节存的。 len(string(rune('编')))的结果是3 如果想要获得我们想要的情况的话,需要先转换为rune切片再使用内置的len函数fmt.Println(len([]rune(s)))结果就是4了。 所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下表访问。 rune在golang 中是int32 的别名,被用来区分字符值和整数值。通过上述例子可以将rune理解为一个可以表示unicode 编码的值i...阅读全文

博文 2018-08-16 15:34:54 ihujian

Golang学习笔记之切片(slice)

切片slice:切片是对数组的抽象。切片在内存中占24个字节 runtime.h struct Slice{ // must not move anything byte* array; // actual data uintgo len; // number of elements uintgo cap; // allocated number of elements }; 切片包含长度、容量、以及一个指向首元素的指针 • 引⽤类型。但⾃⾝是结构体,值拷⻉传递。 • 属性 len 表⽰可⽤元素数量,读写操作不能超过该限制。 • 属性 cap 表⽰最⼤扩张容量,不能超出数组限制。 • 如果 slice == nil,那么 len、 cap 结果都等于 0。 • 作为变长数组的替代方案,可以关...阅读全文

博文 2018-12-05 18:34:43 学生黄哲

golang数组

数组是golang中最常用的一种数据结构,数组就是同一类型数据的有序集合 定义一个数组 格式: var name [n]type n为数组长度,n>=0 且无法修改,type为数组的元素类型如: var a [2]int 上面的例子定义了一个长度为2,元素类型为int的数组 数组长度作为数组类型的一部分,数组长度加数组元素类型才组成一个数组类型,如** [2]int** 与 ** [1]int** 不是同一个类型 所以不可以使用 == != 或进行赋值操作, 下面的程序是错误的 var a [2]int var b [1]int //下面的赋值是错误的 a = b [2]int 与 [1]int 不是同一个类型 相同类型的的数组可以进行 ==与!=的比较操作 var a [2]int var...阅读全文

博文 2019-04-29 17:34:44 我傻笑你跑掉

golang 实现二分法查找(无bug版本)

## 二分法查找 > ```go ### 常规写法 func dichotomy(val int, lst []int) int { //实例三个值, 用于缩小范围,快速查找 //start=0 代表下标为0 //end=len(lst) -1 代表数组最大下标 //mid=初使为0 start, end, mid := 0, len(lst)-1, 0 for { mid = (start + end) / 2 //求中间下位值, golang整形除取最小值,相当于math.Floor fmt.Printf("start:%d, end:%d, ...阅读全文

插入排序

Java代码实现 public static void insertSort(int[] arr) { // 开始下标 int start = 1; // 数组长度 int len = arr.length; for (; start < len; start++) { // 移动法临时变量 int tmp = arr[start]; int j = start - 1; for (; j >= 0 && arr[j] > tmp; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = tmp; } } GoLang代码实现 func insertSort(arr []int) { // 从下标为1的数组开始排序 start := 1 // 数组长度 len ...阅读全文

博文 2019-01-17 18:34:42 a丶逍遥子

【GoLang那点事】链表-删除排序链表中的重复元素,你能想到几种解法?

#### 问题 > 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字 #### 示例1 > 输入: 1->2->3->3->4->4->5 > 输出: 1->2->5 #### 示例二 > 输入: 1->1->1->2->3 > 输出: 2->3 #### 解法一 * 提取问题关键字,有序链表,删除重复,因为是有序的,所以重复的元素一定相邻的,不会出现(2->3-2)这种情况的,最简单的办法,遍历链表,利用数据结构map,key是链表节点的值,value是值在链表中出现的次数,最终次数大于1的就是重复的,等于1的就是不重复的,但是map元素是无序的,所以我们对剩余的元素排序,最后转化为链表。 * 麻烦吗? 我觉得很麻烦,也没人这么实现。看到上面给的算法我就...阅读全文

博文 2019-08-02 09:26:14 SunPengWei

程序猿修仙之路--数据结构之你是否真的懂数组?

但凡IT江湖侠士,算法与数据结构为必修之课。早有前辈已经明确指出:程序=算法+数据结构 。要想在之后的江湖历练中通关,数据结构必不可少。数据结构与算法相辅相成,亦是阴阳互补之法。 开篇 说道数组,几乎每个IT江湖人士都不陌生,甚至过半人还会很自信觉的它很简单。 的确,在菜菜所知道的编程语言中几乎都会有数组的影子。不过它不仅仅是一种基础的数据类型,更是一种基础的数据结构。如果你觉的对数组足够了解,那能不能回答一下: 数组的本质定义? 数组的内存结构? 数组有什么优势? 数组有什么劣势? 数组的应用场景? 数组为什么大部分都从0开始编号? 数组能否用其他容器来代替,例如c#中的List? 定义 百科 所谓数组,是相同的元素序列。数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按无...阅读全文

数组与切片

# 数组 ### 定义:是同一种数据类型的**固定长度**的序列。var a [len]int #### 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型,数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic #### 数组是值类型,因此改变副本的值,不会改变本身的值 example:fibonacci非递归: ``` func fibonacci() { fib := [20]int64{0: 1, 1: 1} for i := range fib { if i == 0 || i == 1 { continue } fib[i] = fib[i-1] + f...阅读全文

博文 2018-10-12 16:12:36 ace_kylin

数组Array

Golang Array和以往认知的数组有很大不同。 1. 数组:是同一种数据类型的固定长度的序列。 2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。 3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。 4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1 for i := 0; i < len(a); i++ { } for index, v := range a { } 5. 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic 6. 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会...阅读全文

博文 2019-02-20 01:34:43 weifansym

【GoLang那点事】深入Go的Map使用和实现原理

#### 开篇语 > Map是一种常用的kv数据结构,程序设计中经常使用,且作为一种最基础的数据结构,很多编程语言本身提供的api都会有实现,Go也不例外,今天我们将从一下三个方面为大家分析Go中的Map。 * 什么是Map? * Go中如何使用Map? * 以及Go的Map实现机制是什么样? > 希望通过这几个方面的讲解,让大家真正理解Go的Map使用和实现。 #### 什么是Map ##### key,value存储 > 最通俗的话说Map是一种通过key来获取value的一个数据结构,其底层存储方式为数组,在存储时key不能重复,当key重复时,value进行覆盖,我们通过key进行hash运算(可以简单理解为把key转化为一个整形数字)然后对数组的长度取余,得到key存储在数组的哪个...阅读全文

博文 2019-07-27 14:56:59 SunPengWei