go语言实现的memcache协议服务的方法

时间:2022-05-07 13:10:39 其他范文 收藏本文 下载本文

go语言实现的memcache协议服务的方法((推荐15篇))由网友“无主”投稿提供,下面是小编为大家推荐的go语言实现的memcache协议服务的方法,欢迎大家分享。

go语言实现的memcache协议服务的方法

篇1:go语言实现的memcache协议服务的方法

作者:小 字体:[增加 减小] 类型:

完整实例代码点击此处本站下载。

1. Go语言代码如下:

代码如下:

package memcachep

import (

“bufio”

“fmt”

“io”

“strconv”

“strings”

)

//mc请求产生一个request对象

type MCRequest struct {

//请求命令

Opcode CommandCode

//key

Key string

//请求内容

Value []byte

//请求标识

Flags int

//请求内容长度

Length int

//过期时间

Expires int64

}

//request to string

func (req *MCRequest) String string {

return fmt.Sprintf(“{MCRequest pcode=%s, bodylen=%d, key=‘%s‘}”,

req.Opcode, len(req.Value), req.Key)

}

//将socket请求内容 解析为一个MCRequest对象

func (req *MCRequest) Receive(r *bufio.Reader) error {

line, _, err := r.ReadLine()

if err != nil || len(line) == 0 {

return io.EOF

}

params := strings.Fields(string(line))

command := CommandCode(params[0])

switch command {

case SET, ADD, REPLACE:

req.Opcode = command

req.Key = params[1]

req.Length, _ = strconv.Atoi(params[4])

value := make([]byte, req.Length+2)

io.ReadFull(r, value)

req.Value = make([]byte, req.Length)

copy(req.Value, value)

case GET:

req.Opcode = command

req.Key = params[1]

RunStats[“cmd_get”].(*CounterStat).Increment(1)

case STATS:

req.Opcode = command

req.Key = “”

case DELETE:

req.Opcode = command

req.Key = params[1]

}

return err

}

2. Go语言代码:

代码如下:

package memcachep

import (

“fmt”

“io”

)

type MCResponse struct {

//命令

Opcoed CommandCode

//返回状态

Status Status

//key

Key string

//返回内容

Value []byte

//返回标识

Flags int

//错误

Fatal bool

}

//解析response 并把返回结果写入socket链接

func (res *MCResponse) Transmit(w io.Writer) (err error) {

switch res.Opcoed {

case STATS:

_, err = w.Write(res.Value)

case GET:

if res.Status == SUCCESS {

rs := fmt.Sprintf(“VALUE %s %d %drn%srnENDrn”, res.Key, res.Flags, len(res.Value), res.Value)

_, err = w.Write([]byte(rs))

} else {

_, err = w.Write([]byte(res.Status.ToString()))

}

case SET, REPLACE:

_, err = w.Write([]byte(res.Status.ToString()))

case DELETE:

_, err = w.Write([]byte(“DELETEDrn”))

}

return

}

3. Go语言代码如下:

代码如下:

package memcachep

import (

“fmt”

)

type action func(req *MCRequest, res *MCResponse)

var actions = map[CommandCode]action{

STATS: StatsAction,

}

//等待分发处理

func waitDispatch(rc chan chanReq) {

for {

input := <-rc

input.response <- dispatch(input.request)

}

}

//分发请求到响应的action操作函数上去

func dispatch(req *MCRequest) (res *MCResponse) {

if h, ok := actions[req.Opcode]; ok {

res = &MCResponse{}

h(req, res)

} else {

return notFound(req)

}

return

}

//未支持命令

func notFound(req *MCRequest) *MCResponse {

var response MCResponse

response.Status = UNKNOWN_COMMAND

return &response

}

//给request绑定上处理程序

func BindAction(opcode CommandCode, h action) {

actions[opcode] = h

}

//stats

