Go語言下載、安裝、配置、使用


Go語言

Go語言(Golang,The Go Programming Language),是谷歌2009發布的第二款開源編程語言。2009年7月份,谷歌曾發布了Simple語言,它是用來開發Android應用。

Go語言是谷歌推出的一種全新的編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性。

谷歌首席軟件工程師羅布派克(Rob Pike)說:我們之所以開發Go,是因為過去10多年間軟件開發的難度令人沮喪。

Go語言專門針對多處理器系統應用程序的編程進行了優化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持並行進程。

Go語言官網: https://golang.org (需要VPN訪問)

 

1. 下載 Go

Go語言是跨平台,支持Windows、Linux、Mac OS X等系統,還提供有源碼,可編譯安裝

Windows :go1.8.3.windows-amd64.msi (78MB)

Linux :go1.8.3.linux-amd64.tar.gz (86MB)

Mac :go1.8.3.darwin-amd64.tar.gz (85MB)   (推薦

Source: go1.8.3.src.tar.gz (15MB)

go-yu-yan-xia-zai-an-zhuang-pei-zhi-shi-yong-01

 

2. 安裝 Go

sudo tar -C /usr/local/ -zxvf go1.8.3.darwin-amd64.tar.gz      

注意: 必須安裝在 /usr/local/ 目錄下,因為GOROOT必須為/usr/local/go

安裝目錄說明:

$ ll /usr/local/go/
total 232
-rw-r--r--    1 homer  staff  33243 May 25 04:14 AUTHORS
-rw-r--r--    1 homer  staff   1366 May 25 04:14 CONTRIBUTING.md
-rw-r--r--    1 homer  staff  45710 May 25 04:14 CONTRIBUTORS
-rw-r--r--    1 homer  staff   1479 May 25 04:14 LICENSE
-rw-r--r--    1 homer  staff   1303 May 25 04:14 PATENTS
-rw-r--r--    1 homer  staff   1399 May 25 04:14 README.md
-rw-r--r--    1 homer  staff      7 May 25 04:14 VERSION
drwxr-xr-x   14 homer  staff    476 May 25 04:14 api
drwxr-xr-x    5 homer  staff    170 May 25 04:16 bin
drwxr-xr-x    4 homer  staff    136 May 25 04:16 blog
drwxr-xr-x   44 homer  staff   1496 May 25 04:14 doc
-rw-r--r--    1 homer  staff   5686 May 25 04:14 favicon.ico
drwxr-xr-x    3 homer  staff    102 May 25 04:14 lib
drwxr-xr-x   16 homer  staff    544 May 25 04:16 misc
drwxr-xr-x    7 homer  staff    238 May 25 04:16 pkg
-rw-r--r--    1 homer  staff     26 May 25 04:14 robots.txt
drwxr-xr-x   68 homer  staff   2312 May 25 04:14 src
drwxr-xr-x  269 homer  staff   9146 Jul 25 01:29 test

目錄文件解釋:

api   — 目錄,包含所有API列表,方便IDE使用
bin   — 目錄,存放編譯后的可執行文件
blog  — 目錄,
doc   — 目錄,幫助文檔
lib   — 目錄,
misc  — 目錄,
pkg   — 目錄,存放編譯后的包文件。pkg中的文件是Go編譯生成的
src   — 目錄,存放項目源文件
test  - 目錄,示例代碼

注:一般,bin和pkg目錄可以不創建,go命令會自動創建(如 go install),只需要創建src目錄即可。

AUTHORS         — 文件,作者列表,用記事本打開
CONTRIBUTING.md — 文件,
CONTRIBUTORS    — 文件,
LICENSE         — 文件,license,用記事本打開
PATENTS         — 文件,
README.md       — 文件,
VERSION         — 文件,版本信息,用記事本打開

favicon.ico     — 文件,
robots.txt      — 文件,使用robots.txt阻止對網址的訪問,
詳情查看https://support.google.com/webmasters/answer/6062608?hl=zh-Hans

 

Eclipse 安裝Go插件,在市場里搜索 "go",如下圖,安裝 GoClipse

go-yu-yan-xia-zai-an-zhuang-pei-zhi-shi-yong-02

注意: GoClipse插件開發的程序,需要重啟電腦后才會生效,因為 /etc/profile 配置的環境變量重啟電腦后才生效

 

3. 配置 Go

vim /etc/profile

添加配置:

GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

使配置生效:

source /etc/profile

驗證安裝成功:

$ go version       
go version go1.8.3 darwin/amd64

 

4. 使用 Go

基本語法

Go 語言中 = 和 := 有什么區別

= 是賦值, := 是聲明變量並賦值。

// = 使用必須使用先var聲明例如:
var a
a=100

// 或
var b = 100

// 或
var c int = 100

// := 是聲明並賦值,並且系統自動推斷類型,不需要var關鍵字
d := 100

 

1) hello 示例

vim hello.go

package main 

import "fmt"

func main() {
   fmt.Printf("hello mimvp.com")
}

編譯執行:

go build
./hello

運行結果:

$ ./hello 
hello mimvp.com

 

2)爬取網頁示例

vim spider_web.go

/**
* mimvp.com
* 2017.4.12
*
* spider web of mimvp.com
*/

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	response, _ := http.Get("http://mimvp.com")
	defer response.Body.Close()
	body, _ := ioutil.ReadAll(response.Body)
	fmt.Println(string(body))	
	fmt.Printf("len : %d\n", len(string(body)));
}

編譯執行:

$ go build spider_web.go 
$ ./spider_web   

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">

...

</body>
</html>

len : 15661

 

5. 代理示例

Go語言支持的代理為 http 和 socks5,不支持 https 和 socks4

