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

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语言渐入佳境-网络[2]-ipmask

IPMaskipmask存储掩码,掩码是指定ip地址中前多少位是网络地址的。type IPMask []byte测试本文链接: https://dreamerjonson.com/2019/01/18/go-network-2-ipmask/版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处! go语言交流2群:71338526...阅读全文

博文 2020-01-09 23:33:19 jonson_jackson

Windows ECS上如何以正确的姿势配置FTP Server使用NAS

摘要: 如何在Windows ECS上正确配置FTP,使FTP用户可以访问ECS上挂载的NAS文件系统。 以下配置以Windows2008 + FileZillaServer为例,介绍如何在Windows ECS上配置FTP服务器,并将NAS文件系统输出给FTP的用户。 (以下内容假设用户已经安装FileZillaServer) 第一步:配置FTP Service以指定用户运行。 由于用户挂载NAS的一般是当前登录用户,比如Administrator,但默认FileZillaServer是以”SYSTEM”用户运行,Windows默认对于挂载的NAS映射的盘符(比如Z:)是对不同用户隔离的,因此为了让FTP服务程序可以访问NAS,需要配置FTP服务以相同的用户...阅读全文

DockOne技术分享(十八):一篇文章带你了解Flannel

【编者的话】Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。这次的分享内容将从Flannel的介绍、工作原理及安装和配置三方面来介绍这个工具的使用方法。 第一部分:Flannel介绍Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。 在Kubernetes的网络模型中,假设了每个物理节点应该具备一段“属于同一个内网IP段内”的“专用的子网IP”。例如: 节点A:10.0.1.0/24 节点B:10.0.2....阅读全文

博文 2017-06-25 15:01:11 FanLin

载:深入 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

错误处理

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 吃猪的蛇

【Go】获取用户真实的ip地址

文链接: blog.thinkeridea.com/201903/go/g… 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip 非常困难,大多数的框架及工具库都会封装各种获取用户真实 ip 的方法,在 exnet 包中也封装了各种 ip 相关的操作,其中就包含获取客户端 ip 的方法,比较实用的方法如下: func ClientIP(r *http.Request) string ClientIP 尽最大努力实现获取客户端 IP 的算法。 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。 func ClientPublicIP(r *http.Request) string ClientPu...阅读全文

博文 2019-07-08 10:34:22 thinkeridea

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

go语言渐入佳境-网络[3]-IPAddr

IPAddrtype IPAddr {IP IP}此类型的主要用途是对IP主机名执行DNS查找。测试ResolveIPAddr函数将对主机名执行DNS查找,并返回单个IP地址。但是,主机可能有多个IP地址,通常来自多个网卡。它们也可能有多个主机名,充当别名。其中一个地址将被标记为“规范(canonical)”主机名。如果您希望找到规范名称,请使用。测试2本文链接: https://dreamerjonson.com/2019/01/18/go-network-3-IPAddr/版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处! go语言交流2群:71338526...阅读全文

博文 2020-01-09 23:33:19 jonson_jackson

如何使用 golang 写 IP地址生成器

这个是同事提的一个需求,希望能给出一个开始地址和结束地址,能打印出两者之间的所有地址。这个本来可以简单的通过shell也可以完成(满255进1),不过刚好最近在学习golang,所以就想着用golang的位运算实现下ip地址的生成。原理也比较简单,先将IP地址数字化,通过循环遍历前后两个地址中间的数值,再将该数值转化为IP就OK了。代码如下: //code from www.[linux](https://www.linuxprobe.com/ "linux")probe.com package main import ( "bytes" "encoding/binary" "fmt" "net" "strconv" ) //ip到数字 func ip2Long(ip string) uin...阅读全文

博文 2018-11-27 18:34:42 易霂

兄弟连区块链培训之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 兄弟连区块链培训

云服务器使用教程-基于 CentOS 搭建 FTP 文件服务

