Go语言中文网 为您找到相关结果 113

golang中bytes包用法

本文转自 Golove的博客http://www.cnblogs.com/golove/p/3287729.html bytes 包中的函数和方法 // bytes 包实现了用于操作 []byte 的函数,类似于 strings 包中的函数 // bytes.go ------------------------------------------------------------ // Compare 用于比较两个 []byte,并返回 int 型结果 // a == b 返回 0 // a < b 返回 -1 // a > b 返回 1 // 如果参数为 nil 则相当于传入一个空 []byte func Compare(a, b []byte) int ---------------...阅读全文

博文 2016-01-31 20:00:01 chenbaoke

Go语言/golang/位操作/取反/异或/左移/右移

Go语言位操作实例 package main import ( "fmt" ) // 获取0-n之间的所有偶数 func even(a int) (array []int) { for i := 0; i < a; i++ { if i&1 == 0 { // 位操作符&与C语言中使用方式一样 array = append(array, i) } } return array } // 互换两个变量的值 // 不需要使用第三个变量做中间变量 func swap(a, b int) (int, int) { a ^= b // 异或等于运算 b ^= a a ^= b return a, b } // 左移、右移运算 func shifting(a int) int { a = a << 1 ...阅读全文

博文 2014-10-04 19:27:13 viney

golang二进制bit位的常用操作

