golang

Golang基础(5):Go语言反射规则

寵の児 提交于 2019-12-27 00:29:19
Go语言反射规则 - The Laws of Reflection 转: http://my.oschina.net/qbit/blog/213720 原文地址: http://blog.golang.org/laws-of-reflection 介绍 反射在计算机的概念里是指一段程序审查自身结构的能力,主要通过类型进行审查。它是元编程的一种形式,同样也是引起混乱的重大来源。 在这篇文章里我们试图阐明Go语言中的反射是如何工作的。每种语言的反射模型是不同的(许多语言不支持反射),然而本文只与Go有关,所以我们接下来所提到的“反射”都是指Go语言中的反射。 类型与接口 由于反射是建立在类型系统(type system)上的,所以我们先来复习一下Go语言中的类型。 Go是一门静态类型的语言。每个变量都有一个静态类型,类型在编译的时后被知晓并确定了下来。 ? 1 2 3 4 type MyInt int var i int var j MyInt 变量 i 的类型是 int ,变量 j 的类型是 MyInt 。虽然它们有着相同的基本类型,但静态类型却不一样,在没有类型转换的情况下,它们之间无法互相赋值。 接口是一个重要的类型,它意味着一个确定的的方法集合。一个接口变量可以存储任何实现了接口的方法的具体值(除了接口本身)。一个著名的例子就是 io.Reader 和 io.Writer :

GOLANG 反射法则

心已入冬 提交于 2019-12-27 00:24:52
译自[blog.golang.org/laws-of-reflection] 在计算机中, 反射是程序通过类型,检测到它自己的结构能力;是一种元编程程;也是一个具大的混淆点 在本文中,我们将通过解释反射是如何在GO中工作的来澄清它。每个语言的反射模式是不同的。本文着重于GO, 所以后文中的反射都是指GO中的反射 1.类型和接口 因为反射是修建于类型系统之上, 所以让我们从GO的类型开始讲吧。 GO是静态类型语言。 每个变量都有一个静态类型。 也就是说, 每一个已经类型在编译时已经固定了其类型:int, float32...等 假如我们声明如下: type MyInt int var i int var j MyInt 则i的类型为int; j的类型为MyInt;变量i和j有明显不同的静态类型, 而潜在下层类型, 他们可以彼此赋值不须要转换。 还有一种重要类型是接口类型,它代表了一组固定的方法集。一个接口变量能存储任一实体值,只要它实现了接口方法集。以大家所 熟知的接口为例, io.Reader和io.Writer, 它们的类型摘自io 包。 // Reader 就是一个包含了基本读方法的接口 type Reader interface { Read(p []byte[(n int, err error) } // Writher就是一个包含了基本写方法的接口 type Writer

Golang Go Go Go part2:变量及常量声明

为君一笑 提交于 2019-12-26 23:13:48
三、关键字及内置预声明常量、类型、函数 1、关键字 Go有25个关键字,只能用在语法允许的地方,不能作为名称使用,它们是: break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var 2、内置的预声明的常量、类型和函数 常量:true false iota nil 类型:int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error 函数: make len cap new append copy close delete complex real imag panic recover 四、变量及常量的声明 1、变量 标识符 (包括变量、常量、函数、包名)必须以字符开头(所有Unicode UTF-8中的字符 或 下划线“_”),不能使用数字开头。 变量的三个作用域:在函数的形式参数和函数内声明的变量(常量、函数也是)是局部变量

golang调试工具Delve

↘锁芯ラ 提交于 2019-12-26 02:11:43
转自:http://www.cnblogs.com/li-peng/p/8522592.html Devle 是一个非常棒的golang 调试工具,支持多种调试方式,直接运行调试,或者attach到一个正在运行中的golang程序,进行调试。   线上golang服务出现问题时,Devle是必不少的在线调试工具,如果使用docker,也可以把Devle打进docker镜像里,调试代码。   安装Devle   安装Devle非常简单,直接运行go get 即可: go get -u github.com/derekparker/delve/cmd/dlv   如果你的go版本为1.5请先设置环境变量GO15VENDOREXPERIMENT=1再运行go get。我的go版本为1.10,不用设置。   使用Devle调试golang服务   先写一个简单的web服务,然后使用Devle来进行调试。   在$GOPATH/src/github.com/mytest 文件夹下创建main.go 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "os" 8 ) 9 10 const port = "8000" 11 12 func main() { 13 http.HandleFunc("/hi", hi) 14 15

golang调试工具Delve

