golang

【原创翻译】数值(number)

北城以北 提交于 2020-03-03 00:47:55
Go有很多种表示数值的类型。通常来说,我们将数值分成两类:整数和浮点数。 整数 整数——跟数学意义上的整数一样——没有小数部分(...,-3,-2,-1,-,1,2,3,...)。但不像我们用10进制表示整数,计算机用2进制表示。 我们十进制系统又10种数字位组成。当一个位上的10种数字位都表示完了,我们在下一位上用更大的数字进位。比方说9后面是10,99后面是100。计算机的做法也一样,但它们没有10个数字位,只有2个。所以计算机的计数会像这样:0、1、10、11、100、101、110、111,如此类推。另一个不同之处是,计算机里所有的整数都有一个明确的尺寸。它们只为确定位数的数据分配空间。所以4位的整数看起来会像:0000、0001、0010、0011、0100。当空间不够用的时候,计数将循环,从头计算(会发生很些很奇怪的行为)。 Go的整数类型有:uint8、uint16、uint32、uint64、int8、int16、int32和int64。8、16、32、64告诉我们每种类型的位数。uint的意思是“无符号整数”,而int是“有符号整数”。无符号整数只包含零和正整数。除此还有两种类型的别名:byte跟unit8是一样的,rune跟int32是一样的。字节(byte)是计算机中极普遍的衡量单位(1 byte = 8 bits,1024 bytes = 1

【原创翻译】布尔值(boolean)

孤人 提交于 2020-03-03 00:47:36
布尔值(以George Boole的名字命名)代表一位整数,用来表示真或者假(开或者关)。布尔值有三种逻辑运算符: && 与 || 或 ! 非 以下是一个使用例子: func main() { fmt.Println(true && true) fmt.Println(true && false) fmt.Println(true || true) fmt.Println(true || false) fmt.Println(!true) } 运行这个程序将会输出: $ go run main.go true false true true false 我们常使用真值表来定义运算符的结果: 表达式 值 true && true true true && false false false && true false false && false false 表达式 值 true || true true true || false true false || true true false || false false 表达式 值 !true false !false true 最简单的类型都被包含在了Go语言中,形成了建立后续类型的基础。 原文地址: http://www.zingscript.com/translate/golang-book 来源: oschina 链接:

【原创翻译】字符串(string)

 ̄綄美尐妖づ 提交于 2020-03-03 00:42:22
正如我们第二章提到的,字符串是一组具有特定长度的、描述文本的字符序列。通常来说,字符串里的字符各占用一个字节(如中文之类的其他语言的字符占用一个以上的字节)。 字符串字面量由双引号"Hello World"或者反引号`Hello World`创建。它们的区别在于,双引号不能换行但可以有特殊字符转移。比方说\n会被替换成换行,而\t会被替换成制表符。 常用的字符串操作包括获取字符串长度:len("Hello World") ,获取字符串中的特定字符:"Hello World"[1],将两个字符串连接起来:"Hello "+" World"。让我们修改之前的程序来做个测试: package main import "fmt" func main() { fmt.Println(len("Hello World")) fmt.Println("Hello World"[1]) fmt.Println("Hello " + "World") } 需要注意以下事情: 空格也占用字符,所以字符串的长度是11而不是10,打印的第三行是"Hello "而不是"Hello"。 字符串的字符从0开始索引,而不是1。[1]以为着取第二个元素,而不是第一个。当你运行程序的时候,你会注意到你看见的是101而不是e。这是因为字符是用字节表示的(字节是整数型的)。 有一种表示字符串索引的方式:"Hello

Golang 调用汇编代码,太方便啦

拥有回忆 提交于 2020-03-02 17:14:45
今天在翻阅Golang代码时,发现了Golang调用汇编代码的方法(详见pkg/bytes)。大概要做三件事,我以用汇编实现一个判断字符串是否相等的方法Equal为例,测试一下: 准备工作,创建工程目录: asm_demo |--bin |--pkg |--src | |--strlib | |--demo 第一、编写平台对应的编码代码。 汇给代码文件以如下格式的命名:asm_$ARCH.s (asm_386.s, asm_amd64.s, asm_arm.s, ...),我的环境是Ubuntu 12.04 LTS amd64架构. $ GOPATH=<youpath>/asm_demo $ cd $GOPATH $ cat <<EOF > src/strlib/asm_amd64.s TEXT .Equal(SB),7,$0 MOVL len+8(FP), BX MOVL len1+24(FP), CX MOVL $0, AX CMPL BX, CX JNE eqret MOVQ p+0(FP), SI MOVQ q+16(FP), DI CLD REP; CMPSB MOVL $1, DX CMOVLEQ DX, AX eqret: MOVB AX, ret+32(FP) RET EOF 本段代码来自 $GOROOT/src/pkg/bytes/asm_amd64.s 可以看出

golang学习笔记(20200302)

自古美人都是妖i 提交于 2020-03-02 12:49:29
包 //程序入口包 package main //导包方式一 import "fmt" //导报方式二 import ( "fmt" ) //go设置的GOPATH即为项目的工作路径,改路径下src目录是固定的结构 //导入自定义包的全路劲:%GOPATH%/src/项目名/包名 //eg:包的全路径:%GOPATH%/src/test4go/demo4go //导包时编译器会默认从%GOPATH%/src路径开始 import ( "fmt" "test4go/demo4go" ) //当包路径过长,可以给包设置别名,相应的调用函数或变量则需变成以 别名.函数/别名.变量 import( alis "test4go/demo4go" ) //package 后定义的包名可以与包所在目录不同名,但建议保持同名;同一个目录下只能存在一个包名 //go中函数和变量的首字母大小写用以区分是否可跨包访问,大写类似public,小写类似private //同包中不可以存在同名(区分大小写)的函数或全局变量 函数: 基本语法: package main import ( "fmt" ) //函数的定义 函数名(参数列表)(返回参数列表) //无返回值 func print(s string) { fmt.Println(s) } //单个放回值可以省略返回参数列表的() func add(i

CentOS 8 搭建Vim golang环境 && YouCompleteMe Golang安装支持

末鹿安然 提交于 2020-03-02 07:33:09
CentOS 8 搭建Vim golang环境 Vim搭建Golang IDE 1. Vundle安装 Vundle是vim的插件管理工具,用它可以自动管理安装后面用到的插件,从GitHub安装 cd mkdir .vim/bundle cd .vim/bundle git clone https://github.com/Valloric/YouCompleteMe.git 安装完成后修改~/.vimrc启用 " .vimrc " vundle set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim' call vundle#end() 2. 安装vim插件 插件管理软件安装好了,接下来安装需要的插件: vim-go: https://github.com/fatih/vim-go YouCompleteMe: https://github.com/Valloric/YouCompleteMe Tagbar: https://github.com/majutsushi/tagbar NERDTree: https://github.com/scrooloose/nerdtree 使用vundle自动安装,修改.vimrc " vundle set rtp+=~/.vim

Go语言学习笔记(练习)

喜夏-厌秋 提交于 2020-03-02 04:34:45
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 递归实现 package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { nums := fibonacci(i) fmt.Println(nums) } } func fibonacci(num int) int { if num < 2 { return 1 } return fibonacci(num-1) + fibonacci(num-2) } 闭包实现 Go的闭包实现,摘自golang官网,闭包下次在详细介绍一下 package main import "fmt" // fib returns a function that returns // successive Fibonacci numbers. func fib() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a } } func main() { f := fib() // Function calls are evaluated

