You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: en/01.1.md
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -76,15 +76,15 @@ A 64-bit operating system will show the following:
76
76
77
77
### Mac
78
78
79
-
Go to the [download page](https://golang.org/dl/), choose `go1.4.2.darwin-386.pkg` (The later version has no 32-bit download.)for 32-bit systems and `go1.8.darwin-amd64.pkg` for 64-bit systems. Going all the way to the end by clicking "next", `~/go/bin` will be added to your system's $PATH after you finish the installation. Now open the terminal and type `go`. You should see the same output shown in figure 1.1.
79
+
Go to the [download page](https://golang.org/dl/), choose `go1.4.2.darwin-386.pkg` (The later version has no 32-bit download.)for 32-bit systems and `go1.8.1.darwin-amd64.pkg` for 64-bit systems. Going all the way to the end by clicking "next", `~/go/bin` will be added to your system's $PATH after you finish the installation. Now open the terminal and type `go`. You should see the same output shown in figure 1.1.
80
80
81
81
### Linux
82
82
83
-
Go to the [download page](https://golang.org/dl/), choose `go1.8.linux-386.tar.gz` for 32-bit systems and `go1.8.linux-amd64.tar.gz` for 64-bit systems. Suppose you want to install Go in the `$GO_INSTALL_DIR` path. Uncompress the `tar.gz` to your chosen path using the command `tar zxvf go1.8.linux-amd64.tar.gz -C $GO_INSTALL_DIR`. Then set your $PATH with the following: `export PATH=$PATH:$GO_INSTALL_DIR/go/bin`. Now just open the terminal and type `go`. You should now see the same output displayed in figure 1.1.
83
+
Go to the [download page](https://golang.org/dl/), choose `go1.8.1.linux-386.tar.gz` for 32-bit systems and `go1.8.1.linux-amd64.tar.gz` for 64-bit systems. Suppose you want to install Go in the `$GO_INSTALL_DIR` path. Uncompress the `tar.gz` to your chosen path using the command `tar zxvf go1.8.1.linux-amd64.tar.gz -C $GO_INSTALL_DIR`. Then set your $PATH with the following: `export PATH=$PATH:$GO_INSTALL_DIR/go/bin`. Now just open the terminal and type `go`. You should now see the same output displayed in figure 1.1.
84
84
85
85
### Windows
86
86
87
-
Go to the [download page](https://golang.org/dl/), choose `go1.8.windows-386.msi` for 32-bit systems and `go1.8.windows-amd64.msi` for 64-bit systems. Going all the way to the end by clicking "next", `c:/go/bin` will be added to `path`. Now just open a command line window and type `go`. You should now see the same output displayed in figure 1.1.
87
+
Go to the [download page](https://golang.org/dl/), choose `go1.8.1.windows-386.msi` for 32-bit systems and `go1.8.1.windows-amd64.msi` for 64-bit systems. Going all the way to the end by clicking "next", `c:/go/bin` will be added to `path`. Now just open a command line window and type `go`. You should now see the same output displayed in figure 1.1.
88
88
89
89
## Use third-party tools
90
90
@@ -96,8 +96,8 @@ GVM is a Go multi-version control tool developed by a third-party, like rvm for
96
96
97
97
Then we install Go using the following commands:
98
98
99
-
gvm install go1.8
100
-
gvm use go1.8
99
+
gvm install go1.8.1
100
+
gvm use go1.8.1
101
101
102
102
After the process has finished, you're all set.
103
103
@@ -112,16 +112,16 @@ Ubuntu is the most popular desktop release version of Linux. It uses `apt-get` t
sudo tar -xzf go1.8.1.linux-amd64.tar.gz -C /usr/local
117
117
118
118
# Go environment
119
119
export GOROOT=/usr/local/go
120
120
export GOBIN=$GOROOT/bin
121
121
export PATH=$PATH:$GOBIN
122
122
export GOPATH=HOME/gopath
123
123
```
124
-
Starting from go 1.8,The GOPATH environment variable now has a default value if it is unset. It defaults to $HOME/go on Unix and %USERPROFILE%/go on Windows.
124
+
Starting from go 1.8,The GOPATH environment variable now has a default value if it is unset. It defaults to $HOME/go on Unix and %USERPROFILE%/go on Windows.
125
125
### Homebrew
126
126
127
127
Homebrew is a software management tool commonly used in Mac to manage packages. Just type the following commands to install Go.
Copy file name to clipboardExpand all lines: en/04.1.md
+55-54Lines changed: 55 additions & 54 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,71 +1,72 @@
1
1
# 4.1 Process form inputs
2
2
3
3
Before we begin, let's take a look at a simple example of a typical user form, saved as `login.gtpl` in your project folder.
4
-
5
-
<html>
4
+
```html
5
+
<html>
6
6
<head>
7
7
<title></title>
8
8
</head>
9
9
<body>
10
-
<form action="/login" method="post">
11
-
Username:<input type="text" name="username">
12
-
Password:<input type="password" name="password">
13
-
<input type="submit" value="Login">
14
-
</form>
10
+
<formaction="/login"method="post">
11
+
Username:<inputtype="text"name="username">
12
+
Password:<inputtype="password"name="password">
13
+
<inputtype="submit"value="Login">
14
+
</form>
15
15
</body>
16
-
</html>
17
-
16
+
</html>
17
+
```
18
18
This form will submit to `/login` on the server. After the user clicks the login button, the data will be sent to the `login` handler registered by the server router. Then we need to know whether it uses the POST method or GET.
19
19
20
20
This is easy to find out using the `http` package. Let's see how to handle the form data on the login page.
21
21
22
-
package main
23
-
24
-
import (
25
-
"fmt"
26
-
"html/template"
27
-
"log"
28
-
"net/http"
29
-
"strings"
30
-
)
31
-
32
-
func sayhelloName(w http.ResponseWriter, r *http.Request) {
33
-
r.ParseForm() //Parse url parameters passed, then parse the response packet for the POST body (request body)
34
-
// attention: If you do not call ParseForm method, the following data can not be obtained form
35
-
fmt.Println(r.Form) // print information on server side.
36
-
fmt.Println("path", r.URL.Path)
37
-
fmt.Println("scheme", r.URL.Scheme)
38
-
fmt.Println(r.Form["url_long"])
39
-
for k, v := range r.Form {
40
-
fmt.Println("key:", k)
41
-
fmt.Println("val:", strings.Join(v, ""))
42
-
}
43
-
fmt.Fprintf(w, "Hello astaxie!") // write data to response
22
+
```Go
23
+
package main
24
+
25
+
import (
26
+
"fmt"
27
+
"html/template"
28
+
"log"
29
+
"net/http"
30
+
"strings"
31
+
)
32
+
33
+
funcsayhelloName(whttp.ResponseWriter, r *http.Request) {
34
+
r.ParseForm() //Parse url parameters passed, then parse the response packet for the POST body (request body)
35
+
// attention: If you do not call ParseForm method, the following data can not be obtained form
36
+
fmt.Println(r.Form) // print information on server side.
37
+
fmt.Println("path", r.URL.Path)
38
+
fmt.Println("scheme", r.URL.Scheme)
39
+
fmt.Println(r.Form["url_long"])
40
+
fork, v:=range r.Form {
41
+
fmt.Println("key:", k)
42
+
fmt.Println("val:", strings.Join(v, ""))
44
43
}
45
-
46
-
func login(w http.ResponseWriter, r *http.Request) {
err:= http.ListenAndServe(":9090", nil) // setting listening port
64
+
iferr != nil {
65
+
log.Fatal("ListenAndServe: ", err)
66
66
}
67
+
}
67
68
68
-
69
+
```
69
70
Here we use `r.Method` to get the request method, and it returns an http verb -"GET", "POST", "PUT", etc.
70
71
71
72
In the `login` function, we use `r.Method` to check whether it's a login page or login processing logic. In other words, we check to see whether the user is simply opening the page, or trying to log in. Serve shows the page only when the request comes in via the GET method, and it executes the login logic when the request uses the POST method.
@@ -87,7 +88,7 @@ Try changing the value of the action in the form `http://127.0.0.1:9090/login` t
87
88
Figure 4.2 Server prints request data
88
89
89
90
The type of `request.Form` is `url.Value`. It saves data with the format `key=value`.
90
-
91
+
```Go
91
92
v:= url.Values{}
92
93
v.Set("name", "Ava")
93
94
v.Add("friend", "Jess")
@@ -97,7 +98,7 @@ The type of `request.Form` is `url.Value`. It saves data with the format `key=va
97
98
fmt.Println(v.Get("name"))
98
99
fmt.Println(v.Get("friend"))
99
100
fmt.Println(v["friend"])
100
-
101
+
```
101
102
**Tips** Requests have the ability to access form data using the `FormValue()` method. For example, you can change `r.Form["username"]` to `r.FormValue("username")`, and Go calls `r.ParseForm` automatically. Notice that it returns the first value if there are arguments with the same name, and it returns an empty string if there is no such argument.
Copy file name to clipboardExpand all lines: en/04.2.md
+39-39Lines changed: 39 additions & 39 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,17 +7,17 @@ There are two ways of verifying form data that are in common use. The first is J
7
7
## Required fields
8
8
9
9
Sometimes we require that users input some fields but they fail to complete the field. For example in the previous section when we required a username. You can use the `len` function to get the length of a field in order to ensure that users have entered something.
10
-
10
+
```Go
11
11
iflen(r.Form["username"][0])==0{
12
12
// code for empty field
13
13
}
14
-
14
+
```
15
15
`r.Form` treats different form element types differently when they are blank. For empty textboxes, text areas and file uploads, it returns an empty string; for radio buttons and check boxes, it doesn't even create the corresponding items. Instead, you will get errors if you try to access it. Therefore, it's safer to use `r.Form.Get()` to get field values since it will always return empty if the value does not exist. On the other hand, `r.Form.Get()` can only get one field value at a time, so you need to use `r.Form` to get the map of values.
16
16
17
17
## Numbers
18
18
19
19
Sometimes you require numbers rather than other text for the field value. For example, let's say that you require the age of a user in integer form only, i.e 50 or 10, instead of "old enough" or "young man". If we require a positive number, we can convert the value to the `int` type first, then process it.
20
-
20
+
```Go
21
21
getint,err:=strconv.Atoi(r.Form.Get("age"))
22
22
if err!=nil{
23
23
// error occurs when convert to number, it may not a number
@@ -27,55 +27,55 @@ Sometimes you require numbers rather than other text for the field value. For ex
27
27
if getint >100 {
28
28
// too big
29
29
}
30
-
30
+
```
31
31
Another way to do this is by using regular expressions.
For high performance purposes, regular expressions are not efficient, however simple regular expressions are usually fast enough. If you are familiar with regular expressions, it's a very convenient way to verify data. Notice that Go uses [RE2](http://code.google.com/p/re2/wiki/Syntax), so all UTF-8 characters are supported.
38
38
39
39
## Chinese
40
40
41
41
Sometimes we need users to input their Chinese names and we have to verify that they all use Chinese rather than random characters. For Chinese verification, regular expressions are the only way.
42
-
43
-
if m, _ := regexp.MatchString("^[\\x{4e00}-\\x{9fa5}]+$", r.Form.Get("realname")); !m {
Sometimes we need users to input only English letters. For example, we require someone's English name, like astaxie instead of asta谢. We can easily use regular expressions to perform our verification.
50
-
51
-
if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m {
Let's say we require an item from our drop down list, but instead we get a value fabricated by hackers. How do we prevent this from happening?
68
68
69
69
Suppose we have the following `<select>`:
70
-
70
+
```html
71
71
<selectname="fruit">
72
72
<optionvalue="apple">apple</option>
73
73
<optionvalue="pear">pear</option>
74
74
<optionvalue="banana">banana</option>
75
75
</select>
76
-
76
+
```
77
77
We can use the following strategy to sanitize our input:
78
-
78
+
```Go
79
79
slice:=[]string{"apple","pear","banana"}
80
80
81
81
for_, v:=range slice {
@@ -84,18 +84,18 @@ We can use the following strategy to sanitize our input:
84
84
}
85
85
}
86
86
returnfalse
87
-
87
+
```
88
88
All the functions I've shown above are in my open source project for operating on slices and maps: [https://github.com/astaxie/beeku](https://github.com/astaxie/beeku)
89
89
90
90
## Radio buttons
91
91
92
92
If we want to know whether the user is male or female, we may use a radio button, returning 1 for male and 2 for female. However, some little kid who just read his first book on HTTP, decides to send to you a 3. Will your program throw an exception? As you can see, we need to use the same method as we did for our drop down list to make sure that only expected values are returned by our radio button.
93
-
93
+
```html
94
94
<inputtype="radio"name="gender"value="1">Male
95
95
<inputtype="radio"name="gender"value="2">Female
96
-
96
+
```
97
97
And we use the following code to validate the input:
98
-
98
+
```Go
99
99
slice:=[]int{1,2}
100
100
101
101
for_, v:=range slice {
@@ -104,32 +104,32 @@ And we use the following code to validate the input:
104
104
}
105
105
}
106
106
returnfalse
107
-
107
+
```
108
108
## Check boxes
109
109
110
110
Suppose there are some check boxes for user interests, and that you don't want extraneous values here either. You can validate these ase follows:
In this case, the sanitization is a little bit different to validating the button and check box inputs since here we get a slice from the check boxes.
117
-
118
-
slice:=[]string{"football","basketball","tennis"}
119
-
a:=Slice_diff(r.Form["interest"],slice)
120
-
if a == nil{
121
-
return true
122
-
}
123
-
124
-
return false
125
-
117
+
```Go
118
+
slice:=[]string{"football","basketball","tennis"}
119
+
a:=Slice_diff(r.Form["interest"],slice)
120
+
if a == nil{
121
+
returntrue
122
+
}
123
+
124
+
returnfalse
125
+
```
126
126
## Date and time
127
127
128
128
Suppose you want users to input valid dates or times. Go has the `time` package for converting year, month and day to their corresponding times. After that, it's easy to check it.
After you have the time, you can use the `time` package for more operations, depending on your needs.
134
134
135
135
In this section, we've discussed some common methods of validating form data on the server side. I hope that you now understand more about data validation in Go, especially how to use regular expressions to your advantage.
0 commit comments