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

docker学习——libnetwork插件化网络功能

1.容器网络模型(CNM)目前CNM支持的驱动类型有四种: Null:不支持网络服务,容器启动后无网络连接 Bridge:用linux网桥和Iptables实现的单机网络 Overlay:用vxlan隧道实现的跨主机容器网络 Remote:扩展类型,预留给其他外部实现的方案2.Docker网络相关命令Docker网络相关命令都作为network的子命令出现 ls:列出所有网络 create:创建一个网络 rm:删除一个网络 connect:把容器接入到网络 disconnect:把容器从网络上卸载下来 inspect:查看网络的详细信息(1)列出网络docker network ls [options] -f:指定输出过滤器 --no-trunc:不断输出内容(2)创建网络docker ne...阅读全文

博文 2019-01-29 17:34:48 程序猿小小白

golang中slice底层实现

什么是切片 切片就是我们经常所说的动态数组,可以灵活的增加和减少切片内的元素。 常见的切片操作有:reslice、append、copy 切片和数组该如何选择呢? 区别 切片是引用类型,数组是值类型。那么数组在复制和函数传参时候都是值复制。 优缺点 数组作为函数传参,当数组比较大时候往往会造成资源浪费。 切片是引用传递,所以它们不需要使用额外的内存并且比使用数组更有效率。 底层的数据结构 首先切片本身并不是动态数组或者数组指针,它是通过指针引用底层数组,本身是一个只读对象,其工作机制类似数组指针的一种封装。 切片数据结构定义: type slice struct { array unsafe.Pointer len int cap int } 切片的结构体由3部分构成,Pointer 是指向...阅读全文

博文 2019-12-18 14:33:43 化蝶飞618

有点不安全却又一亮的 Go unsafe.Pointer

