GO语言反射

反射可以作为了解,不必深入!Go语音提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,但是在编译时并不知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。Go程序在运行期使用reflect包访问程序的反射信息。反射是由reflect包提供支持.它定义了两个重要的类型,Type和Value.任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。TypeOfreflect.TypeOf()函数可以获得任意值的类型对象(reflect.Type)。funcreflectTYpe(xinterface{}){v:=reflect.TypeOf(x)fmt.Printf("type:%v",v)}funcmain(){varaint=10reflectTYpe(a)//type:intvarbfloat32=1.1reflectTYpe(b)//typ...
代码星球 代码星球·2021-01-23

GO语言strconv包的使用

Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换。strconv包实现了基本数据类型与其字符串表示的转换,官方文档中文版。string与int类型转换Atoi()将字符串类型的整数转换为int类型。funcAtoi(sstring)(iint,errerror)示例:funcmain(){s1:="100"i1,err:=strconv.Atoi(s1)iferr!=nil{fmt.Println("can'tconverttoint")}else{fmt.Printf("type:%Tvalue:%#v",i1,i1)//type:intvalue:100}}Itoa()将int类型数据转换为对应的字符串表示。funcItoa(iint)string示例:i2:=200s2:=strconv.Itoa(i2)fmt.Printf("type:%Tvalue:%#v",s2,s2)//type:stringvalue:"200"以上为用到最多的!官方文档中文版。...
代码星球 代码星球·2021-01-23

GO语言并发

并发:同一时间段执行多个任务并行:同一时刻执行多个任务Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是Go语言秉承的CSP(CommunicatingSequentialProcess)并发模式的重要实现基础。goroutine的概念类似于线程,但goroutine由Go程序运行时的调度和管理。Go程序会智能地将goroutine中的任务合理地分配给每个CPU。Go语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。使用goroutineGo程序中使用go关键字为一个函数创建一个goroutine。一个函数可以被创建多个goroutine,一个goroutine必定对应一个函数。启动单个goroutine在调用的函数(普通函数和匿名函数)前面加上一个go关键字。funchello...
代码星球 代码星球·2021-01-23

Go语言接口

在Go语言中接口(interface)是一种类型,一种抽象的类型。定义格式:type接口类型名interface{方法名1(参数列表1)返回值列表1方法名2(参数列表2)返回值列表2…}Go语言的接口在命名时,一般会在单词后面添加er,接口名最好要能突出该接口的类型含义。一个对象只要全部实现了接口中的方法,那么就实现了这个接口。Go语言中不同的类型可以实现同一个接口。(示例中dog和cat都实现了Animal接口)//定义一个Animal接口//Animal是一个动物接口,实现move()和say()方法typeAnimalinterface{move()say()}//定义dog结构体typedogstruct{namestring}//定义cat结构体typecatstruct{namestring}//dog实现move方法func(ddog)move(){fmt.Printf("%s会跑",d.name)}//dog实现say方法func(ddog)say(){fmt.Printf("%s会叫汪汪汪",d.name)}//cat实现move方法func(c*cat)move()...
代码星球 代码星球·2021-01-23

GO语言的包

包(package)是多个Go源码的集合,go语言有很多内置包,比如fmt,os,io等。main包是一个可执行的包,只应用程序的入口包,编译完会生成一个可执行文件。一个目录下的同级文件归属一个包。包名可以不和文件夹的名字一样,包名不能包含-符号。package包名如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。在Go语言中只需要将标识符的首字母大写就可以。//首字母小写,外部包不可见,只能在当前包内使用varnum=10//首字母大写外部包可见,可在其他包中使用constName="ares"//首字母小写,外部包不可见,只能在当前包内使用typepersonstruct{namestring}typeStudentstruct{Namestring//可在包外访问的方法classstring//仅限包内访问的字段}typePayerinterface{init()//仅限包内访问的方法Pay()//可在包外访问的方法}//首字母大写,外部包可见,可在其他包中使用funcAdd(x,yint)int{returnx+...
代码星球 代码星球·2021-01-23

go语言time包的使用

time.Time类型表示时间。//时间类型functimeDemo(){now:=time.Now()fmt.Println(now)//2019-04-2013:52:35.226397+0800CSTm=+0.000336111fmt.Println(now.Format("2006-01-0215:04"))//2019-04-2013:52year:=now.Year()month:=now.Month()day:=now.Day()hour:=now.Hour()minute:=now.Minute()second:=now.Second()//输出格式可以自定义fmt.Printf("%d,%02d,%02d%02d:%02d:%02d",year,month,day,hour,minute,second)//2019,04,2418:13:48}//字符串类型转times4:="1999年10月19日"//字符串t4,err:=time.Parse("2006年01月02日",s4)iferr!=nil{fmt.Println("err",err)}fmt.Printl...
代码星球 代码星球·2021-01-23

GO语言结构体

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。自定义类型Go语言中可以使用type关键字来定义自定义类型。//NewInt是一种新的类型,具有int类型的特性。typeNewIntintfuncmain(){varaNewIntfmt.Println(a)//初始值为0fmt.Printf("%T",a)//main.NewInt类型是自己定义的NewInt}类型别名类型别名是Go1.9版本添加的新功能。类似于软链,本质上与type是同一个类型。类型别名只在代码编写过程中生效,编译完不存在。//类型别名,ares就是bool,编译完后不存在ares类型typeares=boolfuncmain(){varbares//定义b为ares类型fmt.Println(b)//bool类型默认只falsefmt.Printf("%T",b)//bool}rune和byte其实就是类型别名。typebyte=uint8typerune=int32Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型...
代码星球 代码星球·2021-01-23

GO语言常量和变量

标识符人为定义有特殊意义的词,Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头。关键字关键字是指编程语言中预先定义好的具有特殊含义的标识符。GO语言中有25个关键字:breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstfallthroughifrangetypecontinueforimportreturnvar GO语言中37个保留字:Constants:truefalseiotanilTypes:intint8int16int32int64uintuint8uint16uint32uint64uintptrfloat32float64complex128complex64boolbyterunestringerrorFunctions:makelencapnewappendcopyclosedeletecomplexrealimagpanicrecover 常见变量的数据类型有:整型、浮点型、布尔型等。Go语言中的变量需要声明后才能使...
代码星球 代码星球·2021-01-23

Go语言第一深坑:interface 与 nil 的比较

Go语言以简单易上手而著称,它的语法非常简单,熟悉C++,Java的开发者只需要很短的时间就可以掌握Go语言的基本用法。interface是Go语言里所提供的非常重要的特性。一个interface里可以定义一个或者多个函数,例如系统自带的io.ReadWriter的定义如下所示:typeReadWriterinterface{Read(b[]byte)(nint,errerror)Write(b[]byte)(nint,errerror)}任何类型只要它提供了Read和Write的绑定函数实现,Go就认为这个类型实现了这个interface(duck-type),而不像Java需要开发者使用implements标明。然而Go语言的interface在使用过程中却有一个特别坑的特性,当你比较一个interface类型的值是否是nil的时候,这是需要特别注意避免的问题。这是我们在 GoWorld分布式游戏服务器 的开发中,碰到的一个实际的bug。由于GoWorld支持多种不同的数据库(包括MongoDB,Redis等)来保存服务端对象,因此GoWorld在上层提供了一个...
首页上一页12345...下一页尾页