蓝咒 提交于 2019-12-26 02:10:59
   Devle 是一个非常棒的golang 调试工具,支持多种调试方式,直接运行调试,或者attach到一个正在运行中的golang程序,进行调试。   线上golang服务出现问题时,Devle是必不少的在线调试工具,如果使用docker,也可以把Devle打进docker镜像里,调试代码。   安装Devle   安装Devle非常简单,直接运行go get 即可: go get -u github.com/derekparker/delve/cmd/dlv   如果你的go版本为1.5请先设置环境变量 GO15VENDOREXPERIMENT=1 再运行go get。我的go版本为1.10,不用设置。   使用Devle调试golang服务   先写一个简单的web服务,然后使用Devle来进行调试。   在$GOPATH/src/github.com/mytest 文件夹下创建main.go 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "os" 8 ) 9 10 const port = "8000" 11 12 func main() { 13 http.HandleFunc("/hi", hi) 14 15 fmt.Println("runing on port: " + port) 16

vscode调试golang环境搭建及配置

梦想与她 提交于 2019-12-26 02:09:17
准备VSCode 在官网下载最新版的VSCode: 安装Golang插件 打开扩展面板 VSCode->查看->扩展 找到Go插件 在搜索框里输入Go, 找到第二行写有 Rich Go language support for Visual Studio Code的插件, 点击安装 注意不是排名最高的 重启编辑器 配置启动项 打开调试面板 VSCode->查看->调试 添加调试目标 在"没有调试"的下拉框中点击"添加配置.." 添加目标调试配置 例子: { "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "debug", "remotePath": "", "port": 2345, "host": "127.0.0.1", "program": "${fileDirname}", "env": { "GOPATH":"D:/Develop/vscodegolang" }, "args": [], "showLog": true } ] } 其中: "port", "host"都是go插件自动生成的 "env"为设置环境变量, 设置为你的工程目录就可以(包含bin, src的文件夹) 准备调试插件 此时找到main.go按F5

golang--- Redis 操作

别来无恙 提交于 2019-12-25 20:19:01
1. Redis简介 Redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 1.1 特点 支持更多数据类型 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。 [1] 支持复杂操作 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。 [2] 支持主从同步。 与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。 Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部

Programming in Go (Golang) – Setting up a Mac OS X Development Environment

谁说胖子不能爱 提交于 2019-12-25 07:04:54
http://www.distilnetworks.com/setup-go-golang-ide-for-mac-os-x/#.V1Byrf50yM8 Programming in Go (Golang) – Setting up a Mac OS X Development Environment Published on February 4, 2015 At Distil, we have recently started to use Go (Golang) to expand the functionality of our data platform. A surprisingly challenging aspect of getting started with Go was setting up a development environment on my MacBook. We learned a few things along the way and hopefully information below will help you as you setup your Go development environment. Project Workspace The GOPATH environment variable is a key

golang学习笔记---函数、方法和接口

谁都会走 提交于 2019-12-25 04:22:24
函数: 对应操作序列,是程序的基本组成元素。 函数有具名和匿名之分: 具名函数一般对应于包级的函数,是匿名函数的一种特例,当匿名函数引用了外部 作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心。方法是绑 定到一个具体类型的特殊函数,Go语言中的方法是依托于类型的,必须在编译时静 态绑定 接口: 定义了方法的集合,这些方法依托于运行时的接口对象,因此接口对 应的方法是在运行时动态绑定的。 Go程序函数启动顺序的示意图: 要注意的是,在 main.main 函数执行之前所有代码都运行在同一个goroutine,也 就是程序的主系统线程中。 因此,如果某个 init 函数内部用go关键字启动了新的 goroutine的话,新的goroutine只有在进入 main.main 函数之后才可能被执行到。 函数 在Go语言中,函数是第一类对象,我们可以将函数保持到变量中。函数主要有具名 和匿名之分,包级函数一般都是具名函数,具名函数是匿名函数的一种特例 // 具名函数 func Add(a, b int) int {   return a+b } // 匿名函数 var Add = func(a, b int) int {   return a+b } Go语言中的函数可以有多个参数和多个返回值,参数和返回值都是以传值的方式和 被调用者交换数据。在语法上,函数还支持可变数量的参数

Golang编程之变量篇

我是研究僧i 提交于 2019-12-25 04:22:07
1、变量的简介 变量是大多数编程语言中最基本的组成元素。从本质上说,变量相当于是对一块或者多块数据存储空间的命名,程序可以通过定义一个变量来申请一块或者多块数据存储空间,之后可以通过引用变量名来使用这些存储空间。作为静态类型语言,Go语言变量总是有固定的数据类型,类型决定了变量内存的长度和存储格式。 2、变量的定义 关键字var用于定义变量,和C语言不同,类型被放在变量名后。 变量定义的一般语法如下: var 变量名字 类型 = 初始化表达式 其中“类型”或“初始化表达式”两个部分可以省略其中的一个。如果省略的是“类型”,那么编译器将根据初始化表达式来推导变量的类型信息;如果“表达式”被省略,那么将用零值( 数值类型变量对应的零值是0,布尔类型变量对应的零值是false,字符串类型对应的零值是空字符串,接口或引用类型变量对应的零值是nil )初始化该变量。零值初始化机制可以确保每个声明的变量总是有一个良好定义的值,因此在Go语言中不存在未初始化的变量。 在一个语句中同时定义一组变量,或用一组初始化表达式定义并初始化一组变量: var i, j, k int // int, int, int var b, f, s = true, 2.3, "four" // bool, float64, string 一组变量也可以通过调用一个函数,由函数返回的多个返回值初始化: var ret,