go语言

Go语言入门(一)

你说的曾经没有我的故事 提交于 2020-03-14 11:28:31
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 package main // package 表示该文件所属的包 // 导入包 import "fmt" //行注释,可以注释单行 /* 块注释 可以注释多行 */ // func 函数 //main 主函数名,主函数名有且只有一个,作为程序的主入口 // () 函数参数列表 // {} 函数体 // fmt.Println 打印 // hello world func main01() { //Println:打印并换行 fmt.Println("Hello World!") fmt

Go语言入门(二)-流程控制

妖精的绣舞 提交于 2020-03-14 11:19:05
go流程控制 字符串详解 字符串原理 字符串底层就是一个byte数组,所以可以和[]byte类型互相转换 字符串中的字符是不能修改的 字符串是有byte字节组成,所以字符串的长度是byte字节的长度 rune类型(int32占四个字节)用来表示utf8字符,一个rune由一个或者多个byte组成 func stringByte() { var str string str = "abc你好" var b []byte = []byte(str) var c[]rune = []rune(str) fmt.Printf("%c\n",97) fmt.Printf("b=%v,\tlen(str)=%d\n",b,len(str)) fmt.Printf("%d\n",len(c)) } 练习 写一个程序,对英文字符串进行逆序 func reverseStr(s string) string { bytes := []byte(s) for i:=0;i<len(s)/2;i++{ //fmt.Printf("%c",i) 输出字符串 var tmp = bytes[i] bytes[i] = bytes[len(s)-i-1] bytes[len(s)-i-1] = tmp } s = string(bytes) return s } func main() { /

go语言有哪些好的debug方法?

喜欢而已 提交于 2020-03-14 04:31:22
作者:Davie 链接:https://www.zhihu.com/question/40980436/answer/655067839 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作为一门静态语言,支持调试是必须的。 1、godebug godebug是一个跨平台的Go程序调试工具,传统的编译型语言调试器使用底层系统调用并读取二进制文件用于调试各类符号。使用起来很麻烦而且很难移植。godebug使用不同的方法,直接把源码作为目标程序,在每一行插入调试代码,然后编译并运行。 但是目前GDB做的并不好,使用起来有这样那样的问题。 2、dlv 专业调试Go语言的一款工具。 安装:go get -u http:// github.com/derekparker/ delve/cmd/dlv 配置: export GOROOT=/usr/lib/golang export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 使用: 1、dlv debug xxx.go 指定需要debug的文件 2、进入dlv交互式窗口后,b <filename>:<line> 指定断点 3、r arg 指定运行参数 4、n 执行一行 5、c 运行至断点或程序结束 3、日志输出 如果使用GoWeb框架进行开发

Go语言基础之变量声明

自作多情 提交于 2020-03-13 01:50:19
Go语言基础之变量声明 Go语言中变量的声明 目录: 变量声明 标准声明 批量声明 变量的初始化 类型推导 短变量声明 变量声明 变量(Variable)的功能是存储数据。不同的变量保存的数据类型可能会不一样。常见变量的数据类型有:整型、浮点型、布尔型等。 Go语言中的每一个变量都有自己的类型,并且变量必须经过声明才能开始使用。 Go的变量声明有以下5种方式 标准声明 批量声明 变量的初始化 类型推导 短变量声明 标准声明 标准声明的格式是: var 变量名 变量类型 变量声明以关键字var开头,变量类型放在变量的后面,行尾无需分号 var name string var count int var sex bool 批量声明 每声明一个变量就需要写var关键字会比较繁琐,go语言中还支持批量变量声明 var ( name string count int sex bool ) 类型推导 有时候我们会将变量的类型省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化。 var name, sex = "Wahaha", true 变量的初始化 Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数

go语言实现udp客户端/服务端

时光怂恿深爱的人放手 提交于 2020-03-12 16:32:55
/ server.go / package main import ( "fmt" "net" "os" ) func checkError(err error) { if err != nil { fmt.Println("Error: %s", err.Error()) os.Exit(1) } } func recvUDPMsg(conn *net.UDPConn) { var buf [20]byte n, raddr, err := conn.ReadFromUDP(buf[0:]) if err != nil { return } fmt.Println("msg is ", string(buf[0:n])) //WriteToUDP //func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) _, err = conn.WriteToUDP([]byte("nice to see u"), raddr) checkError(err) } func main() { udp_addr, err := net.ResolveUDPAddr("udp", ":9098") checkError(err) conn, err := net.ListenUDP("udp", udp_addr)

Go语言之如何给*int32类型赋值

China☆狼群 提交于 2020-03-12 16:32:34
直接上代码: package main import "fmt" func main() { var num *int32 var i int32 = 5 // 针对*int32的,先创建一个i类型,然后取i的地址,赋值给*int32 num = &i fmt.Println("=====>:\t", num) fmt.Println("=====>:\t", *num) } 运行结果: =====>: 0xc042064080 =====>: 5 Process finished with exit code 0 下面的形式是不可以的: package main import "fmt" func main() { var num *int32 *num = 5 fmt.Println("=====>:\t", num) fmt.Println("=====>:\t", *num) } 运行结果: panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x1 addr=0x0 pc=0x48b4ea] goroutine 1 [running]: main.main() E:/Program/go2/goPath/src/xingej-go

go语言当中的包

早过忘川 提交于 2020-03-12 14:38:36
说明 在go语言当中,所有的go语言程序都会组织成若干组文件,每组文件都被称为是一个包。通过这样的设置,每个包的代码都可以用来当做复用单元,从而被其他的项目所使用。 例如,我们可以查看一下go当中内置的net包,大概如下: 在这些目录当中包括一系列的以.go为扩展名的相关文件。其中的每一个包都可以单独的导入和引用,从而让开发者可以根据自己的需要导入特定的功能。 go语言当中所谓的包其实就是我们计算机里的文件夹,一个包就是一个文件夹。 所有的.go文件,除了空行和注释,都应该在第一行声明自己所属的包。每个包都在一个单独的目录里。不能把多个包放到同一个目录中,也不能把同一个包的文件分拆到多个不同目录中。这意味着,同一个目录下的所有.go文件必须声明同一个包名。 包的命名 go语言的包的命名,遵循简洁、小写、和go文件所在目录同名的原则,这样就便于我们引用,书写以及快速定位查找(当然包的名字可以和目录名不同,但是不建议这样做)。 并不需要所有包的名字都与别的包不同,因为导入包时是使用全路径的,所以可以区分同名的不同包。一般情况下,包被导入后会使用你的包名作为默认的名字,不过这个导入后的名字可以修改。这个特性在需要导入不同目录的同名包时很有用。 对于自己或者公司开发的程序而言,我们一般采用域名作为顶级包名的方式,这样就不用担心和其他开发者包名重复的问题了。 例如域名为github.com

go语言之变量

不问归期 提交于 2020-03-12 11:51:14
在go语言中,声明一个变量格式如下: var varname vartype varname 表示变量名,vartype表示变量的类型。 例如,下面的代码中创建了两个变量。 var i1 int var s1 string fmt . Printf ( "%d %q \n" , i1 , s1 ) // 0 "" 上面的代码中,创建了两个变量i1 和 s1 ,并且还没有初始化。 在go语言当中,一个变量创建后但是如果没有初始化,那么就会默认的为当前变量类型的零值。例如i1的类型为int,打印出来的结果为int类型的零值0,s1的类型为string,打印出来的结果为string类型的零值""。 我们可以在变量声明的时候进行初始化,如下: var i1 int = 3 var s1 string = "hello" fmt . Println ( i1 , s1 ) // 3 hello 上述的代码不仅仅创建了变量,还对变量进行了初始化的设置。 在go语言当中是支持同时创建多个变量并且同时赋值,如下: var i1 , i2 int = 3 , 4 fmt . Println ( i1 , i2 ) // 3 4 上述变量在创建的初期就同时完成了初始化的设置。 在go中,允许在声明变量的时候不去设置类型,如下: var i1 , s1 = 3 , "hello,world" fmt .

go语言注释

一曲冷凌霜 提交于 2020-03-11 07:50:53
Go语言注释实例代码教程 - Go支持C语言风格的/* */块注释,也支持C++风格的//行注释。 当然,行注释更通用,块注释主要用于针对包的详细说明或者屏蔽大块的代码。 每个包都应有一个包注解,即 package 前的块注解。对多个文件的包,包注解只需出现在一个文件中,随便哪个。包注解应该介绍此包,并作为一个整体提供此包的对应信息。它首先出现在 godoc 页面,来安排好后续的详细文档。 包如果简单,注释可以简短。 注解不需多余排版如星星横幅等。生成的结果呈现时可能不是等宽字体,所以不要靠空格对齐, godoc,类似 gofmt 照管这些。最后,注解是不加解释的文本,HTML和其他例如 _this_ 会原样照搬,所以应 避免使用。 在包里,紧跟顶层声明前的注解作为此声明的文注解,程序中每个导出(大写)的名字都应该有文注解。 文注解最好是完整的句子。首句应该以声明的名字开始的一句话的总结。 Go 的声明句法允许编组。单一的文注解可以引出一组相联的常量或变量。因为整组声明一起展现,注解可以很粗略: 对于私有名称,编组也可以指出它们之间的联系,例如一系列的变量由一个互斥保护。 var ( countLock sync.Mutex inputCount uint32 outputCount uint32 errorCount uint32 ) 来源: https://www

Go语言中的字符和字符串

落爺英雄遲暮 提交于 2020-03-10 11:53:48
Go语言中的字符 在Go语言中,没有字符类型,字符类型是rune类型,rune是int32的别称。 下面用一个简单的程序来演示字符类型: package main import ( "fmt" "reflect" ) func main() { r := '我' fmt.Printf("%q的类型为:%t 二进制为:%b\n", r, r, r) rType := reflect.TypeOf(r).Kind() fmt.Printf("r的实际类型为:%s\n", rType) } 程序输出: '我'的类型为:%!t(int32=25105) 二进制为:110001000010001 r的实际类型为:int32 Go语言天生支持Unicode,那我产生一个问题:Unicode字符的长度是多少? 这个问题的问法有没有问题?其实仔细想想,这样问是有问题的。首先,Unicode的基础是一个有编号的字符集,在字符集之上又规定了模块化的编码等等技术层次,各种具体的编码形式并不一致。因此,严格来说,Unicode是没有“长度”这一说的,它是抽象的字符,只有Unicode的编码才有具体的字节长度。而且不同的编码实现,长度也不一样。 Unicode 目前规划的总空间是17个平面(平面0至16),每个平面有 65536 个码点。我们常用的平面0(「Basic Multilingual Plane」