go语言

Go语言学习-函数

自闭症网瘾萝莉.ら 提交于 2020-01-24 16:32:28
函数 Go不是一门纯函数式的编程语言,但是函数在Go中是“第一公民”,表现在: 函数是一种类型,函数类型变量可以像其他类型变量一样使用,可以作为其他函数的参数或返回值,也可以直接调用执行。 函数支持多值返回。 支持闭包。 函数支持可变参数。 Go是通过编译成本地代码且基于“堆栈”式执行的,Go的错误处理和函数也有千丝万缕的联系。 函数定义 函数是Go程序源代码的基本构造单位,一个函数的定义包括如下几个部分: 1.函数声明关键字func 2.函数名 3.参数列表 4.返回列表 5.函数体。 函数名遵循标识符的命名规则,首字母的大小写决定该函数在其他包的可见性:大写时其他包可见,小写时只有相同的包可以访问; 函数的参数和返回值需要使用“()”包裹,如果只有一个返回值,而且使用的是非命名的参数,则返回参数的“()”可以省略。 函数体使用“{}”包裹,并且“{”必须位于函数返回值同行的行尾。 func funcName ( param - list ) ( result - list ) { function - body } 函数的特点 函数可以没有输入参数,也可以没有返回值(默认返回0)。 func A ( ) { //do something //... } func A ( ) int { //do something //... return 1 )

Go语言学习-函数

*爱你&永不变心* 提交于 2020-01-24 16:12:57
函数 Go不是一门纯函数式的编程语言,但是函数在Go中是“第一公民”,表现在: 函数是一种类型,函数类型变量可以像其他类型变量一样使用,可以作为其他函数的参数或返回值,也可以直接调用执行。 函数支持多值返回。 支持闭包。 函数支持可变参数。 Go是通过编译成本地代码且基于“堆栈”式执行的,Go的错误处理和函数也有千丝万缕的联系。 函数定义 函数是Go程序源代码的基本构造单位,一个函数的定义包括如下几个部分: 1.函数声明关键字func 2.函数名 3.参数列表 4.返回列表 5.函数体。 函数名遵循标识符的命名规则,首字母的大小写决定该函数在其他包的可见性:大写时其他包可见,小写时只有相同的包可以访问; 函数的参数和返回值需要使用“()”包裹,如果只有一个返回值,而且使用的是非命名的参数,则返回参数的“()”可以省略。 函数体使用“{}”包裹,并且“{”必须位于函数返回值同行的行尾。 func funcName(param-list) (result-list) { function-body } 函数的特点 函数可以没有输入参数,也可以没有返回值(默认返回0)。 func A() { //do something //... } func A() int { //do something //... return 1 ) 多个相邻的相同类型的参数可以使用简写模式。 func

go语言中 json转换--nil

淺唱寂寞╮ 提交于 2020-01-24 00:59:43
go语言中如果一个变量的值为nil,是否能否为json? 如果能否转换,转换后的结果是什么? 下面直接看下例子。 package main import ( "encoding/json" "fmt" ) func main() { marshalTest() } func marshalTest() { b, err := json.Marshal(nil) if err != nil { fmt.Println("json.Marshal failed:", err) return } fmt.Println("result:", string(b)) } output: result: null 结果输出为"null"。 也就是说,凡是值为nil的变量,经过json编码后都是"null"。例如,未赋值的指针变量、切片slice等: var ptr *int var s []int 反过来,如果一个json字符串是"null",经过解析后,转换后的值是什么样呢? 例如,转换为结构体,转换后为结构体变量的默认值。 package main import ( "encoding/json" "fmt" ) func main() { unmarshalTest() } type Apple struct { Size int Addr string Num *int } func

Go语言基础之切片

我的梦境 提交于 2020-01-23 19:06:31
Go语言基础之切片 切片(slice)它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。是对数组的一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型),这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。 Go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比作切糕的话,切片就是你要的“那一块”,切的过程包含从哪里开始(切片的起始位置)及切多大(切片的大小),容量可以理解为装切片的口袋大小,如下图所示。 1 概述 切片是一种动态数组 按需自动改变大小 与数组相比,切片的长度可以在运行时修改 切片不存具体的值,切片是一个引用类型 相当于java中的ArrayList 2 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 例如: func arraySum ( x [ 3 ] int ) int { sum := 0 for _ , v := range x { sum = sum + v } return sum } 这个求和函数只能接受[3]int类型,其他的都不支持。 再比如, a := [3]int{1, 2, 3} 数组a中已经有三个元素了

Go语言基础之map

半腔热情 提交于 2020-01-23 18:49:28
Go语言基础之map GO语言学习教程 www.lsdcloud.com 概述 map是基于key-value键值对的无序的集合 Go语言中的map是引用类型 必须初始化才能使用。 map定义 map [ KeyType ] ValueType KeyType:表示键的类型。 ValueType:表示键对应的值的类型。 map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为: make ( map [ KeyType ] ValueType , [ cap ] ) 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。 判断某个键是否存在 Go语言中有个判断map中键是否存在的特殊写法,ok 为true则存在 否则不存在。格式如下: value , ok := map [ key ] map的遍历 Go语言中使用for range遍历map。 func main ( ) { scoreMap := make ( map [ string ] int ) scoreMap [ "张三" ] = 90 scoreMap [ "李四" ] = 100 scoreMap [ "王五" ] = 60 for k , v := range scoreMap { fmt . Println ( k , v ) } }

GO语言-指针

霸气de小男生 提交于 2020-01-23 13:13:59
一、Go语言中的指针 任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。 比如,“永远不要高估自己”这句话是我的座右铭,我想把它写入程序中,程序一启动这句话是要加载到内存(假设内存地址0x123456),我在程序中把这段话赋值给变量 A ,把内存地址赋值给变量 B 。这时候变量 B 就是一个指针变量。通过变量 A 和变量 B 都能找到我的座右铭。 Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,我们只需要记住两个符号: & (取地址)和 * (根据地址取值)。 1.1 指针地址和指针类型 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用 & 字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如: *int 、 *int64 、 *string 等。 取变量指针的语法如下: ptr := &v // v的类型为T 其中: v:代表被取地址的变量,类型为 T ptr:用于接收地址的变量,ptr的类型就为 *T ,称做T的指针类型。*代表指针。 举个例子: func main() { a := 10 b := &a fmt.Printf("a:%d ptr:%p\n", a

Go语言入门

我只是一个虾纸丫 提交于 2020-01-23 10:36:14
因为做分布式相关项目需要接触go语言,本文是基于Udemy上的一门go基础课的笔记,主要是代码例子的形式来熟悉go的一些特性,比如struct, map, interface, Channels and Go Routines,适合接触过一些其他编程语言的同学来快速了解go。 Basic project : Card 首先以一个扑克牌的项目为例子来熟悉go的基本语法,涉及variable declaration, type conversion, receiver, slice, multiple return等知识。实现的是扑克中的newDeck(), deal(), shuffle()以及deckToFile()和FiletoDeck()功能。包含实现功能的deck.go文件,可执行的main.go文件,以及用来测试的deck_test.go文件。 Package :executable package & reusable package package main --> executable package (means go build can make a main.exe) deck.go package main import ( "fmt" "io/ioutil" "math/rand" "os" "strings" "time" ) // Create a

持续构建:使用Docker镜像方式构建go语言项目

萝らか妹 提交于 2020-01-23 08:45:35
go官方提供了各种版本的镜像,在Easypack中根据官方的Alpine镜像也创建go语言的镜像,因为go 1.13开始GOPROXY 默认为 https://proxy.golang.org,将GOPROXY缺省设定为goproxy.cn,以方便更简单地使用go镜像进行构建。 golang官方镜像 官方镜像分如下三类: 普通镜像: golang:<version> Alpine镜像: golang:<version>-alpine Windows镜像: golang:<version>-windowsservercore 详细可参看:https://hub.docker.com/_/golang Easypack的Alpine镜像 镜像tag: golang:<version>-alpine 下载镜像 下载镜像:docker pull liumiaocn/golang:1.13.5-alpine3.11 编译go语言应用 这里以Prometheus提供的go语言的示例应用(为Prometheus提供可供抓取的数据)为例进行说明如何使用Docker镜像进行go语言应用的编译。 准备go语言应用 执行命令:git clone https://github.com/prometheus/client_golang.git 当然也可以直接使用自己手头已有的go语言的应用示例进行编译。

持续构建:Alpine镜像下构建的Go语言应用的运行问题

﹥>﹥吖頭↗ 提交于 2020-01-22 09:03:29
Go语言虽然是平台无关性的语言,但是构建出来的应用由于是可执行文件,所以注定无法像Java那样“一次编译、处处运行”,因为Java应用程序的二进制字节码下的解释由JVM这一层来实现,所以能够实现一次编译之后随处运行的平台无关性。这篇文章通过Alpine下编译的二进制文件的运行方式来说明在实际使用中需要注意的一个细节。 使用Alpine构建Go应用 Go提供官方镜像用于构建Go语言的应用,官方镜像中也包括Alpine镜像。如何使用Docker镜像构建Go语言应用可参看: https://liumiaocn.blog.csdn.net/article/details/103778750 问题现象 参照上述方式在Alpine镜像中构建的Go的可执行文件,如果在其他操作系统之上比如macOS,可能无法执行,比如如下错误示例: liumiaocn:random liumiao$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.2 BuildVersion: 19C57 liumiaocn:random liumiao$ liumiaocn:random liumiao$ ls -l random -rwxr-xr-x 1 liumiao staff 11818840 Jan 2 05:49 random liumiaocn:random

go语言学习笔记(一)

时光怂恿深爱的人放手 提交于 2020-01-22 05:53:23
在go语言里,同时要满足 main 包和包含 main() 函数,才会被编译成一个可执行文件。 变量声明 声明一个变量 var tmp_str string = "hello world" 同时声明两个变量 var tmp_str, tmp_str2 string = "hello world", "hello go" 不声明类型自动推断 var tmp_str, tmp_str2 = "hello world", "hello go" //可以同时声明多个不同类型的变量 var tmp_num, tmpstr = 100, "hello" fmt.Println(tmp_num,tmpstr) 省略 var,要求变量必须是没有声明过的,否则出错 tmp_str := "hello world" 省略var,变量也声明过,但是 := 有新变量,这样变量会被赋值为新内容 var str1 = "hello, world" str1, str2 := "beijing", "shanghai" if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } else { /* 在布尔表达式为 false 时执行 */ } if后边的语句可以加括号,是没有问题的。 另外需要注意的是else 必须跟在if的大括号后边,否则就出错,原因是在 Go 程序中