网站首页 > 文章中心 > 其它

go语言rand

作者:小编 更新时间:2023-09-11 10:57:14 浏览量:19人看过

GO GOLANG 生成范围随机数

math/rand 中的所有整数函数都生成非负数.

go语言rand-图1

示例 main.go

执行

我自己的需求这样写已足够

初学go语言,请教生成随机数为何线程越多速度越慢?

#include stdio.h

#include stdlib.h

#include time.h //用到了time函数

int main()

{ int i,number;

srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样

{

number = rand() % 101; //产生0-100的随机数

printf("%d ", number);

go语言rand-图2

}

return 0;

如何配置go语言开发环境

举例:我的机器:

GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;

GOBIN=c:\go\bin;F:\workspace\goSample01\bin;

其中,c:\go是go的安装路径;

F:\workspace\goSample01是我写的go语言项目的工程目录;

F:\workspace\goSample01\bin是go语言项目的工程目录下的可执行文件路径;

注意:这个基本环境不包含开发工具,也不能直接编译带C代码的go程序.

/downloads/list.如果下的是压缩包,请把它解压到C盘.例如,C:\gowin-env.里面有个Console.bat是以后使用go

get的环境.举例:有个文件a.go,里面import(

"fmt"

"github.com/astaxie/beedb"

_ "github.com/ziutek/mymysql/godrv"

为了编译该a.go文件,需要启动Console.bat,然后在该命令行窗口,进入c:\go\src目录下,执行go getgithub.com/astaxie/beedb

Go get github.com/ziutek/mymysql/godrv .

配置goclipse(可选)

(如果不喜欢eclipse开发工具,请跳过这个配置.)

packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}

配置gocode(可选)

如果不需要go语法辅助和eclipse里面的(按ALT+/)弹出go语言自动辅助功能,请跳过这个配置.

从开发工具这块看,go语言还不够成熟,开发工具都还不完善,有待改进.

Google有个在线运行go语言的教程(),很不错.支持在web上直接运行大部分的go程序,想了解这个教程的源代码的朋友可以通过以下方式获取.如果没兴趣,可以跳过这个步骤.

hg clone

编译带调用C代码的go文件(可选)

set GOOS=windows

set GOROOT=c:\go

set GOBIN=%GOROOT%\bin

set GOPATH=%GOROOT%;F:\workspace\goSample01;

例如:

go build -compiler gccgo test_c.go

运行调用C代码的go文件(可选)

①.、testc.go.

创建rand目录,然后在rand里面创建testc.go. 代码如下:

package rand

/*

//

*/

import "C"

func PrintHello() {

C.puts(C.CString("Hello, world\n"))

在rand下创建a.go.代码如下:

import "fmt"

func SayHello(name string){

fmt.Println(name)

在rand的上一级创建test_import.go.代码如下:

package main

import "./rand"

func main(){

rand.SayHello("tom")

rand.PrintHello()

go run test_import.go

在测试其它几个C代码的时候,发现windows版本的cgo还有些编译问题,同样的代码转移到苹果的XCODE下就没有问题.后来终于发现原因了,原来有些例子是unix平台下的,而在windows平台下,方法名和参数需要做调整.

例如:下面代码在windows下编译报一堆错误.

func Random() int {

return int(C.random())

func Seed(i int) {

go语言rand-图3

C.srandom(C.uint(i))

这里需要把return int(C.random()) 修改为"return int(C.rand())"

C.srandom(C.uint(i))修改为"C.srand(C.uint(i))"编译就OK了.

golang连续生成随机数

const NUM int = 100

for i := 0; i NUM; i += 1 {

其实在循环里面这点时间间隔,纳秒也是跟不上的.

还有,你用sleep的方法肯定是不能接受的!!!

如何在golang 中调用c的静态库或者动态库

Cgo 使得Go程序能够调用C代码. cgo读入一个用特别的格式写的Go语言源文件, 输出Go和C程序, 使得C程序能打包到Go语言的程序包中.

举例说明一下. 下面是一个Go语言包, 包含了两个函数 -- Random 和 Seed -- 是C语言库中random和srandom函数的马甲.

*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我们来看一下这里都有什么内容. 开始是一个包的导入语句.

rand包导入了"C"包, 但你会发现在Go的标准库里没有这个包. 那是因为C是一个"伪包", 一个为cgo引入的特殊的包名, 它是C命名空间的一个引用.

Random函数调用libc中的random函数, 然后回返结果. 在C中, random返回一个C类型的长整形值, cgo把它轮换为C.long. 这个值必需转换成Go的类型, 才能在Go程序中使用. 使用一个常见的Go类型转换:

func Random() int { return int(C.random()) }

这是一个等价的函数, 使用了一个临时变量来进行类型转换:

func Random() int { var r C.long = C.random() return int(r) }

Seed函数则相反. 它接受一个Go语言的int类型, 转换成C语言的unsigned int类型, 然后传递给C的srandom函数.

func Seed(i int) { C.srandom(C.uint(i)) }

需要注意的是, cgo中的unsigned int类型写为C.uint; cgo的文档中有完整的类型列表.

这个例子中还有一个细节我们没有说到, 那就是导入语句上面的注释.

*/ import "C"

Cgo可以识别这个注释, 并在编译C语言程序的时候将它当作一个头文件来处理. 在这个例子中, 它只是一个include语句, 然而其实它可以是使用有效的C语言代码. 这个注释必需紧靠在import "C"这个语句的上面, 不能有空行, 就像是文档注释一样.

Strings and things

与Go语言不同, C语言中没有显式的字符串类型. 字符串在C语言中是一个以0结尾的字符数组.

Go和C语言中的字符串转换是通过C.CString, C.GoString,和C.GoStringN这些函数进行的. 这些转换将得到字符串类型的一个副本.

下一个例子是实现一个Print函数, 它使用C标准库中的fputs函数把一个字符串写到标准输出上:

package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中进行的内存分配是不能被Go语言的内存管理器感知的. 当你使用C.CString创建一个C字符串时(或者其它类型的C语言内存分配), 你必需记得在使用完后用C.free来释放它.

调用C.CString将返回一个指向字符数组开始处的指错, 所以在函数退出前我们把它转换成一个unsafe.Pointer(Go中与C的void 等价的东西), 使用C.free来释放分配的内存. 一个惯用法是在分配内存后紧跟一个defer(特别是当这段代码比较复杂的时候), 这样我们就有了下面这个Print函数:

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

构建 cgo 包

如果你使用goinstall, 构建cgo包就比较容易了, 只要调用像平常一样使用goinstall命令, 它就能自动识别这个特殊的import "C", 然后自动使用cgo来编译这些文件.

如果你想使用Go的Makefiles来构建, 那在CGOFILES变量中列出那些要用cgo处理的文件, 就像GOFILES变量包含一般的Go源文件一样.

rand包的Makefile可以写成下面这样:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然后输入gomake开始构建.

更多 cgo 的资源

cgo的文档中包含了关于C伪包的更多详细的说明, 以及构建过程. Go代码树中的cgo的例子给出了更多更高级的用法.

一个简单而又符合Go惯用法的基于cgo的包是Russ Cox写的gosqlite. 而Go语言的网站上也列出了更多的的cgo包.

最后, 如果你对于cgo的内部是怎么运作这个事情感到好奇的话, 去看看运行时包的cgocall.c文件的注释吧.

在 Go 中实现一个支持并发的 TCP 服务端

你可以在 GitHub 上找到本项目的源码:concTcp.go.

这个程序的主要逻辑在 handleConnection 函数中,具体实现如下:

首先, main 确保程序至少有一个命令行参数.注意,现有代码并没有检查这个参数是否为有效的 TCP 端口号.不过,如果它是一个无效的 TCP 端口号, net.Listen 就会调用失败,并返回一个错误信息,类似下面这样:

你可以在 维基百科上找到更多关于 nc (即 netcat )的信息.

via:

以上就是土嘎嘎小编为大家整理的go语言rand相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章