在上一篇文章 《深入理解 Go Slice》 中,大家会发现其底层数据结构使用了 unsafe.Pointer。因此想着再介绍一下其关联知识 原文地址:有点不安全却又一亮的 Go unsafe.Pointer 前言 在大家学习 Go 的时候,肯定都学过 “Go 的指针是不支持指针运算和转换” 这个知识点。为什么呢? 首先,Go 是一门静态语言,所有的变量都必须为标量类型。不同的类型不能够进行赋值、计算等跨类型的操作。那么指针也对应着相对的类型,也在 Compile 的静态类型检查的范围内。同时静态语言,也称为强类型。也就是一旦定义了,就不能再改变它 错误示例 func main(){ num := 5 numPointer := &num flnum := (*float32)(numPoi...阅读全文

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:02:37 热爱coding的稻草

如何在Kubernetes中将Envoy用作负载均衡器

在当今分布式的世界中,单体架构越来越多地被多个,更小,相互连接的服务(不管是好是坏)所取代,代理和负载平衡技术似乎正在复兴。除了老玩家以外,近年来还涌现出几种新的代理技术,它们以各种技术实现,并以不同的功能进行普及,例如易于集成到某些云提供商(“云原生”),高性能和低内存占用,或动态配置。 可以说,两种最流行的“经典”代理技术是NGINX(C)和HAProxy(C),而其中的一些新成员是Zuul(Java),Linkerd(Rust),Traefik(Go),Caddy(Go)和Envoy(C++)。 所有这些技术具有不同的功能集,并且针对某些特定场景或托管环境(例如,Linkerd经过微调,可在Kubernetes中使用)。在本文中,我将不做这些比较,而只是关注一个特定的场景:如何将Env...阅读全文

博文 2020-02-21 11:32:42 iyacontrol

从零学习 Go 语言(07):数据类型之指针

Hi,大家好呀,我是一个刚学习 Go 语言不久的新手,在入门 Golang 的这段时间里,我写了很多详细的学习笔记,很适合新手学习噢。这些文章已经发布在我的个人微信公众号里:《Go编程时光》里,今天开始将文章内容搬运到这里,希望有更多的人看到,给更的人带来帮助,但是这里文章会相对滞后,想获取最新文章,可以前往关注《Go编程时光》,请放心关注,这是一个纯分享的号,完全没有广告。 **系列导读 ** [从零学习 Go 语言(01):一文搞定开发环境的搭建](https://studygolang.com/articles/27365) [从零学习 Go 语言(02):学习五种变量创建的方法](https://studygolang.com/articles/27432) [从零学习 Go 语言(...阅读全文

博文 2020-03-31 10:53:01 hello_wbm

go语言slice的理解

Golang slice yongsean 作者 2017.02.17 00:07 打开App 创建切片,len、cap、append b := make([]int, 5) println(len(b), cap(b)) // 输出结果是:5, 5 fmt.Println(b) // 输出结果是:[0 0 0 0 0] 上述代码是生成默认占用5个0值的切片,下面的输出结果是另一回事 b := make([]int, 0, 5) println(len(b), cap(b)) // 输出结果是:0, 5 fmt.Println(b) // 输出结果是:[] 上述代码是生成cap长度为5,实际使用长度为0的切片,在指定的cap内进行append操作,是不会发生内存拷贝扩容操作。 b := ma...阅读全文

博文 2017-07-05 16:00:06 oxspirt

区块链入门教程以太坊源码分析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...阅读全文

博文 2018-10-25 18:35:11 xdl区块链

golang-101-hacks(13)——二维切片

注:本文是对golang-101-hacks中文翻译。 Go支持多维切片,再此只对二维切片切片做介绍。日常生活中通常会使用到二维切片,而多维似乎并不多见。如果你经常使用多维切片,个人认为代码极不友好,也不容易维护,因此可以试试有没有更好的方法去解决多维的问题;另外的原因是多维切片和二维切片的原理是一样的,如果你对二维切片理解的很好,可以做到一通百通。 查看下面的demo package main import "fmt" func main() { s := make([][]int, 2) fmt.Println(len(s), cap(s), &s[0]) s[0] = []int{1, 2, 3} fmt.Println(len(s[0]), cap(s[0]), &s[0][0]) ...阅读全文

博文 2019-06-06 01:32:41 羊羽share

关于网上各种GO语言GC文章的一些困惑和个人理解

目前网上有很多不错的介绍GO语言三色标记GC的文章和源码分析,这里推荐一篇个人感觉写的比较不错的从源码层面解析GO GC的博客Golang 垃圾回收剖析。看这些文章的过程中也产生了一些困惑,这里分享一下个人的思考,如果有不准确的地方欢迎大家批评指正。 困惑1:什么是root对象? 介绍go gc的文章都会提到,在三色标记的过程中,从root对象开始遍历找出所有的活跃对象,但我收集到的资料里没有提到什么是root。那什么是root对象呢? 全局变量:可执行文件的.data和.bss域记录了全局变量的内存地址,被这写内存地址指向的内存是活跃对象。 go routine stack:go routine的的局部变量如果分配在堆上,需要GC来管理内存的回收,go routine的stack有类似于程...阅读全文

golang-101-hacks(11)——切片结构

切片有3部分组成 a)指针:指向底层数组中首位置; b)长度(类型为int):切片的有效元素个数; b)容量(类型为int):切片的容量。 看下面的代码: package main import ( "fmt" "unsafe" ) func main() { var s1 []int fmt.Println(unsafe.Sizeof(s1)) } 在64位置系统中打印结果是24(指针和整数类型都是占8个字节) 在下面的栗子中,使用gdb设置断点查看slice结构,代码如下 package main import "fmt" func main() { s1 := make([]int, 3, 5) copy(s1, []int{1, 2, 3}) fmt.Println(len(s1),...阅读全文

博文 2019-06-01 01:34:40 羊羽share

golang快速入门[5.2]-go语言是如何运行的-内存概述

前文 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速入门[2.3]-go语言开发环境配置-linux golang快速入门[3]-go语言helloworld golang快速入门[4]-go语言如何编译为机器码 golang快速入门[5.1]-go语言是如何运行的-链接器 前言 总的来说一个程序的生命周期可以概括为: 编写代码 => 编译 => 链接 => 加载到内存 => 执行 在上一篇文章中,我们详细介绍了go语言编译链接的过程 在本文中,我们将对内存进行简单介绍 在下文中,我们将介绍内存分配以及go语言中的内存分配 内存 在计算机中,术语"内存"又叫做主存,通常指的是可寻址的半导...阅读全文

博文 2020-02-19 15:32:43 唯识相链2

DockOne微信分享(八十六):深入解析DC/OS 1.8——高可靠的微服务及大数据管理平台

【编者的话】Apache Mesos是经过大规模生产系统验证过的集群资源管理及调度软件中的佼佼者。DC/OS以Apache Mesos为内核,通过统一的界面及命令行,服务发现,负载均衡,弹性伸缩等机制,以及微服务及大数据软件包管理平台,使得用户可以如管理一台主机一样管理整个数据中心,所以DC/OS即数据中心操作系统。9月,最新的DC/OS 1.8发布了,基于最新的Mesos 1.0,并引入了很多新的特性。 从事容器方面工作的朋友可能已经听说过DC/OS,往往大家误解DC/OS就是Marathon + Mesos,其实DC/OS包含很多的组件,DC/OS 1.8九月份发布了,此次分享给大家做一个介绍。 DC/OS的基本思想所谓的DC/OS,全称为数据中心操作系统,其基本的思想就是使得运维人员操...阅读全文

博文 2017-06-25 16:25:19 popsuper1982

golang——用简单的方式理解指针

定义 指针,就是保存对象的内存地址。用指针的好处就是节约内存空间。 定义一个指针类型的变量很简单,就是在变量名前加* //基础类型指针 var ps *string var pi *int var pf *float64 var pb *bool //结构体指针 type Person struct { name string age int } var pperson *Person 使用 在把指针使用的得心应手之前,首先要熟悉go语言中这两个操作符:*与&。 先说说&。&变量名,表示对变量取地址。&可以理解为一个方法简写,这个方法的唯一参数是变量名,返回值是一个内存地址(即一个指针类型变量)。&的使用如下: //先定义指针 var ps *string //再定义变量 var s str...阅读全文

博文 2019-07-25 19:32:42 玉笛誰家聽落梅

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 王一白