为您找到搜索结果:3305个
Go语言基础之函数
Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。Go语言中定义函数使用func关键字,具体格式如下:func函数名(参数)(返回值){函数体}其中:函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。函数体:实现指定功能的代码块。我们先来定义一个求两个数之和的函数:funcintSum(xint,yint)int{returnx+y}函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:funcsayHello(){fmt.Println("Hello沙河")} 定义了函数之后,我们可以通过函数名()的方式调用函数。例如我们调用上面定义的两个函数,代码如下:funcmain(){sayHello()ret:=intSum(10,20)fmt.Println(r...
Go语言基础之map
Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。Go语言中map的定义语法如下:map[KeyType]ValueType其中,KeyType:表示键的类型。ValueType:表示键对应的值的类型。map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:make(map[KeyType]ValueType,[cap])其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。map中的数据都是成对出现的,map的基本使用示例代码如下:funcmain(){scoreMap:=make(map[string]int,8)//初始化mapscoreMap["张三"]=90//赋值scoreMap["小明"]=100fmt.Println(scoreMap)fmt.Println(scoreMap["小明"])fmt.Printf("typeofa:%T",scoreMap)}输出...
Go语言基础之切片
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。例如:funcarraySum(x[3]int)int{sum:=0for_,v:=rangex{sum=sum+v}returnsum} 这个求和函数只能接受[3]int类型,其他的都不支持。再比如,a:=[3]int{1,2,3} 数组a中已经有三个元素了,我们不能再继续往数组a中添加新元素了。切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。声明切片类型的基本语法如下:varname[]T其中,name:表示变量名T:表示切片中的元素类型举个例子:funcmain(){//声明切片类型vara[]string//声明一个字符串切片//这样单纯声明或单纯初始化是不能够直接使用的,需要make分配内存后才可以正常使用//或是可以直接使用appendvarb=[]int{}//声明一个整型切片并初始化varc=[]bool{false,true...
Go语言基础之数组
数组是同一种数据类型元素的集合。在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。基本语法://定义一个长度为3元素类型为int的数组avara[3]int var数组变量名[元素数量]T比如:vara[5]int,数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。[5]int和[10]int是不同的类型。vara[3]intvarb[4]inta=b//不可以这样做,因为此时a和b是不同的类型 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。数组的初始化也有很多方式。方法一初始化数组时可以使用初始化列表来设置数组元素的值。funcmain(){vartestArray[3]int//数组会初始化为int类型的零值varnumArray=[3]int{1,2}//使用指定的初始值完成初始化varcityArray=[3]string{"北京","上海","深圳"}//使用指定的初始值完成初始化fmt.Println(testArra...
Go语言fmt.Printf使用指南
fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。标准库fmt提供了以下几种输出相关函数。PrintPrint系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。funcPrint(a...interface{})(nint,errerror)funcPrintf(formatstring,a...interface{})(nint,errerror)funcPrintln(a...interface{})(nint,errerror) 举个简单的例子:funcmain(){fmt.Print("在终端打印该信息。")name:="沙河小王子"fmt.Printf("我是:%s",name)fmt.Println("在终端打印单独一行显示")}执行上面的代码输出:在终端打印该信息。我是:沙河小王子在终端打印单独一行显示 FprintFprint系列函数会将内容输出到一个io.Writer接口...
Go语言基础之流程控制
if条件判断基本写法Go语言中if条件判断的格式如下:if表达式1{分支1}elseif表达式2{分支2}else{分支3}当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3。if判断中的elseif和else都是可选的,可以根据实际需要进行选择。Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。同理,与else匹配的{也必须与else写在同一行,else也必须与上一个if或elseif右边的大括号在同一行。举个例子:funcifDemo1(){score:=65ifscore>=90{fmt.Println("A")}elseifscore>75{fmt.Println("B")}else{fmt.Println("C")}} if条件判断特殊写法if条件判断还有一种特殊的写法,可以在if表达式之前添加一个执行语句,再根据变量值进行判断,举个例子:if变量name:=xxx;关于变量name表达式{ //特殊写法将赋值语句写在if后限制了变量的作用范围只在if...
Go语言基础之运算符
Go语言内置的运算符有:算术运算符关系运算符逻辑运算符位运算符赋值运算符运算符描述+相加-相减*相乘/相除%求余注意:++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。运算符描述==检查两个值是否相等,如果相等返回True否则返回False。!=检查两个值是否不相等,如果不相等返回True否则返回False。>检查左边值是否大于右边值,如果是返回True否则返回False。>=检查左边值是否大于等于右边值,如果是返回True否则返回False。<检查左边值是否小于右边值,如果是返回True否则返回False。<=检查左边值是否小于等于右边值,如果是返回True否则返回False。运算符描述&&逻辑AND运算符。如果两边的操作数都是True,则为True,否则为False。||逻辑OR运算符。如果两边的操作数有一个True,则为True,否则为False。!逻辑NOT运算符。如果条件为True,则为False,否则为True。位运算符对整数在内存中的二进制位进行操作。运算符描述&参与运算的两数各对应的二进位相与。...
Go语言基础之变量和常量
在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头。举几个例子:abc,_,_123,a123。关键字是指编程语言中预先定义好的具有特殊含义的标识符。关键字和保留字都不建议用作变量名。Go语言中有25个关键字:breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstfallthroughifrangetypecontinueforimportreturnvar此外,Go语言中还有37个保留字。Constants:truefalseiotanilTypes:intint8int16int32int64uintuint8uint16uint32uint64uintptrfloat32float64complex128complex64boolbyterunestringerrorFunctions:makelencapnewappendcopyclosedeletecomp...
Go语言环境搭建
下载地址Go官网下载地址:https://golang.org/dl/Go官方镜像站(推荐):https://golang.google.cn/dl/版本的选择Windows平台和Mac平台推荐下载可执行文件版,Linux平台下载压缩文件版。Windows安装此安装实例以64位Win10系统安装Go1.11.5可执行文件版本为例。将上一步选好的安装包下载到本地。双击下载好的文件 Linux下安装我们在版本选择页面选择并下载好go1.11.5.linux-amd64.tar.gz文件:wgethttps://dl.google.com/go/go1.11.5.linux-amd64.tar.gz 将下载好的文件解压到/usr/local目录下:mkdir-p/usr/local/go#创建目录tar-C/usr/lcoal/gozxvfgo1.11.5.linux-amd64.tar.gz.#解压 如果提示没有权限,加上sudo以root用户的身份再运行。执行完就可以在/usr/local/下看到go目录了。配置环境变量:Linux下有两个文件可以配...
Go语言配置管理神器——Viper中文教程
Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。鉴于viper库本身的README已经写得十分详细,这里就将其翻译成中文,并在最后附上两个项目中使用viper的示例代码以供参考。gogetgithub.com/spf13/viper Viper是适用于Go应用程序(包括Twelve-FactorApp)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:设置默认值从JSON、TOML、YAML、HCL、envfile和Javaproperties格式的配置文件读取配置信息实时监控和重新读取配置文件(可选)从环境变量中读取从远程配置系统(etcd或Consul)读取并监控配置变化从命令行参数读取配置从buffer读取配置显式配置值在构建现代应用程序时,你无需担心配置文件格式;你想要专注于构建出色的软件。Viper的出现就是为了在这方面帮助你的。Vip...
go语言之行--golang操作redis、mysql大全
redis(REmoteDIctionaryServer)是一个由SalvatoreSanfilippo写key-value存储系统,它由C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value类型的数据库,并提供多种语言的API。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,redis在3.0版本推出集群模式。官方网站:https://redis.io/源码部署yuminstallgcc-y#安装C依赖wgethttp://download.redis.i...
go语言之行--网络编程、http处理流程详情
go语言中的网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP、TCP/IP、UDP、域名解析和Unix域socket等。和大多数语言一样go可以使用几行代码便可以启动一个服务器,但是得益于goroutine的配合go实现的服务器拥有强大并发处理能力。Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。我们知道网络通信都是基于ip+port方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果把一个公司比做一台电脑,那公司的总机号码就相当于ip地址,每个员工的分机号就相当于端口,你想找公司某个人,必须先打电话到总机,然后再转分机。go中socket编程实现起来非常方便,下面是处理流程服务器端:监听端口接受客户端连接创建goroutine处理连接客户端:建立连接收发数据关闭连接服务端示例:packagemainimport("fmt""net")funchandle(connne...
go语言之行--golang核武器goroutine调度原理、channel详解
goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心。goroutine使用方式非常的简单,只需使用go关键字即可启动一个协程,并且它是处于异步方式运行,你不需要等它运行完成以后在执行以后的代码。gofunc()//通过go关键字启动一个协程来运行函数概念介绍在进行实现原理之前,了解下一些关键性术语的概念。并发一个cpu上能同时执行多项任务,在很短时间内,cpu来回切换任务执行(在某段很短时间内执行程序a,然后又迅速得切换到程序b去执行),有时间上的重叠(宏观上是同时的,微观仍是顺序执行),这样看起来多个任务像是同时执行,这就是并发。并行当系统有多个CPU时,每个CPU同一时刻都运行任务,互不抢占自己所在的CPU资源,同时进行,称为并行。进程cpu在切换程序的时候,如果不保存上一个程序的状态(也就是我们常说的context--上下文),直接切换下一个程序,就会丢失上一个程序的一系列状态,于是引入了进程这个概念,用以划分好程序运行时所需要的资源。因此进程就是一个程序运行时候的所需要的基本资源单位(也可以说是程序运行的一个实体)...
go语言之行--文件操作、命令行参数、序列化与反序列化详解
文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作。操作终端句柄常量os.Stdin:标准输入os.Stdout:标准输出os.Stderr:标准错误输出读写示例:packagemainimport("fmt""os")var(username,passwordstring)funcmain(){fmt.Println("请输入用户名:")fmt.Scanf("%s",&username)//键盘输入fmt.Println("请输入密码:")fmt.Scanf("%s",&password)fmt.Printf("username:%spassword:%s",username,password)varmsg[5]bytefmt.Println("请输入名称:")n,err:=os.Stdin.Read(msg[:])iferr==nil{fmt.Printf("len:%d,msg:%s",n,msg[:])return}}//请输入用户名://wd//请输入密码://123/...
go语言之行--接口(interface)、反射(reflect)详解
interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。简单的说:interface是方法的集合interface是一种类型,并且是指针类型interface的更重要的作用在于多态实现interface定义type接口名称interface{method1(参数列表)返回值列表method2(参数列表)返回值列表...}interface使用接口的使用不仅仅针对结构体,自定义类型、变量等等都可以实现接口。如果一个接口没有任何方法,我们称为空接口,由于空接口没有方法,所以任何类型都实现了空接口。要实现一个接口,必须实现该接口里面的所有方法。packagemainimport"fmt"//定义接口typeSkillsinterface{Running()Getname()string}typeStudentstruct{NamestringAgeint}//实现接口func(pStudent)Getname()string{//实现Getname方法fmt.Println(p.Name)r...