golang 标准库 container/ring 及 container/heap

拥有回忆 提交于 2020-03-02 03:19:19
由于目前golang 没有提供泛型机制,所以通用容器实现基本和 c 类似,golang 用 interface{} 做转接, c 用 void * 转接。 ring 包实现循环双向链表: type Ring struct { next, prev *Ring Value interface{} } 内部导出一个用户可以操作的Value 字段。 heap 包实现 binary heap : type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() interface{} // remove and return element Len() - 1. } heap.Interface 内嵌 sort.Interface, 提供了接口组合的好例子,只要客户的数据类型实现这五个方法,即可插入binary heap 中,进行相关操作(排序,优先队列等)。 package main import ( "container/heap" "container/ring" "fmt" ) func josephus(n, m int) []int { var res []int ring := ring.New(n) ring.Value = 1 for i, p :=

golang实现常用排序算法

老子叫甜甜 提交于 2020-03-02 02:12:56
1.冒泡排序,算法复杂度O(n^2) package main import ( "fmt" ) func main() { var arr = []int{10, 17, 19, 18, 77, 55} for i := 0; i < len(arr)-1; i++ { for j := i + 1; j < len(arr); j++ { if arr[i] > arr[j] { arr[i], arr[j] = arr[j], arr[i] } } } fmt.Println(arr) } 2.快速排序 它的基本思想是:通过一趟排序将数据一分为二,其中一部分的所有数据都比另外一部分的所有数据都要小,然后对两部分递归,直至完成。时间复杂度介于O(nlogn)和O(n^2) 一趟快速排序的算法是: 1)设置两个 变量 i、j, 排序 开始的时候:i=0,j=N-1; 2)以第一个 数组 元素作为关键数据,赋值给 key ,即 key =A[0]; 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key 的值A[j],将A[j]赋给A[i]; 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 key 的A[i],将A[i]赋给A[j]; 5)重复第3、4步,直到i=j; package main import ( "fmt" ) func

golang后端graphql接口

可紊 提交于 2020-03-01 20:25:04
1 创建prisma项目 prisma init hello prisma deploy 2 生成go-client prisma generate 3 下载 gqlgen go get github . com / 99 designs / gqlgen 4 创建scripts/gqlgen.go package main import "github.com/99designs/gqlgen/cmd" func main ( ) { cmd . Execute ( ) } 5 创建schema.graphql type Query { user ( id : ID ! ) : User person ( id : ID ! ) : Person users ( name : String ) : [ User ! ] ! } type Mutation { signupUser ( name : String ! ) : User ! signupPerson ( name : String ! ) : Person ! createUser ( name : String ! ) : User ! createPerson ( name : String ! ) : Person ! } type User { id : ID ! name : String ! } type