1. golang web开发页面传值怎么传
如果你是指两个页面之间的传值,那么可以这么做:
简单的话,可以通过URL传值,比如 http://example.com?name=gem
可以通过读取url的参数name获得gem。
也可以通过session,cookie等方法,这两种方法就有一些限制,比如换个浏览器,session和cookie就不一样了,那么你传的值就不存在了。
所以第一种会比较通用。
如果是传值给模板(一般是模板引擎之类的,比如html/template),这些教程很多,搜一下比较快速解决
2. golang go get报错了 我git已经装了的 错误信息在下面
你的git安装在哪里的?把它的bin目录添加到PATH目录里就好了。比如
setPATH=%PATH%;D:ProgramFiles(x86)Gitin
3. Golang 官方网站被封闭了怎么办
不可以吗?现在应该可以访问的吧,如果不可以,你可以去看go语言中文网,这个里面可以看到官方文档,也可以下载
4. 使用golang搭建的网站怎么访问
server这边调用ListenAndServe方法监听端口,针对不同路径定义好相应的处理函数。
客户端直接访问http://hostname:<port>/<path>就可以访问了。
5. 如何设置golang 系统gopath
计算机-属性-高级系统设置,在高级选项卡选择环境变量,然后在下边的path中加上”;C:\MinGW\bin “,注意是引号里面的,包括分号。C:\MinGW\bin 是要添加的路径。
6. 如何使用golang实现可透传原请求的header的反向代理
优雅的Golang Web开发框架:Martini
Martini 是一个非常新的 Go 语言的 Web 框架,使用 Go 的 net/http 借口开发,类似 Sinatra 或者 Flask 之类的框架,你可使用自己的 DB 层、会话管理和模板。
特性:
使用非常简单
无侵入设计
可与其他 Go 的包配合工作
超棒的路径匹配和路由
模块化设计,可轻松添加工具
大量很好的处理器和中间件
很棒的开箱即用特性
完全兼容 http.HandlerFunc 接口.
示例代码:
01 package main
02
03 import "github.com/codegangsta/martini"
04
05 func main() {
06 m := martini.Classic()
07 m.Get("/", func() string {
08 return "Hello world!"
09 })
10 m.Run()
11 }
请求处理器:
查看源码打印?
1 m.Get("/", func() {
2 println("hello world")
3 })
4
5 m.Get("/", func(res http.ResponseWriter, req *http.Request) { // res and req are injected by Martini
6 res.WriteHeader(200) // HTTP 200
7 })
7. 学习golang,以后做web网站用哪个go版本好
版本看需要,可以用最新版本,也可以用老版本,还要看你用的web框架支持什么版本的,如果用原生的话,就随意了
8. golang如何创建目录
golang中关于目录与文件名等操作都在os这个包中,具体的创建目录都是通过Mkdir和MkdirAll这2个函数来实现的,这两个函数用法一致
os.Mkdir(dirNamestring,permFileMode)
dirName即要创建的目录(文件夹路径),可以是绝对路径,也可以是相对路径(相对于GOPATH)
perm表示创建的目录的权限,如0777(读r权限值为4,写权限w值为2,执行权限x值为1)
如:我要在/data/program/goapp这个目录下创建一个golang这个子目录,示例如下:
packagemain
import(
"os"
"fmt"
)
funcmain(){
err:=os.Mkdir("/data/program/goapp/golang",0666)
iferr!=nil{
fmt.Println(err)
}
}
注:Mkdir和MkdirAll的区别
Mkdir创建目录,它的父级目录必须是存在的,不然创建会失败
MkdirAll可以递归创建目录,即只要根目录存在即可,如下:
err:=os.MkdirAll("/data/program/goapp/golang/test/hello",0766)
iferr!=nil{
fmt.Println(err)
}
本例中:/data/program/goapp是已经存在的目录,而子目录golang/test/hello是不存在,此时要使用MkdirAll来创建
9. golang排序问题求助
如果是只有这几个的话 我们可以考虑自定义一个排序类型
func TestSort(t *testing.T) {
data := []string{"三级", "一级", "二级"}
rule := map[string]int{
"一级": 1,
"二级": 2,
"三级": 3,
}
self := &SelfSort{
Rule: rule,
Data: data,
}
sort.Sort(self)
fmt.Println(self.Data)
}
type SelfSort struct {
Rule map[string]int
Data []string
}
func (p SelfSort) Len() int { return len(p.Data) }
func (p SelfSort) Less(i, j int) bool { return p.Rule[p.Data[i]] < p.Rule[p.Data[j]] }
func (p SelfSort) Swap(i, j int) { p.Data[i], p.Data[j] = p.Data[j], p.Data[i] }
如过很多 就是真的要比较中文的话, 就用这种
package mainimport ( "bytes"
"fmt"
"io/ioutil"
"sort"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform")//ByPinyin is customized sort interface to sort string by Chinese PinYintype ByPinyin []stringfunc (s ByPinyin) Len() int { return len(s) }func (s ByPinyin) Swap(i, j int) { s[i], s[j] = s[j], s[i] }func (s ByPinyin) Less(i, j int) bool {
a, _ := UTF82GBK(s[i])
b, _ := UTF82GBK(s[j])
bLen := len(b) for idx, chr := range a { if idx > bLen-1 { return false
} if chr != b[idx] { return chr < b[idx]
}
} return true}//UTF82GBK : transform UTF8 rune into GBK byte arrayfunc UTF82GBK(src string) ([]byte, error) {
GB18030 := simplifiedchinese.All[0] return ioutil.ReadAll(transform.NewReader(bytes.NewReader([]byte(src)), GB18030.NewEncoder()))
}//GBK2UTF8 : transform GBK byte array into UTF8 stringfunc GBK2UTF8(src []byte) (string, error) {
GB18030 := simplifiedchinese.All[0]
bytes, err := ioutil.ReadAll(transform.NewReader(bytes.NewReader(src), GB18030.NewDecoder())) return string(bytes), err
}func main() {
b := []string{"哈", "呼", "嚯", "ha", ","}
sort.Strings(b) //output: [, ha 呼 哈 嚯]
fmt.Println("Default sort: ", b)
sort.Sort(ByPinyin(b)) //output: [, ha 哈 呼 嚯]
fmt.Println("By Pinyin sort: ", b)
}
from网页链接
10. golang怎么返回结构体
用golang解析二进制协议时,其实没必要管结构体的字段的对齐规则,何况语言规范也没有规定如何对齐,也就是没有规则。用encoding/binary.Read函数直接读入struct里就行,struct就像c那样写
type Data struct {
Size, MsgType uint16
Sequence uint32
// ...
}
golang编译器加不加padding,Read都能正常工作,runtime知道Data的布局的,不像C直接做cast所以要知道怎样对齐。
用unsafe.Alignof可以知道每个field的对齐长度,但没必要用到。
package main
/*
#include <stdint.h>
#pragma pack(push, 1)
typedef struct {
uint16_t size;
uint16_t msgtype;
uint32_t sequnce;
uint8_t data1;
uint32_t data2;
uint16_t data3;
} mydata;
#pragma pack(pop)
mydata foo = {
1, 2, 3, 4, 5, 6,
};
int size() {
return sizeof(mydata);
}
*/
import "C"
import (
"bytes"
"encoding/binary"
"fmt"
"log"
"unsafe"
)
func main() {
bs := C.GoBytes(unsafe.Pointer(&C.foo), C.size())
fmt.Printf("len %d data %v\n", len(bs), bs)
var data struct {
Size, Msytype uint16
Sequence uint32
Data1 uint8
Data2 uint32
Data3 uint16
}
err := binary.Read(bytes.NewReader(bs), binary.LittleEndian, &data)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%v\n", data) // {1 2 3 4 5 6}
buf := new(bytes.Buffer)
binary.Write(buf, binary.BigEndian, data)
fmt.Printf("%d %v\n", buf.Len(), buf.Bytes()) // 15 [0 1 0 2 0 0 0 3 4 0 0 0 5 0 6]
}