云服务器使用教程之:基于 CentOS 搭建 FTP 文件服务以前尊托云数发表过用宝塔、WDCP等环境软件搭建服务器环境的教程,今天我们来学习单项的FTP文件服务搭建。FTP 是一个很实用的文件传输协议,方便在客户端和服务器之间进行文件的传输。是Internet中应用非常广泛的服务之一。它可根据实际需要设置各用户的使用权限,同时还具有跨平台的特性,即在UNIX、Linux和Windows等操作系统中都可实现FTP客户端和服务器,相互之间可跨平台进行文件的传输。因此,FTP服务是网络中经常采用的资源共享方式之一。很多新手站长只会用windows系统的服务器,使用phpstudy或者wampserver这类软件来搭建环境,虽然可以运行网站,但并不是最优方案,如果你想入行专业站长行列,linux系...阅读全文

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

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(一)

p2p的网络发现协议使用了Kademlia protocol 来处理网络的节点发现。节点查找和节点更新。Kademlia protocol使用了UDP协议来进行网络通信。阅读这部分的代码建议先看看references里面的Kademlia协议简介来看看什么是Kademlia协议。首先看看数据结构。 网络传输了4种数据包(UDP协议是基于报文的协议。传输的是一个一个数据包),分别是ping,pong,findnode和neighbors。 下面分别定义了4种报文的格式。 // RPC packet types const ( pingPacket = iota + 1 // zero is 'reserved' pongPacket findnodePacket neighborsPacket...阅读全文

博文 2018-10-17 14:34:42 兄弟连区块链培训

Go教程第三篇:变量

