呱呱美文网  - 为您分享正能量早安心语语录的句子

Go语言实现简单留言板的方法(精选12篇)

admin

点击全文阅读

【简介】今天小编就给大家整理了Go语言实现简单留言板的方法(共12篇),希望对大家的工作和学习有所帮助,欢迎阅读!在此,感谢网友“汶敬胜”投稿本文!

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

篇1: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语言程序设计有所帮助,

篇2: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语言程序设计有所帮助,

篇3: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 %d\r\n%s\r\nEND\r\n”, 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(“DELETED\r\n”))

}

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 := <>

input.response <->

}

}

//分发请求到响应的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 %s\r\n”, key, value)

}

stats += “END\r\n”

res.Value = []byte(stats)

}

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

篇4: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语言程序设计有所帮助,

篇5: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语言程序设计有所帮助,

篇6: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(“%d\n”, i1.Value)

// 出栈

i4 := l.Back()

l.Remove(i4)

fmt.Printf(“%d\n”, i1.Value)

}

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

篇7: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语言程序设计有所帮助。

篇8: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语言程序设计有所帮助。

篇9: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语言程序设计有所帮助,

篇10: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语言程序设计有所帮助,

篇11:Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法

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

这篇文章主要介绍了Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法,以实例形式详细分析了几种常见的排序技巧与实现方法,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法,分享给大家供大家参考。具体分析如下:

算法是程序的灵魂,而排序算法则是一种最基本的算法。排序算法有许多种,这里介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例。

一、冒泡排序

冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数。经过第一次遍历之后,最大的数就在最右侧了;第二次遍历之后,第二大的数就在右数第二个位置了;以此类推。

代码如下:

//冒泡排序(排序10000个随机整数,用时约145ms)

func bubbleSort(nums []int) {

for i := 0; i < len(nums);="" i++="">

for j := 1; j < len(nums)-i;="" j++="">

if nums[j] < nums[j-1]="">

//交换

nums[j], nums[j-1] = nums[j-1], nums[j]

}

}

}

}

二、选择排序

选择排序的原理是,对给定的数组进行多次遍历,每次均找出最大的一个值的索引。

代码如下:

//选择排序(排序10000个随机整数,用时约45ms)

func selectSort(nums []int) {

length := len(nums)

for i := 0; i < length;="" i++="">

maxIndex := 0

//寻找最大的一个数,保存索引值

for j := 1; j < length-i;="" j++="">

if nums[j] >nums[maxIndex] {

maxIndex = j

}

}

nums[length-i-1], nums[maxIndex] = nums[maxIndex], nums[length-i-1]

}

}

三、快速排序

快速排序的原理是,首先找到一个数pivot把数组‘平均‘分成两组,使其中一组的所有数字均大于另一组中的数字,此时pivot在数组中的位置就是它正确的位置。然后,对这两组数组再次进行这种操作。

代码如下:

//快速排序(排序10000个随机整数,用时约0.9ms)

func quickSort(nums []int) {

recursionSort(nums, 0, len(nums)-1)

}

func recursionSort(nums []int, left int, right int) {

if left < right="">

pivot := partition(nums, left, right)

recursionSort(nums, left, pivot-1)

recursionSort(nums, pivot+1, right)

}

}

func partition(nums []int, left int, right int) int {

for left < right="">

for left < right="" &&="" nums[left]=""><= nums[right]="">

right--

}

if left < right="">

nums[left], nums[right] = nums[right], nums[left]

left++

}

for left < right="" &&="" nums[left]=""><= nums[right]="">

left++

}

if left < right="">

nums[left], nums[right] = nums[right], nums[left]

right--

}

}

return left

}

四、插入排序

插入排序的原理是,从第二个数开始向右侧遍历,每次均把该位置的元素移动至左侧,放在放在一个正确的位置(比左侧大,比右侧小),

代码如下:

//插入排序(排序10000个整数,用时约30ms)

func insertSort(nums []int) {

for i := 1; i < len(nums);="" i++="">

if nums[i] < nums[i-1]="">

j := i - 1

temp := nums[i]

for j >= 0 && nums[j] >temp {

nums[j+1] = nums[j]

j--

}

nums[j+1] = temp

}

}

}

通过多次测试可以发现,快速排序是效率最高的。

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

篇12:Go 语言实现的 fastcgi 应用库 gofastcgi

go-fastcgi 是为 Go 语言实现的 fastcgi 应用库,简单易学,

示例代码:

package mainimport ( “fmt” “fastcgi” “os”)type Application struct {}func (a *Application) Handle(r *fastcgi.Request) bool { fmt.Fprintf(r.Stdout, “Content-type: text/html\r\n\r\n”) fmt.Fprintf(r.Stdout, “hello world!\n”) fmt.Fprintf(r.Stdout, “stdin: (”) for { s, e := r.Stdin.ReadString('\n') if e != nil {break } fmt.Fprintf(r.Stdout, “%s”, s) } return true}func main() { a := new(Application) err := fastcgi.RunStandalone(“:12345”, a) if err != nil { fmt.Fprintf(os.Stderr, “err in main: %s”, err.String()) os.Exit(1) }}

项目主页:www.open-open.com/lib/view/home/1333976184467

★ Go语言压缩和解压缩tar.gz文件的方法

★ 经典留言板

★ Go语言中转换JSON数据简单例子

★ Go语言常见哈希函数的使用

★ Go for it说课稿

★ 共享上网实现方法概述

★ 留言板留言

★ 留言板签名档

★ qq留言板

★ 好友留言板

点击全文阅读