package main import ( "fmt" "github.com/imroc/biu" ) /** golang二进制bit位的常用操作,biu是一个转换二进制显示的库 mengdj@outlook.com */ func main() { var( /** 1个字节=8个二进制位,每种数据类型占用的字节数都不一样 注意位操作千万不要越界了,如某个类型占8个bit位,偏移时候不要超过这个范围 */ a uint8=30 ) //a输出结果:00011110 fmt.Println(biu.ToBinaryString(a)) /** 将某一位设置为1,例如设置第8位,从右向左数需要偏移7位,注意不要越界 1<<7=1000 0000 然后与a逻辑或|,偏移后的第8位为1,逻辑|...阅读全文

博文 2018-08-17 12:30:00 mengdejun

Golang直接操作共享内存

前言 故事起源于要搭一个高性能的日志中心。当然使用了elk这一套。但是,对于logstash来说,它主要使用的是文件日志的方式了捕捉log。而写文件日志的话会非常慢。对于实时日志要处理滚动的日志更是这样,每次检查是否需要流动日志,然后打开日志,然后写入,然后关闭,当然这中间可以优化。这一切都是那么慢,发起了n个系统调用,硬盘寻道等。这时候想到了用共享内存来通信。 共享内存的基本知识 要使用共享内存要执行以下几步: 发起一个系统调用,让系统帮你生产一块内存,或者取得一块已经存在的内存来使用。 把内存attach到当前进程,让当前进程可以使用。大家都知道,我们在进程中访问的是虚拟内存地址,系统会把它映射到物理内存中。如果没有这一步,第1步创建的内存就不能在当前进程访问。 这时就可以对内存进程读写...阅读全文

博文 2017-07-02 16:10:18 tenfy

golang 中map并发读写操作

go中map并发使用是不安全的,当你使用goroutine同时对一个map进行读写操作时,不确定会发生什么(由于读写执行顺序不确定造成的).针对这种情况,我们要添加读写锁对sync.RWMutex其进行同步. var counter = struct{ sync.RWMutex m map[string]int }{m: make(map[string]int)} 从counter读取数据,使用读锁 counter.RLock() n := counter.m["some_key"] counter.RUnlock() fmt.Println("some_key:", n) 向counter写数据,使用写锁 counter.Lock() counter.m["some_key"]++ cou...阅读全文

博文 2015-06-17 20:02:28 chenbaoke

go中的读写锁RWMutex

读写锁是针对于读写操作的互斥锁。 基本遵循两大原则: 1、可以随便读。多个goroutin同时读。 2、写的时候,啥都不能干。不能读,也不能写。 解释: 在32位的操作系统中,针对int64类型值的读操作和写操作不可能只由一个CPU指令完成。如果一个写的操作刚执行完了第一个指令,时间片换给另一个读的协程,这就会读到一个错误的数据。 RWMutex提供四个方法: func (*RWMutex) Lock //写锁定 func (*RWMutex) Unlock //写解锁 func (*RWMutex) RLock //读锁定 func (*RWMutex) RUnlock //读解锁 代码实例: 1、可以随便读: package main import ( "sync" "time" ) v...阅读全文

博文 2015-05-07 10:48:11 baiyuxiong

golang 位运算

http://blog.opskumu.com/golang-bitwise.html 位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算). 位操作符 一、简介 关于位运算的操作,维基百科关于 位操作符 的理论介绍已经非常清楚了。关于 Golang 的位运算其实和 C 语言比较类似,除了取反的操作和 C 语言有点区别,Golang 使用的是^x,而 C 使用的则是 ~x取反。 二、概念 << [ 左移 ] 1 << 2 == 4输出 0100 ,相比右移更常见,移位后空缺的部分全部填0 >> [ 右移 ] 10 >>...阅读全文

博文 2016-03-10 15:00:03 leonpengweicn

对GoLang里的slice要谨慎使用append操作

结论:GoLang里对slice一定要谨慎使用append操作。cap未变化时,slice是对数组的引用,并且append会修改被引用数组的值。append操作导致cap变化后,会复制被引用的数组,然后切断引用关系。 代码和注释如下: package main import ( "fmt" ) func main() { array := []int{10, 11, 12, 13, 14} slice := array[0:4] // slice是对array的引用 fmt.Println("array: ", array) // array: [20 21 12 13 14] fmt.Println("slice: cap=", cap(slice), ", value=", slice)...阅读全文

博文 2015-06-17 20:03:44 gzliudan

常用位操作技巧(Golang)

1,判断奇偶 for i := 0; i < 100; i++ { if i % 2 == 0 { println(i) } if i & 0x1 == 0 { println(i) } } 2,交换两个数 func Swap(a, b *int) { if *a^*b != 0 { temp := *a *a = *b *b = temp } } func Swap(a, b *int) { if *a^*b != 0 { *a = *a + *b *b = *a - *b *a = *a - *b } } func Swap(a, b *int) { if *a^*b != 0 { *a ^= *b *b ^= *a *a ^= *b } } 3,交换符号 func ExcangeSym...阅读全文

博文 2014-11-14 08:00:01 xlplbo

golang 位操作

package main import ( "fmt" ) // 获取0-n之间的所有偶数 func even(a int) (array []int) { for i := 0; i < a; i++ { if i&1 == 0 { // 位操作符&与C语言中使用方式一样 array = append(array, i) } } return array } // 互换两个变量的值 // 不需要使用第三个变量做中间变量 func swap(a, b int) (int, int) { a ^= b // 异或等于运算 b ^= a a ^= b return a, b } // 左移、右移运算 func shifting(a int) int { a = a << 1 a = a >> 1...阅读全文

博文 2014-12-20 19:00:01 moodlxs

Centos 安装Golang 1.9以上版本

Centos执行yum install golang,安装的go版本为1.8 # go version go version go1.8.3 linux/amd64 如果已经yum安装了go,可以通过下面的命令删掉 rm -rf /usr/bin/go rm -rf /etc/alternatives/go rm -rf /usr/lib/golang 如果想要安装1.9以上版本,得先下载官方提供的tar包,如下: https://storage.googleapis.com/golang/go1.9.4.linux-amd64.tar.gz 如果访问不了,可以从CSDN上下载https://download.csdn.net/download/zhang_gq/10311792 将tar包...阅读全文

博文 2018-03-27 18:33:05 zhang_gq

golang操作redis连接池

func newPool(server, password string) *redis.Pool { return &redis.Pool{ MaxIdle: 3, IdleTimeout: 240 * time.Second, Dial: func () (redis.Conn, error) { c, err := redis.Dial("tcp", server) if err != nil { return nil, err } if _, err := c.Do("AUTH", password); err != nil { c.Close() return nil, err } return c, err }, TestOnBorrow: func(c redis.Conn, ...阅读全文

博文 2014-10-04 19:27:36 程序员Jack

golang的杀手级应用:docker

docker 是 golang 的第一个杀手级应用,发展迅猛, 现在各大云计算平台几乎全都支持 docker 实例,包括 谷歌,亚马逊,阿里云等。 golang 本身已经让我惊喜万分,而 docker 更是极大的激发了我对虚拟化的想象。 关于软件和硬件 IT 业发展至今,软件和硬件始终是无法分割的两个物体。 就拿最近几年红红火火的智能机时代来说, 很久之前的诺基亚智能机, 软件和硬件相辅相成, 连进入主界面都需要按一个特定的按钮才能进入。 软件的操作都严重依赖键盘等按键。 体验非常不好, 对软件设计人员的约束也很大。 而苹果 iPhone 横空出世的时候, 最大限度的让你忘记硬件, 硬件主要只剩下一个 home键 和 可触控玻璃。 就是这样的 home键 和 触摸屏 组合, 大大的释放了软件...阅读全文

博文 2015-02-15 18:27:19 YanyiWu

Go 位运算

// xuhh_go_位运算符 project main.go /* 位移操作 << : 向左移位 可以看做是 乘以2的几次方 位移操作 >> : 向右移位 可以看做是 除以2的几次方 and操作 & : 都为1 才是1 or 操作 | : 只要有一个是1 那么就是1 取反 ^ :有一个为1 则 就是1 两个1 或者两个0 全是 0 标志位操作 &^ : a &^ b = (a^b) & b 其实就是清除标记位 (将a中为1的位 如果b中相同位置也为1,则将a中该位置修改为0,a中其他位不变) */ package main import ( . "fmt" ) func main() { var p = Person{"xuhh", "12"} Println(p) const a = 2...阅读全文

博文 2016-03-17 12:00:01 xuheazx

golang获取命令行参数

部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?可以使用os库和flag库。 golang os库获取命令行参数 os可以通过变量Args来获取命令参数,os.Args返回一个字符串数组,其中第一个参数就是执行文件本身。 package main import ( "fmt" "os" ) func main() { fmt.Println(os.Args) } $ ./cmd -user="root"编译执行后执行 [./cmd -user=root] 这种方式操作起来要自己封装,比较费时费劲。golang提供了flag库,可以很方便的操作命名行参数,下面介绍下flag的用法。 golang flag获取命令行参数 使用flag来操作命令行参...阅读全文

博文 2017-04-20 00:00:25 1071954237

【滴滴北京】golang开发工程师

**岗位描述:** 1. 负责专车事业部车后市场相关产品的设计、开发工作。 2. 保证系统的稳定性,并不断提升性能。 **任职资格:** 1. 对高并发、多线程、缓存等技术和业务场景有实际操作经验; 2. Golang基础扎实,有1-2个以上的项目开发经验; 3. 熟悉Linux下的常用操作,熟悉MySQL、Redis、MangoDB等数据产品; 4. 强烈的责任心与主动性,对所负责工作有owner意识,并能自我驱动成长; **联系方式:** - QQ:5889189...阅读全文

寻招golang工程师

我们是创业公司,已经有天使轮投资,现在主要在研发面向企业的一款SAAS云服务,计划在近期内投入到市场,公司整个团队实力非常强,有来自行业里懂业务的资深人士,研发人员来自IBM, 百度等, 公司欲招聘全职或实习的软件工程师,要求: 熟练掌握Linux常用操作命令,bash脚本开发; 掌握Go语言(golang)开发, 或C/java等。 热爱技术,善于学习新东西。 公司技术氛围浓厚,希望有你的加入一起打造世界级的互联网产品。 工作地点:北京市海淀区上地 期待你的简历和面谈! 有意者请发简历到openideal@126.com...阅读全文

Go语言下的文件读写操作

在Go语言中,文件是使用一个os.File类的对象指针表示的,也可以称这指针为文件句柄(filehandle),os.Stdin和os.Stdout也是属于这个*os.File类型的。 下面举例说明 package main import ( "bufio" "fmt" "io" "os" ) func main() { inputFile, inputError := os.Open(os.Args[1])//变量指向os.Open打开的文件时生成的文件句柄 if inputError != nil { fmt.Printf("An error occurred on opening the inputfile\n") return } defer inputFile.Close() in...阅读全文

博文 2014-10-23 16:00:01 学思

go 位图(bitmap)的实现

## 位图 [github地址](https://github.com/xiaomeng79/go-algorithm) https://github.com/xiaomeng79/go-algorithm ### 概念 在一个结构中,用一个比特位来描述一个数据的状态,这种结构就称为位图。位图实际上是哈希表的一种变形 ### 位图可以干什么 - 大数据滤重 - 数据排序 ### 为什么使用 - 节省内存 - 可以位操作,更快 ### 代码 ``` package bitmap import "fmt" //位图 type BitMap struct { bits []byte max int } //初始化一个BitMap //一个byte有8位,可代表8个数字,取余后加1为存放最大数所需的...阅读全文

博文 2019-03-01 12:22:53 xiaomeng

go语言初记2(备忘)

看《Go入门指南》 ,这里讲得比较基础,针对go 1.0版,以下是一些我自己觉得特别和不容易理解的地方的摘抄! 上次有说到go里不同类型之间操作必须显示转换,int和uint不固定,所以int 不是int32 int 和 uint 在 32 位操作系统上,它们均使用 32 位(4 个字节),在 64 位操作系统上,它们均使用 64 位(8 个字节)。 package main func main() { var a int var b int32 a = 15 b = a + a // 编译错误 b = b + 5 // 因为 5 是常量,所以可以通过编译 } 格式化说明符(应该不止这些) 在格式化字符串里,%d 用于格式化整数(%x 和 %X 用于格式化 16 进制表示的数字),%g 用于...阅读全文

博文 2014-10-04 19:26:32 haanico

云平台后端开发(北京)

招聘规划名额共有4个,以高级工程师为主,职位信息如下,工作地点在北京。 *开发方面简介:*原大部分开发工作在香港,占主导,与国内远程协作;公司希望国内组建起比较强的开发队伍,与香港比肩甚至更强;这也是我们国内开发同事的目标。欢迎志同道合的朋友加入~ 了解更多具体情况请到公司主页(后有链接)或致电相关人员。 ### 高级软件工程师(云平台后端) *职位描述* - 开发基于Linux平台和以Go语言为主的IaaS私有云管理平台。 - 参与系统功能和架构设计,编写相应技术文档。 - 关注技术发展,进行技术预研。 *招聘要求* - 5年以上相关领域开发经验。 - 熟悉Linux系统底层调用、多线程、网络编程。 - 熟悉Linux操作系统和其上各种系统服务,熟练配置使用...阅读全文

7天玩转云服务器

七天能干什么,赶快加入阿里云大学跟我们一起学习,7天带你玩转云服务器 课时列表 • 课时1:第1天:云服务器ECS是什么 • 课时2:第2天:上云概览——在云服务器上快速搭建个人网站 • 课时3:第3天:云服务器最基本操作——实例管理 • 课时4:第4天:云服务器磁盘管理 • 课时5:第5天:为应用创建备份——快照管理 • 课时6:第6天:轻松复用你搭建好的环境和应用——镜像管理 • 课时7:第7天:加固你的网站——云上应用的安全 开始学习:http://click.aliyun.com/m/27894/ ...阅读全文

Golang MongoDB 驱动 mgo 的若干问题

mgo 是 MongoDB 的 Golang 驱动。 连接池 我们通过 Dial 函数创建一个新的 session: session, err := mgo.Dial(url) 创建的 session 能够和 MongoDB 集群中的所有服务器通讯。需要注意的是,对于一个集群只需要调用一次 Dial,通过此 Dial 返回的 session 的 New 和 Copy 方法能够创建更多的 session 出来,这些 session 共用底层的连接池(Dial 创建的多个 session 之间使用不同的连接池)。 更为具体的来看下 Strong session(Strong 为一种一致性模式,这里讨论 Strong session 是因为其相对简单,详见下文)。一个 Strong session...阅读全文

博文 2016-11-07 03:00:16 WHACKW

请问Go中的Channel可不可以在不写入数据的情况下判断是否可写?

小白求解。。。 类似的,还有在不执行读取动作的前提下能否判断一个channel是否可读? 我不想用select case因为那样一旦判断可写/读的话这个读写操作就事实上产生了。我需要等待两个channel同时可读的时候再将它们的值同时读出来。。...阅读全文

golang 中 channel 的非阻塞访问方法

在golang中,基本的channel读写操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例: 即只要在select中加入default,阻塞立即变成非阻塞: package main import "fmt" func main() { messages := make(chan string) signals := make(chan bool) select { case msg := <-messages: fmt.Println("received message", msg) default: fmt.Println("no message received") } msg := "hi" select { case messages <- msg: fmt.Println("...阅读全文

博文 2018-10-24 15:34:49 乐剑天

Golang 1.9的主要更新

因网上这个资料难查,因此转载一份,原文请点击 Go1.9的主要更新 golang每半年更新一次版本,上次最新的版本是Go1.8,而Go1.9将在今年8月释出。Go1.9中语法的更改只有一个,那就是增加了类型别名,大部分更改是工具链,运行时,库的更改, 语法的更改 Go1.9中增加了类型别名这个语法,类型别名可以更优雅的实现当两个包之间struct的移动。类型别名的语法如下: type T1 = T2 意思是声明一个T2类型的别名T1. 工具 并行编译 在Go1.9中并行编译啊包是默认的设置,如果需要关闭并行编译,需要设置环境变量GO19CONCURRENTCOMPILATION=0。 ./…可以匹配vendor了 应各位亲们的要求,之前./...不支持匹配vendor目录下的文件,现在Go1...阅读全文

Go 原子操作

> > 本文讲解 golang 中 sync.atomic 的常见操作 atomic 提供的原子操作能够确保任一时刻只有一个goroutine对变量进行操作,善用 atomic 能够避免程序中出现大量的锁操作。 atomic常见操作有: * 增减 * 载入 * 比较并交换 * 交换 * 存储 下面将分别介绍这些操作。 ---- 增减操作 ---- atomic 包中提供了如下以Add为前缀的增减操作: - func AddInt32(addr *int32, delta int32) (new int32) ( http://link.zhihu.com/?target=https%3A//golang.org/pkg/sync/atomic/%23AddInt32 ) - func Add...阅读全文

博文 2017-11-22 02:36:28 薛锦

常用位操作技巧(Golang)

1,判断奇偶 for i := 0; i < 100; i++ { if i % 2 == 0 { println(i) } if i & 0x1 == 0 { println(i) } } 2,交换两个数 func Swap(a, b *int) { if *a^*b != 0 { temp := *a *a = *b *b = temp } } func Swap(a, b *int) { if *a^*b != 0 { *a = *a + *b *b = *a - *b *a = *a - *b } } func Swap(a, b *int) { if *a^*b != 0 { *a ^= *b *b ^= *a *a ^= *b } } 3,交换符号 func ExcangeSym...阅读全文

博文 2014-11-14 14:00:01 seago123

Golang调用TiDB

1. 连接操作## db, err := sql.Open("mysql", "root:@tcp(10.10.144.13:4000)/tmpdb?charset=utf8") 2. 建数据库## 3. Insert操作## db, err := sql.Open("mysql", "root:@tcp(10.10.144.13:4000)/tmpdb?charset=utf8") checkErr(err) stmt, err := db.Prepare(`INSERT tmpdb.index (TXID,BLOCKNUM,OFFSET) values (?,?,?)`) checkErr(err) res, err := stmt.Exec("aaa", 1, 1) checkErr(...阅读全文

博文 2018-08-28 15:35:17 Xiao_Zhang

go时间/时间戳操作大全

基本操作 01: 获取当前时间 dateTime := time.Now() fmt.Println(dateTime) 02: 获取年 月 日 时 分 秒 纳秒 year := time.Now().Year() //年 fmt.Println(year) month := time.Now().Month() //月 fmt.Println(month) day := time.Now().Day() //日 fmt.Println(day) hour := time.Now().Hour() //小时 fmt.Println(hour) minute := time.Now().Minute() //分钟 fmt.Println(minute) second := time.Now()...阅读全文

博文 2019-07-08 12:02:37 李昊天

Openfile之后,不close会有什么影响? (go小白,希望大神帮忙解释下!)

循环利用openfile以os.O_APPEND打开预定义名称的文件,然后把返回的*os.file赋给了另外一个对象,并且接着对此对象进行数据写操作,但是这个写操作是在循环外面。现在有个问题,关闭是在循环内才生效的,那么写操作无法完成;如果不关闭,可以正常进行写操作,这样会产生什么后果?谢谢!go小白,希望大神帮忙解释下...阅读全文

go源码阅读笔记(unsafe)

go源码阅读笔记(unsafe) unsafe 包主要是可以使得用户绕过go的类型规范检查,能够对指针以及其指向的区域进行读写操作。 package math import "unsafe" // Float32bits returns the IEEE 754 binary representation of f. func Float32bits(f float32) uint32 { return *(*uint32)(unsafe.Pointer(&f)) } // Float32frombits returns the floating point number corresponding // to the IEEE 754 binary representation b. fu...阅读全文

博文 2016-03-18 03:00:05 qq_15437667

用Golang写一个搜索引擎(0x02)--- 倒排索引技术

这一篇,我们来说说搜索引擎最核心的技术,倒排索引技术,倒排索引可能需要分成几篇文章才说得完,我们先会说说倒排索引的技术原理,然后会讲讲怎么用一些数据结构和算法来实现一个倒排索引,然后会说一个索引器怎么通过文档来生成一个倒排索引。 倒排索引 什么是倒排索引呢?索引我们都知道,就是为了能更快的找到文档的数据结构,比如给文档编个号,那么通过这个号就可以很快的找到某一篇文档,而倒排索引不是根据文档编号,而是通过文档中的某些个词而找到文档的索引结构。 倒排索引技术简单,高效,简直是为搜索引擎这种东西量身定做的,就是靠这个技术,实现一个搜索引擎才成为可能,我们也才能在海量的文章中通过一个关键词找到我们想要的内容。 我们看个例子,有下面的几个文档: 文档编号 文档内容 1 这是一个Go语言实现的搜索引擎 ...阅读全文

博文 2016-07-20 11:10:55 吴yh坚

请问go标准库里面有没有对一个uint32某几个bit更改或者移位的package?

最近要做一个小工具,对uint32的整数进行逻辑位操作,想请教大家一下,想实现下面的功能,有没有标准库的支持,省得自己再开发了。 (1)对某连续的几个bit进行赋值; (2)循环左移或者右移; (3)左移低位补零,或者右移高位补零。 麻烦各位专家指点一下! 谢谢...阅读全文

Go 语言是 Google 的语言,不是我们的

> GCTT 观点:有一个组织把控 Go 的发展方向,这其实一定程度上是一件好事,否则 Go 不知道又发展成什么了。 在 Twitter 上,我看到了[下面的问题](https://twitter.com/kapoorsunny/status/1130150301468700674)([via](https://old.reddit.com/r/golang/comments/bqiyyb/generics_in_go/)): > 在 Go 话题下有很多人在讨论泛型,为什么我们不能拥有像 OpenGo 这样的东西,通过社区就可以实现 Go 的泛型,而非要等待官方的实现。就像 OpenJDK 一样 对于这个问题有很多答案,但是很少有人大大方方的说出来:Go 是 Google 的语言,不是社区的...阅读全文

constants _ golang

golang 中支持 长量 const or static package main import ( "fmt" "math" ) const s string = "constant" const a = 3000 func main() { const s = 3000 fmt.Println(s) const n = (3e8 / s) fmt.Println(n) fmt.Println(int64(n)) fmt.Println(math.Sin(n)) } 3000 100000 100000 0.03574879797201651 总结 : 1 : const 常量,"const n = 3000" 这样写是ok的,但是 "n = 3000" 或 "const n := 30...阅读全文

博文 2015-03-12 03:00:00 jackkiexu

敏捷测试的关键所在!

敏捷测试要求测试能够测试在“短的时间间隔内持续发生”且能够在“短时间内完成”。考虑到纯粹的依赖人工测试基本不可能达到“短的时间间隔内持续发生”和“短时间内完成”这两个目标,而自动化测试在执行效率方面具有天然的优势,在敏捷测试中使用自动化测试技术应该是自然而然的选择。 考察敏捷开发中的一个迭代周期,在迭代周期开始的时候,团队与客户一起定义本迭代周期内需要完成的功能;开发工程师开始实现新功能,使用持续集成尽可能保证每一次代码提交不引入新的缺陷;所有新功能被添加后,回归测试保证原有功能的正确性;针对新功能运行测试保证新功能的正确性。 如果依靠手工测试来进行这些项目,毫无疑问,测试会成为整个敏捷开发的瓶颈。而如果把这些项目中的测试建立在合适的自动化测试基础上的话,测试就可以和开发一起...阅读全文