func StatsAction(req *MCRequest, res *MCResponse) {

res.Fatal = false

stats := “”

for key, value := range RunStats {

stats += fmt.Sprintf(“STAT %s %srn”, key, value)

}

stats += “ENDrn”

res.Value = []byte(stats)

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇2:GO语言实现简单TCP服务的方法

作者:小小的我 字体:[增加 减小] 类型:转载

这篇文章主要介绍了GO语言实现简单TCP服务的方法,实例分析了Go语言实现TCP服务的技巧,需要的朋友可以参考下

本文实例讲述了GO语言实现简单TCP服务的方法,分享给大家供大家参考。具体实现方法如下:

代码如下:

package main

import (

“net”

“fmt”

)

var (  maxRead = 1100

msgStop  = []byte(“cmdStop”)

msgStart = []byte(“cmdContinue”)

)

func main() {

hostAndPort := “localhost:54321”

listener := initServer(hostAndPort)

for {

conn, err := listener.Accept()

checkError(err, “Accept: ”)

go connectionHandler(conn)

}

}

func initServer(hostAndPort string) *net.TCPListener {

serverAddr, err := net.ResolveTCPAddr(“tcp”, hostAndPort)

checkError(err, “Resolving address:port failed: ‘” + hostAndPort + “‘”)

listener, err := net.ListenTCP(“tcp”, serverAddr)

checkError(err, “ListenTCP: ”)

println(“Listening to: ”, listener.Addr().String())

return listener

}

func connectionHandler(conn net.Conn) {

connFrom := conn.RemoteAddr().String()

println(“Connection from: ”, connFrom)

talktoclients(conn)

for {

var ibuf []byte = make([]byte, maxRead + 1)

length, err := conn.Read(ibuf[0:maxRead])

ibuf[maxRead] = 0 // to prevent overflow

switch err {

case nil:

handleMsg(length, err, ibuf)

default:

goto DISCONNECT

}

}

DISCONNECT:

err := conn.Close()

println(“Closed connection:” , connFrom)

checkError(err, “Close:” )

}

func talktoclients(to net.Conn) {

wrote, err := to.Write(msgStart)

checkError(err, “Write: wrote ” + string(wrote) + “ bytes.”)

}

func handleMsg(length int, err error, msg []byte) {

if length > 0 {

for i := 0; ; i++ {

if msg[i] == 0 {

break

}

}

fmt.Printf(“Received data: %v”, string(msg[0:length]))

fmt.Println(“  length:”,length)

}

}

func checkError(error error, info string) {

if error != nil {

panic(“ERROR: ” + info + “ ” + error.Error()) // terminate program

}

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇3:Go语言单链表实现方法

作者:OSC首席键客 字体:[增加 减小] 类型:

1. singlechain.go代码如下:

代码如下:

//////////

//单链表 -- 线性表

package singlechain

//定义节点

type Node struct {

Data int

Next *Node

}

/*

* 返回第一个节点

* h 头结点

*/

func GetFirst(h *Node) *Node {

if h.Next == nil {

return nil

}

return h.Next

}

/*

* 返回最后一个节点

* h 头结点

*/

func GetLast(h *Node) *Node {

if h.Next == nil {

return nil

}

i := h

for i.Next != nil {

i = i.Next

if i.Next == nil {

return i

}

}

return nil

}

//取长度

func GetLength(h *Node) int {

var i int = 0

n := h

for n.Next != nil {

i++

n = n.Next

}

return i

}

//插入一个节点

//h: 头结点

//d:要插入的节点

//p:要插入的位置

func Insert(h, d *Node, p int) bool {

if h.Next == nil {

h.Next = d

return true

}

i := 0

n := h

for n.Next != nil {

i++

if i == p {

if n.Next.Next == nil {

n.Next = d

return true

} else {

d.Next = n.Next

n.Next = d.Next

return true

}

}

n = n.Next

if n.Next == nil {

n.Next = d

return true

}

}

return false

}

//取出指定节点

func GetLoc(h *Node, p int) *Node {

if p < 0 || p > GetLength(h) {

return nil

}

var i int = 0

n := h

for n.Next != nil {

i++

n = n.Next

if i == p {

return n

}

}

return nil

}

2. main.go代码如下:

代码如下:

package main

import “fmt”

import “list/singlechain”

func main {

//初始化一个头结点

var h singlechain.Node

//往链表插入10个元素

for i := 1; i <= 10; i++ {

var d singlechain.Node

d.Data = i

singlechain.Insert(&h, &d, i)

fmt.Println(singlechain.GetLoc(&h, i))

}

fmt.Println(singlechain.GetLength(&h))

fmt.Println(singlechain.GetFirst(&h))

fmt.Println(singlechain.GetLast(&h))

fmt.Println(singlechain.GetLoc(&h, 6))

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇4:Go语言实现简单留言板的方法

作者:不吃皮蛋 字体:[增加 减小] 类型:转载

代码如下:

package main

import (

// “fmt”

“io”

“log”

“net/http”

“text/template”

“time”

“database/sql”

“github.com/ziutek/mymysql/godrv”

)

// 留言结构

type Liuyan struct {

Id int

Name string

Content string

Time int

}

// 显示留言时间

func (l Liuyan) ShowTime() string {

t := time.Unix(int64(l.Time), 0)

return t.Format(“-01-02 15:04:05”)

}

func main() {

godrv.Register(“SET NAMES utf8”)

// 连接数据库

db, err := sql.Open(“mymysql”, “tcp:127.0.0.1:3306*go/root/123456”)

if err != nil {

panic(err)

}

defer db.Close()

// 准备模板

tpl, err := template.New(“liuyanbook”).Parse(html)

if err != nil {

panic(err)

}

// 显示留言页面 /

requestList := func(w http.ResponseWriter, req *http.Request) {

// 查询数据

rows, err := db.Query(“select * from liuyan”)

if err != nil {

log.Fatal(err)

}

defer rows.Close()

// 获取数据

lys := []Liuyan{}

for rows.Next() {

ly := Liuyan{}

err := rows.Scan(&ly.Id, &ly.Name, &ly.Content, &ly.Time)

if nil != err {

log.Fatal(err)

}

lys = append(lys, ly)

}

// 显示数据

err = tpl.ExecuteTemplate(w, “list”, lys)

if err != nil {

log.Fatal(err)

}

}

// 留言页面 /liuyan

requestLiuyan := func(w http.ResponseWriter, req *http.Request) {

err := req.ParseForm()

if err != nil{

log.Fatal(err)

}

if “POST” == req.Method {

if len(req.Form[“name”]) < 1 {

io.WriteString(w, “参数错误!n”)

return

}

if len(req.Form[“content”]) < 1 {

io.WriteString(w, “参数错误!n”)

return

}

name := template.HTMLEscapeString(req.Form.Get(“name”))

content := template.HTMLEscapeString(req.Form.Get(“content”))

// sql语句

sql, err := db.Prepare(“insert into liuyan(name, content, time) values(?, ?, ?)”)

if err != nil {

log.Fatal(err)

}

defer sql.Close()

// sql参数,并执行

_, err = sql.Exec(name, content, time.Now().Unix())

if err != nil {

log.Fatal(err)

}

// 跳转

w.Header().Add(“Location”, “/”)

w.WriteHeader(302)

// 提示信息

io.WriteString(w, “提交成功!n”)

return

}

err = tpl.ExecuteTemplate(w, “liuyan”, nil)

if err != nil {

log.Fatal(err)

}

}

http.HandleFunc(“/”, requestList)

http.HandleFunc(“/liuyan”, requestLiuyan)

err = http.ListenAndServe(“:12345”, nil)

if err != nil {

log.Fatal(“ListenAndServe: ”, err)

}

}

// 网页模板

var html string = `{{define “list”}}{{/* 留言列表页面 */}}

给我留言

{{range .}}

{{.Id}}{{.Name}}{{.Content}}{{.ShowTime}}

{{end}}

{{end}}

{{define “liuyan”}}{{/* 发布留言页面 */}}

姓名:

内容:

{{end}}

希望本文所述对大家的Go语言程序设计有所帮助,

篇5:Go语言的队列和堆栈实现方法

作者:不吃皮蛋 字体:[增加 减小] 类型:

golang,其实我的实现是利用container/list包实现的,其实container/list包很强大.

代码如下:

package main

import (

“fmt”

“container/list”

)

func main {

// 生成队列

l := list.New()

// 入队, 压栈

l.PushBack(1)

l.PushBack(2)

l.PushBack(3)

l.PushBack(4)

// 出队

i1 := l.Front()

l.Remove(i1)

fmt.Printf(“%dn”, i1.Value)

// 出栈

i4 := l.Back()

l.Remove(i4)

fmt.Printf(“%dn”, i1.Value)

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇6:Go语言实现Fibonacci数列的方法

作者:books1958 字体:[增加 减小] 类型:转载

这篇文章主要介绍了Go语言实现Fibonacci数列的方法,实例分析了使用递归和不使用递归两种技巧,并对算法的效率进行了对比,需要的朋友可以参考下

本文实例讲述了Go语言实现Fibonacci数列的方法,分享给大家供大家参考。具体如下:

Fibonacci数列:1,1,2,3,5,8,13,21,,, (即从第三项起,每一项的值都等于前两项之后)

第一种,使用递归:

代码如下:

func fibonacci(a int) int {

if a == 1 || a == 2 {

return 1

}

return fibonacci(a-1) + fibonacci(a-2)

}

第二种,不使用递归:

代码如下:

func fibonacci_version2(index int) int {

if index == 1 || index == 2 {

return 1

}

a, b := 1, 1

for i := 3; i <= index; i++ {

a, b = b, (a + b)

}

return a + b

}

经过检验,使用非递归算法的效率要远远高于递归算法,

希望本文所述对大家的Go语言程序设计有所帮助。

篇7:Go语言实现socket实例

作者:不吃皮蛋 字体:[增加 减小] 类型:

用golang不用他的net包还有什么意义,这里提供一个测试代码:

server.go 服务端:

代码如下:

package main

import (

“fmt”

“log”

“net”

“bufio”

)

func handleConnection(conn net.Conn) {

data, err := bufio.NewReader(conn).ReadString(‘n‘)

if err != nil {

log.Fatal(“get client data error: ”, err)

}

fmt.Printf(“%#vn”, data)

fmt.Fprintf(conn, “hello clientn”)

conn.Close

}

func main() {

ln, err := net.Listen(“tcp”, “:6010”)

if err != nil {

panic(err)

}

for {

conn, err := ln.Accept()

if err != nil {

log.Fatal(“get client connection error: ”, err)

}

go handleConnection(conn)

}

}

client.go 客户端:

代码如下:

package main

import (

“fmt”

“net”

“bufio”

)

func main() {

conn, err := net.Dial(“tcp”, “:6010”)

if err != nil {

panic(err)

}

fmt.Fprintf(conn, “hello servern”)

data, err := bufio.NewReader(conn).ReadString(‘n‘)

if err != nil {

panic(err)

}

fmt.Printf(“%#vn”, data)

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇8:GO语言实现文件上传代码

本文给大家分享的是一则使用golang实现文件上传的代码,主要是使用os.Create创建文件,io.Copy来保存文件,思路非常清晰,这里推荐给大家,有需要的小伙伴参考下吧,

功能很简单,代码也很简洁,这里就不多废话了。

代码如下:

package main

import (

“fmt”

“io”

“net/http”

“os”

)

const (

upload_path string = “./upload/”

)

func helloHandle(w http.ResponseWriter, r *http.Request) {

io.WriteString(w, “hello world!”)

}

//上传

func uploadHandle(w http.ResponseWriter, r *http.Request) {

//从请求当中判断方法

if r.Method == “GET” {

io.WriteString(w, “我的第一个页面

”)

} else {

//获取文件内容 要这样获取

file, head, err := r.FormFile(“file”)

if err != nil {

fmt.Println(err)

return

}

defer file.Close()

//创建文件

fW, err := os.Create(upload_path + head.Filename)

if err != nil {

fmt.Println(“文件创建失败”)

return

}

defer fW.Close()

_, err = io.Copy(fW, file)

if err != nil {

fmt.Println(“文件保存失败”)

return

}

//io.WriteString(w, head.Filename+“ 保存成功”)

http.Redirect(w, r, “/hello”, http.StatusFound)

//io.WriteString(w, head.Filename)

}

}

func main() {

//启动一个http 服务器

http.HandleFunc(“/hello”, helloHandle)

//上传

http.HandleFunc(“/image”, uploadHandle)

err := http.ListenAndServe(“:8080”, nil)

if err != nil {

fmt.Println(“服务器启动失败”)

return

}

fmt.Println(“服务器启动成功”)

}

以上所述就是本文的全部内容了,希望大家能够喜欢,能够对大家学习go语言有所帮助,

篇9:go语言实现字符串base64编码的方法

作者:令狐不聪 字体:[增加 减小] 类型:

这篇文章主要介绍了go语言实现字符串base64编码的方法,实例分析了Go语言操作字符串的技巧及base64编码的使用技巧,需要的朋友可以参考下

本文实例讲述了go语言实现字符串base64编码的方法,分享给大家供大家参考。具体实现方法如下:

代码如下:

package main

import (

“fmt”

“encoding/base64”

)

func main {

var b bytes.Buffer

w := base64.NewEncoder(base64.URLEncoding, &b)

w.Write(data)

w.Close()

data := b.Bytes()

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇10:GO语言实现列出目录和遍历目录的方法

这篇文章主要介绍了GO语言实现列出目录和遍历目录的方法,涉及ioutil.ReadDir()与filepath.Walk()的应用,是非常实用的技巧,需要的朋友可以参考下

GO语言获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法课参考本文示例。

具体示例代码如下:

代码如下:

package main

import (

“fmt”

“io/ioutil”

“os”

“path/filepath”

“strings”

)

//获取指定目录下的所有文件,不进入下一级目录搜索,可以匹配后缀过滤。

func ListDir(dirPth string, suffix string) (files []string, err error) {

files = make([]string, 0, 10)

dir, err := ioutil.ReadDir(dirPth)

if err != nil {

return nil, err

}

PthSep := string(os.PathSeparator)

suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写

for _, fi := range dir {

if fi.IsDir() { // 忽略目录

continue

}

if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) { //匹配文件

files = append(files, dirPth+PthSep+fi.Name())

}

}

return files, nil

}

//获取指定目录及所有子目录下的所有文件,可以匹配后缀过滤,

func WalkDir(dirPth, suffix string) (files []string, err error) {

files = make([]string, 0, 30)

suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写

err = filepath.Walk(dirPth, func(filename string, fi os.FileInfo, err error) error { //遍历目录

//if err != nil { //忽略错误

// return err

//}

if fi.IsDir() { // 忽略目录

return nil

}

if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) {

files = append(files, filename)

}

return nil

})

return files, err

}

func main() {

files, err := ListDir(“D:Go”, “.txt”)

fmt.Println(files, err)

files, err = WalkDir(“E:Study”, “.pdf”)

fmt.Println(files, err)

}

希望本文所述对大家的GO语言程序设计有所帮助。

篇11:GO语言实现的端口扫描器

这篇文章主要介绍了GO语言实现的端口扫描器分享,本文直接给出实现代码,代码中包含大量注释,需要的朋友可以参考下

代码如下:

//GO语言 实现端口扫描

//缺陷

//port 无法设置成全局变量不知道怎么设置的

//var l = list.New  这个是数组操作并不是消息队列   跟消息队列功能类似

//实现功能

//实现生成 IP段

//实现端口扫描

//实现参数传入

//写入文件到本地

//main.go 58.215.20.30 58.215.201.30 80

//文件名 开始IP 结束IP 扫描端口

//QQ29295842  希望认识更多的朋友技术交流

//QQ群367196336  go  golang WEB安全开发

package main

import (

“container/list”

“fmt”

“net”

“os”

“strconv”

“strings”

“time”

)

func ip2num(ip string) int {

canSplit := func(c rune) bool { return c == ‘.‘ }

lisit := strings.FieldsFunc(ip, canSplit) //[58 215 20 30]

//fmt.Println(lisit)

ip1_str_int, _ := strconv.Atoi(lisit[0])

ip2_str_int, _ := strconv.Atoi(lisit[1])

ip3_str_int, _ := strconv.Atoi(lisit[2])

ip4_str_int, _ := strconv.Atoi(lisit[3])

return ip1_str_int<<24 | ip2_str_int<<16 | ip3_str_int<<8 | ip4_str_int

}

func num2ip(num int) string {

ip1_int := (num & 0xff000000) >> 24

ip2_int := (num & 0x00ff0000) >> 16

ip3_int := (num & 0x0000ff00) >> 8

ip4_int := num & 0x000000ff

//fmt.Println(ip1_int)

data := fmt.Sprintf(“%d.%d.%d.%d”, ip1_int, ip2_int, ip3_int, ip4_int)

return data

}

func gen_ip(Aip1 int, Aip2 int) {

index := Aip1

for index < Aip2 {

//fmt.Println(num2ip(index))

// 入队, 压栈

ip_data := num2ip(index)

//fmt.Println(ip_data)

l.PushBack(ip_data)

index++

}

}

func text_add(name string, data string) { //向文件中写入数据  text_add(“file2.txt”, “qqqqqqqqqqqqqqqqqqqqqqq”)

f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0x644)

if err != nil {

panic(err)

}

defer f.Close()

_, err = f.WriteString(data)

_, err = f.WriteString(“rn”)

if err != nil {

panic(err)

}

}

//text_add(“file2.txt”, “qqqqqqqqqqqqqqqqqqqqqqq”)

var l = list.New()

func socket_ip(host string, port string) bool {

var (

remote = host + “:” + port

)

tcpAddr, _ := net.ResolveTCPAddr(“tcp4”, remote) //转换IP格式

//fmt.Printf(“%s”, tcpAddr)

conn, err := net.DialTCP(“tcp”, nil, tcpAddr) //查看是否连接成功

if err != nil {

fmt.Printf(“no==%s:%srn”, host, port)

return false

}

defer conn.Close()

fmt.Printf(“ok==%s:%srn”, host, port)

return true

}

func for_ip(port string) {

now := time.Now()

year, mon, day := now.UTC().Date()

file_name := fmt.Sprintf(“%d-%d-%d_%s”, year, mon, day, port)

for { //死循环

if l.Len() <= 0 {

fmt.Println(“跳出循环”)

break //#跳出

}

// 出队 从前读取

i1 := l.Front()

l.Remove(i1)

IP, _ := i1.Value.(string)

if socket_ip(IP, port) {

//OK

//获取当前 日期作为文件名 在把IP写入进去

text_add(file_name+“_ok.txt”, IP)

} //else {

// text_add(file_name+“_no.txt”, IP)

// }

time.Sleep(time.Millisecond * 500) //纳秒为单位

}

}

func main() {

argsLen := len(os.Args)

//fmt.Println(argsLen)

if argsLen != 4 {

fmt.Println(“main.go 58.215.20.30 58.215.201.30 80”)

} else {

gen_ip(ip2num(os.Args[1]), ip2num(os.Args[2]))

for index := 0; index < 200; index++ {

go for_ip(os.Args[3])

}

for {

time.Sleep(1 * time.Second) //纳秒为单位

}

}

}

篇12:Go语言实现选择法排序实例

作者:不吃皮蛋 字体:[增加 减小] 类型:

代码如下:

package main

import “fmt”

func select_sort(a []int) {

len := len(a)

for i:=0; i < len-1; i++ {

k := i

j:= i + 1

for ; j < len; j++ {

if a[j] < a[k] { k = j }

}

if k != i {

a[i], a[k] = a[k], a[i]

}

}

}

func print_array(a []int) {

for i := 0; i < len(a) - 1; i++ {

fmt.Printf(“%d, ”, a[i])

}

fmt.Print(a[len(a)-1])

}

func main() {

a := []int{1, 8, 5, 9, 4, 3, 6, 6}

print_array(a)

fmt.Printf(“n”)

select_sort(a)

print_array(a)

}

输入:

1, 8, 5, 9, 4, 3, 6, 6

输出:

1, 3, 4, 5, 6, 6, 8, 9

希望本文所述对大家的Go语言程序设计有所帮助,

篇13:go语言实现顺序存储的栈

作者:OSC首席键客 字体:[增加 减小] 类型:转载

这篇文章主要介绍了go语言实现顺序存储的栈,实例分析了Go语言实现顺序存储的栈的原理与各种常见的操作技巧,需要的朋友可以参考下

本文实例讲述了go语言实现顺序存储的栈,分享给大家供大家参考。具体如下:

1. sequence.go代码如下:

代码如下:

////////

// 顺序存储的栈

////////

package sequence

const MAXSIZE = 20

type Stack struct {

Data [MAXSIZE]int //存储栈元素

Top int         //指向栈顶,总是指向顶部元素,空时为-1

}

//压栈

//d:栈元素

func (s *Stack) Push(d int) bool {

if s.Top+1 > MAXSIZE {

return false

}

s.Data[s.Top+1] = d

s.Top++

return true

}

//弹栈

func (s *Stack) Pop int {

if s.Top == -1 {

return 0

}

s.Data[s.Top] = 0

d := s.Data[s.Top]

s.Top--

return d

}

//取栈的容量

func (s *Stack) GetVol() int {

return len(s.Data)

}

//取栈的长度

func (s *Stack) GetLength() int {

c := s.Top + 1

return c

}

2. main.go代码如下:

代码如下:

package main

import (

“fmt”

“stack/sequence”

)

func main() {

//初始化一个栈

var s sequence.Stack

s.Top = -1

//压入10个元素

for i := 1; i <= 10; i++ {

s.Push(i)

}

fmt.Println(s)

fmt.Println(s.GetVol())   //容量

fmt.Println(s.GetLength()) //长度

//弹出一个元素

s.Pop()

s.Pop()

fmt.Println(s)

fmt.Println(s.GetVol())   //容量

fmt.Println(s.GetLength()) //长度

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇14:GO语言实现简单的目录复制功能

创建一个独立的 goroutine 遍历文件,主进程负责写入数据。程序会复制空目录,也可以设置只复制以 “.xx” 结尾的文件。

严格来说这不是复制文件,而是写入新文件。因为这个程序是创建新文件,然后写入复制数据的。我们一般的 copy 命令是不会修改文件的 ctime(change time) 状态的。

代码如下:

代码如下:

// 一个简单的目录复制程序:一个独立的 goroutine 遍历目录,主进程负责将数据写入新目录。

// -11-02 Bing.L

package main

import (

“io”

“log”

“os”

“path/filepath”

“strings”

)

type FileInfo struct {

RelPath string

Size   int64

IsDir  bool

Handle *os.File

}

//复制文件数据

func ioCopy(srcHandle *os.File, dstPth string) (err error) {

dstHandle, err := os.OpenFile(dstPth, os.O_CREATE|os.O_WRONLY, os.ModePerm)

if err != nil {

return err

}

defer srcHandle.Close()

defer dstHandle.Close()

_, err = io.Copy(dstHandle, srcHandle)

return err

}

//遍历目录,将文件信息传入通道

func WalkFiles(srcDir, suffix string, c chan<- *FileInfo) {

suffix = strings.ToUpper(suffix)

filepath.Walk(srcDir, func(f string, fi os.FileInfo, err error) error { //遍历目录

if err != nil {

log.Println(“[E]”, err)

}

fileInfo := &FileInfo{}

if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) { //匹配文件

if fh, err := os.OpenFile(f, os.O_RDONLY, os.ModePerm); err != nil {

log.Println(“[E]”, err)

} else {

fileInfo.Handle = fh

fileInfo.RelPath, _ = filepath.Rel(srcDir, f) //相对路径

fileInfo.Size = fi.Size()

fileInfo.IsDir = fi.IsDir()

}

c <- fileInfo

}

})

close(c) //遍历完成,关闭通道

}

//写目标文件

func WriteFiles(dstDir string, c <-chan *FileInfo) {

if err := os.Chdir(dstDir); err != nil { //切换工作路径

log.Fatalln(“[F]”, err)

}

for f := range c {

if fi, err := os.Stat(f.RelPath); os.IsNotExist(err) { //目标不存在

if f.IsDir {

if err := os.MkdirAll(f.RelPath, os.ModeDir); err != nil {

log.Println(“[E]”, err)

}

} else {

if err := ioCopy(f.Handle, f.RelPath); err != nil {

log.Println(“[E]”, err)

} else {

log.Println(“[I] CP:”, f.RelPath)

}

}

} else if !f.IsDir { //目标存在,而且源不是一个目录

if fi.IsDir() != f.IsDir { //检查文件名被目录名占用冲突

log.Println(“[E]”, “filename conflict:”, f.RelPath)

} else if fi.Size() != f.Size { //源和目标的大小不一致时才重写

if err := ioCopy(f.Handle, f.RelPath); err != nil {

log.Println(“[E]”, err)

} else {

log.Println(“[I] CP:”, f.RelPath)

}

}

}

}

}

func main() {

files_ch := make(chan *FileInfo, 100)

go WalkFiles(“E:study”, “.doc”, files_ch) //在一个独立的 goroutine 中遍历文件

WriteFiles(“E:study.bak”, files_ch)

}

希望本文所述对大家的GO语言程序设计有所帮助,

篇15:Go语言使用组合的方式实现多继承的方法

作者:books1958 字体:[增加 减小] 类型:转载

这篇文章主要介绍了Go语言使用组合的方式实现多继承的方法,实例分析了多继承的原理与使用组合方式来实现多继承的技巧,需要的朋友可以参考下

本文实例讲述了Go语言使用组合的方式实现多继承的方法,分享给大家供大家参考。具体实现方法如下:

在大多数面向对象的编程语言中多继承都是不支持的。因为在基于class的体系中,多继承极大地增加了编译器的复杂性。

Go语言使用组合的方式实现继承,因此也可以很简单的实现多继承。

代码如下:

//使用组合的方式实现多继承

type Phone struct{}

func (p *Phone) Call() string {

return “Ring Ring”

}

type Camera struct{}

func (c *Camera) TakeAPicture() string {

return “Click”

}

//多继承

type CameraPhone struct {

Camera

Phone

}

func structTest0803() {

cp := new(CameraPhone)

fmt.Println(“Our new CameraPhone exhibits multiple behaviors ...”)

fmt.Println(“It exhibits behavior. of a Camera: ”, cp.TakeAPicture())

fmt.Println(“It works like a Phone too: ”, cp.Call())

/*Output:

Our new CameraPhone exhibits multiple behaviors ...

It exhibits behavior. of a Camera: Click

It works like a Phone too: Ring Ring

*/

}

希望本文所述对大家的Go语言程序设计有所帮助,

一份比较全的PHP笔试题

Java初级开发工程师的职责

php开发主管的职责说明

Windows中创建.htaccess文件方法介绍Windows服务器操作系统

nosql数据库 tiger

确保PHP应用程序的安全[2]WEB安全

PHP中级开发工程师的具体职责范围

高级运维工程师的职责

Discuz论坛宣传与优化技巧概述

关于精选php面试题及答案

go语言实现的memcache协议服务的方法
《go语言实现的memcache协议服务的方法.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【go语言实现的memcache协议服务的方法(推荐15篇)】相关文章:

PHP高级开发工程师的基本职责说明2022-05-06

服务器运维工程师年终个人总结及小结2023-02-08

平台架构师的职责表述2023-06-20

NET架构师岗位的工作职责2022-10-30

PHP中级开发工程师岗位的基本职责说明2022-05-08

FC3 下安装 VMware GSX Server 心得Unix系统2023-02-23

java软件工程师自我评价2022-09-18

Java架构师的岗位职责2023-11-12

PHP高级开发工程师的工作职责范本2022-10-17

Java架构师岗位的具体职责2024-01-26

点击下载本文文档