其中,Go使用socks5代理時,需要安裝引用 "golang.org/x/net/proxy",安裝配置步驟如下:

1. download https://github.com/golang/net

2. unzip and move to /usr/local/go/src/golang.org/x/net/

3. import ( "golang.org/x/net/proxy" )

Go 語言代理示例如下(全部都經過測試,成功):

/**
* mimvp.com
* 2017.7.20
* golang use http, socks5 proxy
 */

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"os"

	"golang.org/x/net/proxy"
)

// success http
// proxy_uri := "http://125.77.25.124:80"
// mimvp_url := "http://mimvp.com"
func main_1(proxy_uri string, mimvp_url string) {
	proxy := func(_ *http.Request) (*url.URL, error) {
		return url.Parse(proxy_uri)
	}
	transport := &http.Transport{Proxy: proxy}
	client := &http.Client{Transport: transport}
	resp, err := client.Get(mimvp_url)
	if err != nil {
		fmt.Println("error : ", err)
		return
	} else {
		defer resp.Body.Close()
		body, _ := ioutil.ReadAll(resp.Body)
		fmt.Printf("%s\n", body)
	}
}

// success http
// proxy_uri := "http://125.77.25.124:80"
// mimvp_url := "http://mimvp.com"
func main_2(proxy_uri string, mimvp_url string) {
	url_i := url.URL{}
	url_proxy, _ := url_i.Parse(proxy_uri)
	transport := &http.Transport{Proxy: http.ProxyURL(url_proxy)}
	client := http.Client{Transport: transport}
	resp, err := client.Get(mimvp_url)
	if err != nil {
		log.Fatalln(err)
	} else {
		defer resp.Body.Close()
		body, _ := ioutil.ReadAll(resp.Body)
		fmt.Printf("%s\n", body)
	}
}

// config environment varable
func main_22(proxy_uri string, mimvp_url string) {
	// url_i := url.URL{}
	// url_proxy, _ := url_i.Parse("https://127.0.0.1:9743")
	os.Setenv("HTTP_PROXY", "http://125.77.25.124:80")
	os.Setenv("HTTPS_PROXY", "https://210.209.89.100:8081")
	c := http.Client{ /* Transport: &http.Transport{ // Proxy: http.ProxyURL(url_proxy)} */ }
	resp, err := c.Get("http://mimvp.com")
	if err != nil {
		log.Fatalln(err)
	} else {
		defer resp.Body.Close()
		body, _ := ioutil.ReadAll(resp.Body)
		fmt.Printf("%s\n", body)
	}
}

// 指定代理ip
func getTransportFieldURL(proxy_addr *string) (transport *http.Transport) {
	url_i := url.URL{}
	url_proxy, _ := url_i.Parse(*proxy_addr)
	transport = &http.Transport{Proxy: http.ProxyURL(url_proxy)}
	return
}

// 從環境變量$http_proxy或$HTTP_PROXY中獲取HTTP代理地址
// Linux 設置代理環境變量命令:
// http_proxy=http://125.77.25.124:80
// https_proxy=https://210.209.89.100:8081
func getTransportFromEnvironment() (transport *http.Transport) {
	transport = &http.Transport{Proxy: http.ProxyFromEnvironment}
	return
}

func fetch(mimvp_url, proxy_uri *string) (html string) {
	transport := getTransportFieldURL(proxy_uri)
	client := &http.Client{Transport: transport}
	req, err := http.NewRequest("GET", *mimvp_url, nil)
	if err != nil {
		log.Fatal(err.Error())
	}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err.Error())
	}
	if resp.StatusCode == 200 {
		robots, err := ioutil.ReadAll(resp.Body)
		resp.Body.Close()
		if err != nil {
			log.Fatal(err.Error())
		}
		html = string(robots)
	} else {
		html = ""
	}
	return
}

// success http
// proxy_uri := "http://125.77.25.124:80"
// mimvp_url := "http://mimvp.com"
func main_3(proxy_uri string, mimvp_url string) {
	html := fetch(&mimvp_url, &proxy_uri)
	fmt.Println(html)
}

// success socks5
// 1. download https://github.com/golang/net
// 2. unzip and move to /usr/local/go/src/golang.org/x/net/
// 3. import ( "golang.org/x/net/proxy" )
func main_socks5(proxy_socks string, mimvp_url string) {
	// create a socks5 dialer
	dialer, err := proxy.SOCKS5("tcp", proxy_socks, nil, proxy.Direct)
	if err != nil {
		fmt.Println(os.Stderr, "can't connect to socks5 proxy:", err)
		os.Exit(1)
	}

	// setup a http client
	//	transport := &http.Transport{}
	//	transport.Dial = dialer.Dial
	transport := &http.Transport{Dial: dialer.Dial}
	client := &http.Client{Transport: transport}

	resp, err := client.Get(mimvp_url)
	if err != nil {
		log.Fatalln(err)
	} else {
		defer resp.Body.Close()
		body, _ := ioutil.ReadAll(resp.Body)
		fmt.Printf("%s\n", body)
	}
}

func main() {
	// http proxy
	proxy_uri := "http://125.77.25.124:80"
	mimvp_url := "http://mimvp.com"
	main_1(proxy_uri, mimvp_url)
	main_2(proxy_uri, mimvp_url)
	main_3(proxy_uri, mimvp_url)

	// socks5 proxy
	proxy_socks := "175.138.65.244:1080"
	main_socks5(proxy_socks, mimvp_url)
}

 

本示例中的代理,全部來自米撲代理

米撲代理,提供專業高品質代理,支持http、https、socks4、socks5等協議,

覆蓋全球120多個國家,中國34個省市,代理質量和可用性非常高

米撲代理http://proxy.mimvp.com

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM