[读书] Golang Web 编程

1.golang的安装工具

1.1 GVM 第三方开发的Go多版本管理工具

2.golang环境变量

2.1 GOROOT=D:\go (golang 安装目录)

2.2 GOBIN=D:\go\bin (golang 生成的BIN目录)

2.3 GOPAT=D:\code\golang (golang 工作区,允许多个目录,;隔开)

执行goget命令时,会将包放在第一个配置的gopath目录中

GOPATH约定三个子目录:src(源码) 、bin(编译生成的文件, .a)、pkg(编译后的可执行文件)

3. go命令

3.1 go build 编译生成可执行文件在当前目录。

3.2 go install 安装生成可执行文件在bin目录下。

3.3 go get 下载远程包 , -u参数会自动更新包,同时会下载所有依赖包

例如:go get github.com/astaxie/beedb

3.4 go fmt 格式化代码

3.5 go test 自动读取目录下名为 *_test.go的文件,生成并并运行测试用的可执行文件

4. go语法基础

4.1 定义变量

4.1.1 var name type | 定义一个变量

4.1.2 var name1,name2 type | 定义多个变量

4.1.3 var name1 type = value | 定义变量并初始化值

4.1.4 var n1,n2,n3 type = v1, v2, v3 | 同时初始化多个变量

4.1.5 var n1,n2,n3 = v1, v2, v3  | 简短声明初版, 适合全局变量

4.1.6 n1,n2,n3 := v1,v2,v3 | 简短声明终版, 只适合于函数内部,外部无法编译通过

4.1.7 _,b:=34,35 | 下划线是特殊变量名,任何赋予它的值都会被丢弃

4.2 常量

4.2.1 const name = value | 定义一个常量

4.2.2 const Pi float32 = 3.1415926 | 定义常量并指定类型。

4.3 内置基础类型

4.3.1 bool 类型,值为true或false

4.3.2 int 和 unit 类型,也有些指定类型:rune、int8、int16、int64和 byte、unit8、uint16、uint32,uint64,其中rune是int32的别称,byte是unit8的别称。这些类型的变量之间不允许相互赋值,编译时会报错。

4.3.3 string 字符串类型,用一对 “”或 ‘’来定义

例如 s1, s2, s3 := "a", "b", "c"

字符串的值无法直接修改,比如“hello”,想修改“h”为“c”,有两种方式:1、先转成byte数组改完后转回string   2、利用切片 s2 := "d" + s1[1:]

4.3.4 error 类型,专门用来处理错误

4.3.4 iota 枚举,默认是从0开始

const (
    deleted = iota
    checked
    invalid = 3
)

4.3.4 go程序设计规则

大写字母开头的变量是可导出的,是公用变量

小写字母开头的变量是不可导出的,是私有变量

大写字母开头的函数,是公用函数

小写字母开头的函数,是私有函数

4.3.5 array

var arr [n]type | 定义一个数组

arr:=[3]int{1,2,3} | 简短声明

arr:=[10]int{1,2,3} | 简短声明,其他默认为0

arr:=[…]int{4,5,6} | 自动根据元素个数来计算长度

doubleArr:=[2][4]int{[4]int{1,2,3,4},[4]int{5,6,7,8}} | 声明二维数组

doubleArr:=[2][4]int{{1,2,3,4},{5,6,7,8}} | 如果内部的元素与外部的一样,简化写法

数组是不可变长度的

数组之间的赋值是值的赋值,即把一个数组作为参数传入函数逇时候,传入的其实是该数组的副本,而不是它的指针。

4.3.6 slice “动态数组”: 并不是真正意义上的动态数组,而是引用类型

var fslice []int | 定义一个slice

slice:=[]byte{‘a‘,‘b‘,‘c‘} | 定义并初始化

b = ar[5:10] | 取5-10片段的数据

4.3.7 map 字典

var numbers map[string]int |定义一个字典

numbers := make(map[string]int) |

rating := map[string]float32{"c": 5, "go": 4.5, "Python": 4.5, "C++": 2} | 初始化

delete(map,key) | 删除KEY

map是无序的,每次打印出来的map都会不一样

map的长度是不固定的,和slice一样,是一种引用类型

4.3.8 make 用于内建类型(map、slice、channel)的内存分配

new: 初始化对象,返回该对象的首指针。可用于初始化任何类型

make: 返回一个初始化的实例,而不是指针。

4.4 if else

在条件判断语句里允许声明一个变量,这个变量的作用于只能在该条件逻辑块内,其它地方就不起作用了。

if x := 1; x > 0 {
    fmt.Print("x is true")
}

4.5 goto

用于跳转到当前函数内定义的标签

func main() {
    i := 0
Here:
    println(i)
    i++
    if i < 10 {
        goto Here
    }
    fmt.Println("Finish")
}

4.6 for

for exp1;exp2;exp3{

}

exp1 和 exp3 是变量声明或者函数调用返回值之类的。exp2是用来条件判断。

func main() {
    sum := 0
    for index := 0; index < 10; index++ {
        sum += index
    }
    fmt.Println("sum is equal to ", sum)
}

func main() {
    mp := make(map[string]int, 10)
    mp["a"] = 1
    mp["b"] = 2
    for k, v := range mp {
        fmt.Println("map‘s key: ", k)
        fmt.Println("map‘s value: ", v)
    }
}

4.7 switch

fallthrough 可以强制执行下一个case

5. 函数

5.1 定义函数

func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
//这里是处理逻辑代码
//返回多个值
return value1, value2
}

5.2 定义变参函数

func myfunc(arg …int){}

5.3 传值与传指针

传指针使用多个函数能操作同一个对象

传指针比较轻量级(8bytes),只是传内存地址,当传递大的结构体的时候,可以节省(内存和时间)

5.4 defer

延迟语句,会在函数最后面执行

记住:defer是先进后出,当一个函数定义多个defer,最后一个先执行。

5.5 函数作为值、类型