Go教程第三篇:变量 本文是《Golang系列教程》第三篇文章,它主要讲解golang中变量的用法。 什么是变量 变量是一个内存位置的名称,这个内存位置是用于指定类型的值。在go语言中,有许多不同的语法来声明一个变量。 声明单一变量 声明单一变量的语法: var name type。 package main import "fmt" func main() { var age int // 变量声明 fmt.Println("my age is", age) } var age int 语句声明了一个名称为age,数据类型为int的变量。我们没有为该变量指定任何值。 如果一个变量没有指定任何值的话,go会自动地把它初始化为该数据类型所对应的零值。 在本例子中,age会被指定一个0值。如果你...阅读全文

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

兄弟连区块链入门教程以太坊源码分析p2p-dial.go源码分析

dial.go在p2p里面主要负责建立链接的部分工作。 比如发现建立链接的节点。 与节点建立链接。 通过discover来查找指定节点的地址。等功能。dial.go里面利用一个dailstate的数据结构来存储中间状态,是dial功能里面的核心数据结构。 // dialstate schedules dials and discovery lookups. // it get's a chance to compute new tasks on every iteration // of the main loop in Server.run. type dialstate struct { maxDynDials int //最大的动态节点链接数量 ntab discoverTable /...阅读全文

博文 2018-10-25 16:34:43 兄弟连区块链培训

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的注意事项

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

轻松理解Go函数传参内幕

一、内置类型作为参数传递 首先要明确一点:golang语言中是没有引用传递的 先上结论: golang的所有内置类型()作为函数参数传递都是传值的方式,需要注意的是:array、slice和map作为函数参数时也是传值,但是如果对结构内元素进行的修改,修改的是原数据。如果是对其进行整体赋值,则不会修改原数据,相当于拷贝出一个新的临时变量。通过传递指针参数实现修改原数据。 Go内置基础类型如下 布尔型:bool 整型:int int64 int32 int16 int8 uint8 uint16 uint32 uint64 uint 浮点型:float32 float64 复数型:complex64 complex128 字符串:string 字符型:rune 错误型:error 未命名类型:...阅读全文

数组、切片

引用 数组、字符串和切片 Go数组中的索引问题 深入解析 Go 中 Slice 底层实现 Golang 入门 : 切片(slice) 一、数组 var a [3]int // 定义长度为3的int型数组, 元素全部为0 var b = [...]int{1, 2, 3} // 定义长度为3的int型数组, 元素为 1, 2, 3 var c = [...]int{2: 3, 1: 2} // 定义长度为3的int型数组, 元素为 0, 2, 3 var d = [...]int{1, 2, 4: 5, 6} // 定义长度为6的int型数组, 元素为 1, 2, 0, 0, 5, 6 var e = [...]int{5, 4: 1, 0, 2: 3, 2, 1: 4} // 定义长度为6的...阅读全文

博文 2020-02-28 03:32:39 网管同学

golang 基础(12)指针

square-gopher.png 指针 在 go 语言中指针没有 c++ 中那么复杂,因为没有指针的运算。 什么时候用指针,也就是指针的用途 可能结构相对复杂数据你不想在程序中传递数据,可以通过传递地址 变量一致性 在多数语言中函数的参数传递有两种 值传递 值传递会保证没有 side effect,更改函数内的变量不会影响外面的变量 引用传递 go 语言中只有值传递一种方式 var cache Cache func f(cache Cache) 大家都知道值传递是将变量复制一份用于函数,那么对于我们定义类型,复杂数据结构的类型作为参数传递给函数时如果也需要复制一份,其实不是浪费吗,这里 cache 对象中一个指向内存保存对象的地址 pData ,复制仅是对象的内存地址。 ![images....阅读全文

博文 2019-03-17 20:34:42 zidea

区块链入门教程以太坊源码分析p2p-dial.go源码分析

兄弟连区块链入门教程以太坊源码分析p2p-dial.go源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。dial.go在p2p里面主要负责建立链接的部分工作。 比如发现建立链接的节点。 与节点建立链接。 通过discover来查找指定节点的地址。等功能。dial.go里面利用一个dailstate的数据结构来存储中间状态,是dial功能里面的核心数据结构。 // dialstate schedules dials and discovery lookups. // it get's a chance to compute new tasks on ev...阅读全文

博文 2018-10-24 15:34:47 兄弟连区块链培训

【栈与队列】设计一个有getMin功能的栈

#### 【题目】 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈种最小元素的操作 #### 【要求】 1、pop、push、getMin 操作的时间复杂度都是O(1) 2、设计的站的类型可以使用现成的栈结构 #### 【难度】 ★☆☆☆ #### 【解答】 ```go package main import ( "errors" "fmt" ) func main() { s := NewStack() for _,num := range []int64{4,2,1,3} { s.Push(num) } for i:=0;i<5;i++{ fmt.Println(s.GetMin()) s.Pop() } } type Stack struct { stackData []i...阅读全文

深入理解 Go map:赋值和扩容迁移

深入理解 Go map:赋值和扩容迁移 概要 在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内容。我相信这样你能更好的读懂这篇文章 哈希函数 哈希函数,又称散列算法、散列函数。主要作用是通过特定算法将数据根据一定规则组合重新生成得到一个散列值 而在哈希表中,其生成的散列值常用于寻找其键映射到哪一个桶上。而一个好的哈希函数,应当尽量少的出现哈希冲突,以此保证操作哈希表的时间复杂度(但是哈希冲突在目前来讲,是无法避免的。我们需要 “解决” 它) 链地址法 在哈希操作中,相当核心的一个处理动作就是 “哈希冲突” 的解决。而在 Go map 中采用的就是 "链地址法 " 去解决哈希冲突...阅读全文

博文 2019-03-26 09:29:56 EDDYCJY

Golang goroutine和chan 教程03

之前的教程有一个tcp时间戳服务器,这里会详细的解释一下用到的几个重要的函数。 package main import ( "io" "log" "net" "time" ) func main() { listenner,err:=net.Listen("tcp","localhost:8000") if err != nil { log.Fatal(err) } for { conn,err := listenner.Accept() if err != nil { log.Print(err) continue } handleConn(conn) } } func handleConn(c net.Conn) { defer c.Close() for{ _,err:=io.Writ...阅读全文

博文 2019-06-15 12:02:39 我加入简书的路程

JavaScript 形参与实参的爱恨情仇

作为前端开发,JavaScript 可谓是我们吃饭的家伙。 但我记得当我初学 JavaScript 的时候,总是搞不懂对形参的操作什么时候会影响到实参。 网络上关于这个问题众说纷纭,有说基本类型按值传递、复杂类型(对象、数组、函数等)按引用传递,更有人直接生造了一个词——按共享传递。 到底 JavaScript 的参数是按什么方式传递的呢? 考虑下面的例子: function addOne(num) { num += 1 } let n = 1 addOne(n) // n = ? 乍一看可能会觉得 n === 2 ,因为 num += 1 执行后 num 的值会变成 2。 但实际结果却是 n === 1,因为对形参的修改不会影响到实参的值。 按值传递?按引用传递? 再看另一个例子: fun...阅读全文

博文 2019-12-21 06:32:41 IdanLoo

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(一)

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(一)p2p的网络发现协议使用了Kademlia protocol 来处理网络的节点发现。节点查找和节点更新。Kademlia protocol使用了UDP协议来进行网络通信。阅读这部分的代码建议先看看references里面的Kademlia协议简介来看看什么是Kademlia协议。首先看看数据结构。 网络传输了4种数据包(UDP协议是基于报文的协议。传输的是一个一个数据包),分别是 ping,pong,findnode和neighbors。 下面分别定义了4种报文的格式。 // RPC packet types const ( pingPacket = iota + 1 // zero is 'reserved' pongPa...阅读全文

博文 2018-10-17 19:35:11 itxdl2006

第四章 数组、切片和映射 -- 数组

这一个节我们学习Golang中管理集合数据的三种数据结构:数组(Array)、切片(Slice)和映射(Map)。这三种数据结构是存储数据的基本数据结构,也是其他高级数据结构的底层实现;其中,数组又是切片和映射的基本数据结构。 数组 数组的内部实现 与C语言中类似,在Golang中的数组占用连续的内存分配,即数组中的元素在内存中是连续存储的。这样,数组元素的访问和修改操作都可以在O(1)时间内完成。 数组的声明 在Golang中任何变量在使用之前都需要声明,以此来分配内存空间和初始化值。 Golang中可以通过以下三种方式声明数组: 声明数组并初始化为零值 使用数组字面量声明并初始化数组 声明并指定特定位置元素的值(未指定位置的元素初始化为零值) 1.声明数组并初始化为零值 var arra...阅读全文

博文 2019-12-20 00:32:50 小黑随笔

Golang 基础(三)

变量 声明变量的一般形式是使用关键字 var,例如: var indentifier type 例如: var a int var b bool var str string 或者 var ( a int b bool str string ) 当一个变量被声明后,系统自动对它进行赋值: int 为 0 float 为 0.0 bool 为 false string 为 空字符串 指针 为 nil 所有的内存在Go中都是经过初始化的,比如: 定义一个int类型的变量power,如果我们不给变量power指定值,Go会为变量power分配默认值0。 var power int // 定义power为0 var power int = 9000 // 赋值power为9000 对于变量的赋值而言...阅读全文

unsafe包的应用与字节对齐

以一个例子来说明: //misc.go package misc type S struct { i int32 k int8 j int64 } //main.go func main() { s := new(misc.S) //通过unsafe Pointer给未导出的字段赋值 //因为字节对齐,内存中实际分配 //int32|int8| int64 | //|xxxx|x---|xxxxxxxx| p := (*int32)(unsafe.Pointer(s)) *p = int32(10) // 1.unsafe Pointer和uintptr可以互相转换 // 2.unsafe Pointer和其他类型的指针可以互相转换 // 3.unsafe Pointer不能进行指针运算而u...阅读全文

博文 2019-01-02 18:34:45 Cedrus

7. Go 语言数据类型:指针

Hi,大家好。 我是明哥,在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 0. 什么是指针 当我们定义一个变量 name var name string = "Go编程时光"复制代码 此时,name 是变量名,它只是编程语言中方便程序员编写和理解代码的一个标签。 当我们访问这个标签时,机算机会返回给我们它指向的内存地址里存储的值:Go编程时光。 出于某些需要,我们会...阅读全文

博文 2020-04-29 11:35:21 王一白

内存管理

Golang 的内存管理本质上就是一个内存池,只不过内部做了很多的优化。比如自动伸缩内存池大小,合理的切割内存块等等 内存池 golang的程序在启动初,会一次性向操作系统申请一大块内存,这块内存空间会放在一个叫 mheap 的 struct 中管理,mheap负责将这一整块内存分割成不同部分使用,并将其中一部分分割成合适大小分配给用户使用。 概念 page 内存页 span 内存块,一个或多个连续的 page 组成一个 span object 对象,用来存储一个变量数据,一个span会被分割成相同大小的object 假设 object 的大小是 16B,span 大小是 8K,那么就会把 span 中的 page 就会被初始化 8K / 16B = 512 个 object image.p...阅读全文

博文 2020-02-01 03:32:55 元气蛋蛋

算法图解阅读笔记-选择排序

数组与链表 数组是连续内存的应用方式,它的特点就是所有的单元的内存地址都是连续的,当需要扩展而初始化的内存不足够的时候,就需要重新申请内存。 链表是已上一个元素指向来完成存储的,它在内存的存储是分散的,无论是添加还是删除较数组的最大优势就是都不需要整体动,只需要上一个元素的指向调整就好,缺点就是无法直接通过计算获得某个元素,如果要在链表中查找某一个元素,就需要遍历整个链表(最差情况) 选择排序 遍历所有元素,挑出最小的元素放在结果集中并删除该元素,直到要排序的数据集中没有元素为止。 golang版本 package main import "fmt" func main() { info := []int{12, 3, 54, 6, 6777, 2342, 234, 55, 6, 6777,...阅读全文

博文 2018-10-22 16:35:02 zhaoxi_yu

小结

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

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

【Golang 基础】Go 语言的指针

Go 语言的指针   变量是一种使用方便的占位符,用于引用计算机地址,而在 Go 语言中可以通过 & 符号获取一个变量在计算机中对应的内存地址。 package basic import "fmt" func main(){ a := 1 fmt.Println(&a) // 0xc4200180a0 }   一个指针变量指向了一个值的内存地址。Go 语言中的指针语法与 C++ 类似,都是使用 * 符号声明指针变量; package basic import "fmt" func main(){ a := 1 var p *int = &a fmt.Printf("获取变量内存地址 %x\n", p) // 获取变量内存地址 c4200180a0 fmt.Printf("获取指针变量值 %v...阅读全文

博文 2019-03-21 01:34:40 龙泷VK

NSURLProtocol 拦截 NSURLSession 请求时body丢失问题解决方案探讨

摘要: “IP直连方案”主要在于解决DNS污染、省去DNS解析时间,通常情况下我们可以在项目中使用 NSURLProtocol 拦截 NSURLSession 请求,下面将支持 Post 请求中面临的一个挑战,以及应对策略介绍一下。 “IP直连方案”主要在于解决DNS污染、省去DNS解析时间,通常情况下我们可以在项目中使用 NSURLProtocol 拦截 NSURLSession 请求,下面将支持 Post 请求中面临的一个挑战,以及应对策略介绍一下: 在支持POST请求过程中会遇到丢失 body的 问题,有以下几种解决方法: 方案如下: 1.换用 NSURLConnection 2.将 body 放进 Header 中 3.使用 HTTPBodyStream ...阅读全文

Go语言变量

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。声明变量的一般形式是使用 var 关键字: var identifier type变量声明第一种,指定变量类型,声明后若不赋值,使用默认值。 var v_name v_typev_name = value第二种,根据值自行判定变量类型。 var v_name = value第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。 v_name := value// 例如 var a int = 10 var b = 10c := 10...阅读全文

go语言渐入佳境-网络[4]-port

端口port服务器运行在主机上。 IP地址将定位主机。但是在每台计算机上可能有很多服务,需要一种简单的方法来区分它们。 TCP,UDP,SCTP等使用的方法是使用端口号。有许多“标准”端口。 Telnet通常使用端口23,TCP协议。 DNS使用端口53,使用TCP或UDP。 FTP使用端口21和20,一个用于命令,另一个用于数据传输。HTTP通常使用端口80,但它通常使用端口8000,8080和8088,所有端口都使用TCP。在Unix系统上,常用端口列在文件/etc/services中。 Go具有查询此文件的功能测...阅读全文

博文 2020-01-14 22:33:14 jonson_jackson

Golang中make和new的区别

new:func new(Type) *Type 接受一个参数,这个参数是一种类型,而不是一个值,分配好内存后, 返回一个指向该类型内存地址的指针,这个指针指向的内容的值为该类型的零值。 对于不同的数据类型,零值的意义是完全不一样的。 比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串 make:func make(t Type, size ...IntegerType) Type 同样用于内存分配,但和new不同,make用于channel,slice和map的分配, 而且返回的类型就是这三个类型本身,而不是它们的指针, 因为这三种类型本身就是引用类型,所以就没必要返回他们的指针了。 具体而言,有如下几种用法: (1)make(map[string]s...阅读全文

博文 2020-04-18 17:32:50 普朗tong

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

认识 Go 语言中的数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列。 声明方式 在 Go 语言中,数组的声明方式为 var identifier [len]type。 声明时没有指定数组的初始化值,因此所有的元素都会被自动初始化为默认值 0。 // 声明一个数组 var a1 [5]int 复制代码Go 语言中的数组是值类型,因此还可以用 new 来创建: var a2 = new([5]int) 复制代码new 返回类型的指针,因此 a1 与 a2 的区别在于:a1 的类型为 [5]int,a2 的类型为 *[5]int。 初始化方法 我们通过在 {} 中填写初始化值来初始化数组。 指明数组长度 指明数组的长度 len,然后在 {} 中填写初始化值,这些值会按下标从小到大的顺序分配。 初始化值的个数...阅读全文

博文 2019-11-21 14:04:20 江不知

Golang package sync 剖析(二): sync.WaitGroup

一、前言 Go语言在设计上对同步(Synchronization,数据同步和线程同步)提供大量的支持,比如 goroutine和channel同步原语,库层面有 - sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和 工具类(Once、WaitGroup、Cond、Pool、Map) - sync/atomic:提供变量的原子操作(基于硬件指令 compare-and-swap) -- 引用自《Golang package sync 剖析(一): sync.Once》 上一期中,我们介绍了 sync.Once 如何保障 exactly once 语义,本期文章我们介绍 package sync 下的另一个工具类:sync.WaitGroup。 二、为什么需要 Wa...阅读全文

博文 2020-01-28 14:32:39 oscarzhao

Go语言笔记:变量

变量指向一个内存地址,其中存储了某种类型的值。在静态语言中,此内存存储的变量类型不可变。 Go 中的变量如何声明? Go 变量声明可以指定哪些类型? Go 中如何实现类型的转换和断言? 1. Go 中的变量如何声明 使用 var 关键词声明变量,有以下几种可变形式: 简单的类型声明:var a int 声明并赋初值:var a int = 1 或 var a = 1 同时声明多个变量: var a, b = 1, 2 当声明初始值时,可以不用指定类型,Go 会根据赋值判断并自动定义变量的类型。 以下为变量声明的示例: package main import "fmt" func main() { var a int var b int = 2 var c = 3 var d, e = 4, ...阅读全文

Golang中make与new有何区别?

Golang中make与new有何区别? 一、前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。 二、变量的声明 var i int var s string ​ 变量的声明我们可以通过var关键字,然后就可以在程序中使用。当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,string类型的零值是"",引用类型的零值是nil。 对于例子中的两种类型的声明,我们可以直接使用,对其进行赋值输出。但是如果我们换成指针类型呢? test1.go package m...阅读全文

博文 2020-03-09 15:36:02 刘丹冰Aceld

区块链入门教程以太坊源码分析p2p-dial.go源码分析

dial.go在p2p里面主要负责建立链接的部分工作。 比如发现建立链接的节点。 与节点建立链接。 通过discover来查找指定节点的地址。等功能。dial.go里面利用一个dailstate的数据结构来存储中间状态,是dial功能里面的核心数据结构。// dialstate schedules dials and discovery lookups.// it get's a chance to compute new tasks on every iteration// of the main loop in Server.run.type dialstate struct {maxDynDials int //最大的动态节点链接数量ntab discoverTable //disco...阅读全文

博文 2019-06-12 17:03:20 xczxsa

[Go 教程系列笔记]Interface 第二部分

Go 教程系列笔记 Interface 第一部分 Go 教程系列笔记 Interface 第二部分 Go 教程系列笔记 并发介绍 Go 教程系列笔记 goroutine(协程) Go 教程系列笔记 Channel 通道 Go 教程系列笔记 缓冲通道和工作池 Go 教程系列笔记 Select Go 教程系列笔记 Mutex(互斥锁) Go 教程系列笔记 结构而不是类-Go中的OOP Go 教程系列笔记 组合而不是继承-Go 中的 OOP Go 教程系列笔记 多态-Go 中的 OOP 使用指针接收器和值接收器实现接口 我们在第1部分中讨论的所有示例接口都是使用值接收器实现的。也可以使用指针接收器实现接口。在使用指针接收器实现接口时需要注意一些细微之处。让我们了解使用以下程序。 type Desc...阅读全文

博文 2019-08-14 16:02:42 xfstart07