type typeName func(input1 inputType1 [, input2 inputType2 [, ...]) (result1 resultType1
[, ...])

5.6 panic 与 recover

func main() {
    fmt.Println("Hello")   
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    panic("i am error")
}

5.6 main 和 init 函数

6. import

包导入功能,支持两种方式加载

6.1 相对路径导入

import “./model” | 当前文件同一目录的model目录,不建议使用

6.2 绝对路径导入

import “shorturl/mode”

6.3 .操作符

import ( .”fmt”) | 调用方法时,可以忽略包名,例如 : Println(”hello“)

6.4 别名操作

import ( f “fmt”) | 使用时: f.Println(“hello”)

6.5 _操作

import (_ “github.com/ziutek/xxx”)

_操作其实是引入该包,而不直接使用包里的函数,而是调用init函数

7. struct 结构体

7.1 定义结构体

type Person struct {
    name string
    age  int
}

7.2 初始化

var person Person | 声明

person := Person{name: "jxp", age: 12} | 声明并赋值

7.3 结构体方法

func (c *Person) say(what string) {
    fmt.Println(what)
}

7.4 结构体内聚

type Human struct {
    name string
    age  int
}

// Person ...
type Person struct {
    Human
    sex    string
    hobbit string
}

func (c Person) say(what string) {
    fmt.Println(what)
}

func main() {
    p := Person{Human:Human{name: "jxp", age: 12}, sex: "man", hobbit: "aa"}
    fmt.Println(p)
}

时间: 2024-07-29 03:17:52

[读书] Golang Web 编程的相关文章

Golang Web编程的Get和Post请求发送与解析

本文的是一篇入门文章,通过一个简单的例子介绍Golang的Web编程主要用到的技术. 文章结构包括: Client-Get 请求 Client-Post 请求 Server 处理 Get 和 Post 数据 在数据的封装中,我们部分采用了json,因而本文也涉及到Golang中json的编码和解码. 一.Client-Get package main import ( "fmt" "net/url" "net/http" "io/iou

golang之web编程入门

golang之web编程入门示例,聊聊数行,简单理解. package main import ( "fmt" "html/template" "log" "net/http" "strings" ) func sayhelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(r

golang之web编程执行流程

为什么golang做web编程比其他语言并发高: Go是通过一个函数ListenAndServe来处理这些事情的,这个底层其实这样处 理的:初始化一个server对象,然后调用了net.Listen("tcp", addr),也就是底层用TCP协议搭建了一个服 务,然后监控我们设置的端口.下面代码来自Go的http包的源码,通过下面的代码我们可以看到整个的http处理过程: func (srv *Server) Serve(l net.Listener) error { defer l

Go Web 编程之 请求

概述 前面我们学习了处理器和处理器函数,如何编写和注册处理器.本文我们将学习如何从请求中获取信息. 请求的结构 通过前面的学习,我们知道处理器函数需要符合下面的签名: func (w http.ResponseWriter, r *http.Request) 其中,http.Request就是请求的类型.客户端传递的数据都可以通过这个结构来获取.结构Request定义在包 net/http 中: // src/net/http/request.go type Request struct { M

物联网网络编程、Web编程综述

本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真空领域. 的确,物联网研发应该以团队协作分工的方式进行,所以有嵌入式设备端.网关.web前端.APP.后端开发等专属岗位.作为系统架构师,自然需要掌握各种岗位的关键技术.作为嵌入式工程师,掌握网络编程.web编程,能够极大地拓展自己的视野和架构思维,能够主动地对系统的各种协议和应用场景提出优化的见解

[转]所有编程皆为 Web 编程

Web编程还远远没有达到完美的境地.其实,还有点乱!没错,随便会写点代码的人就能三下两下地搞出一个糟糕的Web应用:也确实,99%的Web 应用都似狗屎一堆.但是,这也意味着,相当"聪明"的程序员们正在将他们的成果展现在成百上千(或者成千上万,甚至几百万)的用户面前,而这在互联网盛行 之前是绝无可能的 把软件按照Web应用的形式重整一下,即使软件本身并 不怎么样,这也使得程序员们能够把他们的软件展现在某个地方的某人面前. 如果你希望尽可能多的用户来使用你的软件,绝没有比把它做成Web应

net core与golang web

Asp.net core与golang web简单对比测试 最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7.0(虚拟机单核2G内存) asp.net core rc2 golang v1.7beta1 下面是各自的代码: go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

不要忽视Web编程中的小细节

概述:长时间以来,我们创造了某些在构造和范围内用以提升网站易用性的约定和实践.然后在我们进行web编程的时候总有一些疏忽和纰漏.这里总结了一些web编程时容易出现的小错误,并给出了相应的补救方法,希望可以帮助提高网站的可用性.只要避免下列这些错误,网站的用户体验度就会大大提升. 错误一: 表单标签没有与相应字段相关联 利用 "for" 属性,使客户可以通过点击标签在表格内选择正确的输入字段.这对于复选框和单选字段来说就是要有更大的可点击区域. 错误二: Logo图表没有链接到主页 给l

Table被web编程弃用的原因

Table要比其它html标记占更多的字节.(延迟下载时间,占用服务器更多的流量资源.)Tablle会阻挡浏览器渲染引擎的渲染顺序.(会延迟页面的生成速度,让用户等待更久的时间.)Table里显示图片时需要你把单个.有逻辑性的图片切成多个图.(增加设计的复杂度,增加页面加载时间,增加HTTP会话数.)在某些浏览器中Table里的文字的拷贝会出现问题.(这会让用户不悦.)Table会影响其内部的某些布局属性的生效(比如<td>里的元素的height:100%)(这会限制你页面设计的自由性.)一旦