第一篇:初始Golang

Golang簡介

編程語言已經很是多,偏性能敏感的編譯型語言有 C、C++、Java、C#、Delphi和Objective-C 等,偏快速業務開發的動態解析型語言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特 定領域的語言有Erlang、R和MATLAB等,那麼咱們爲何須要 Go這樣一門新語言呢?html

數據來源:https://www.tiobe.com/tiobe-index/python

編程語言排行榜前9名是至關穩定的,可是第10名每月都會變化,候選人就是GO、Swift和R。Swift是IOS移動應用程序的頭號編程語言,可是僅僅適用IOS而不能用於Android,另外R語言的地位深深的被python壓制。程序員

在2000年之前的單機時代,C語言是編程王中王。隨着機器性能的提高、軟件規模和複雜度提升、Java逐步取代了C的大佬地位。可是Java編程的體驗並未盡人意。歷年來Java的市場份額在逐步降低,後勁不足。golang

Go語言做者

 

羅伯特·格瑞史莫,羅波·派克,肯·湯普遜於2006年1月2號下午15點4分5秒設計出了go語言。編程

Robert開發GO以前是Google v八、HotSpot JVM的主要貢獻者;Rob主要是Unix、UTF-八、plan9的做者;Ken主要是C、B語言、Unix之父。windows

後來Ian Lance Taylor、Russ Cox加入項目,Ian Lance Taylor是GCC的做者之一,目前負責GCC的Go實現;Brad Fitzpatrick以前是Memcache的做者,目前主要是HTTP2的實現做者。緩存

Go語言與新技術

Golang是Google開發的一種靜態強類型、編譯型、併發型、具備垃圾回收功能的編程語言。Go語言做者之一Rob Pike在新文章「Go: Ten years and climbing」中,回顧了一下 Go 語言的發展過程。他們本身都沒想到Go語言的迅猛發展,迅速成爲了雲計算領域中新一代開發語言,中國程序員對Go的熱愛超出了他們的想象。併發

Go語言特點:運維

  • 語法簡單、上手快
  • 並行和異步編程幾乎無痛點,Go語言的Goroutine和Channel是併發編程兩大神器,而C、Java、Python等語言的併發和異步控制比較麻煩,還很容易出錯,而Go解決這個問題很是優雅流暢
  • 互聯網時代的C語言,C語言關注執行效率和性能與底層友好,而python是用盡可能少的代碼完成更多的事。而Go語言指望完成一種C+python的統一,解決開發效率和底層應用開發
  • Go語言有Google世界一流的技術公司支持
  • 殺手級應用Docker

Go語言不會吞噬底層到C和C++的級別,也不會吞噬到Java的業務層。Go語言必定能吞噬的是Pass上的項目,例如消息緩存中間件、服務發現、日誌收集、控制系統等。異步

Go語言殺手級的Docker應用優點:

  • Docker上手容易
  • 解決了運維中的環境問題
  • Google的支持
  • k8s

使用Go語言的公司

Golang環境

安裝Golang

Go安裝
windows:
1、下載安裝包
https://golang.org/dl/  國外網站
https://studygolang.com/dl  國內網站
下載地址: https://studygolang.com/dl/golang/go1.11.windows-amd64.msi
2.安裝
默認安裝路徑:C:\Go
3.環境變量已默認添加
C:\Go\bin;

Linux、MacOS

安裝包下載地址:https://studygolang.com/dl

查看golang環境go env命令

C:\Users\yuchao>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\yuchao\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\yuchao\go #存放golang項目的目錄,全部項目都放到gopath的src目錄下
set GOPROXY=
set GORACE=
set GOROOT=C:\Go   #golang的安裝目錄
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Q

C:\Users\yuchao>

Golang目錄結構

http://docscn.studygolang.com/doc/code.html

go命令依賴一個重要的環境變量:$GOPATH,gopath定義go項目的工做目錄。

例如go install 命令用於構建二進制命令,產生一個可執行的二進制文件,而後將該二進制文件做爲hello安裝到gopath的bin目錄中。

用golang向世界say hello world

在目錄C:\Users\yuchao\go\src\go_study\hello\下建立hello.go文件,寫入代碼

package main //package關鍵字,指定hello.go屬於哪一個包,指定main就是說是可執行程序

import "fmt" //導入格式化輸出的fmt包

func main() {   //func定義main函數,是程序的入口函數,在執行可執行二進制文件的時候,找到main函數體
    fmt.Println("I am a gopher,i am saying 'Hello World!'") //fmt.Println打印並換行
}

go build 編譯生成可執行文件 hello.exe

golang最小粒度是包

#go build 編譯生成可執行二進制文件,go build 會去尋找gopath的src下的目錄
C:\Users\yuchao\go>go build  go_study/hello
#執行hello.exe文件
C:\Users\yuchao\go>hello.exe
I am a gopher,i am saying 'Hello World!' #go build 指定目錄生成可執行文件
C:\Users\yuchao\go>go build -o bin/hello1.exe go_study/hello
C:\Users\yuchao\go>cd bin
C:\Users\yuchao\go\bin>hello1.exe
I am a gopher,i am saying 'Hello World!'

 go run 快速執行go文件,如同執行腳本同樣

C:\Users\yuchao\go>go run go_study/hello
I am a gopher,i am saying 'Hello World!'

go install編譯成可執行文件到bin目錄下

C:\Users\yuchao\go>go install go_study/hello
C:\Users\yuchao\go>cd bin
C:\Users\yuchao\go\bin>hello.exe
I am a gopher,i am saying 'Hello World!'

go test 單元測試/壓力測試

go fmt格式化源代碼

故意寫入亂的格式代碼

package main //告知golang這是可執行文件

import "fmt" //導入格式化輸出的package

func                  main() { //主函數執行代碼
                  fmt.Println("I am a gopher,i am saying 'Hello World!'")
}
#go fmt格式化代碼
C:\Users\yuchao\go\bin>go fmt go_study/hello
#此時查看源代碼的格式

Go程序結構

  • go源碼按照package進行組織,而且package必須放在非註釋的第一行
  • 一個程序只能有一個main包和一個main函數(一個目錄下不能有多個package main)
  • main函數是程序的執行入口

Go註釋

單行註釋
//
多行註釋
/*  */

 Go命名 

Go語言中的函數名、變量名、常量名、類型名、語句標號和包名等全部的命名,都遵循命名規則

一個名字必須以一個字母或下劃線開頭,後面能夠跟任何數量的字母、數字、下劃線

例如
_ab123
name
Age_12
嚴格區分大小寫首字母,含義不一樣,例如Name和name是不一樣的
名字開頭字母的大小寫決定了名字在包外的可見性
Go語言推薦用駝峯式命名,如htmlEscape、NewConfigData、printHelp、
package main

import "fmt"

func main() {
    var _name = "YuChao"
    var Age = 18
    fmt.Println(_name)
    fmt.Println(Age)
}

Go關鍵字

Go語言預先定義好的,有特殊含義的關鍵字不能用於自定義名字,只能在特定語法結構體中用

Go聲明

Go語言有四種類型的聲明語句:var、const、type和func,分別是變量、常量、類型、函數實體對象。

變量

package main

import "fmt"

//變量聲明語法 var identify type,定義變量並初始化,通常使用var聲明全局變量
//go存在零值初始化機制,確保每一個聲明的變量總有一個值,數值類型零值是0,布爾類型是false,字符串類型是空字符串,
接口或是(slice,map,chan和函數)變量對應零值是nil
/* var a int var b string var c bool var d int = 8 var e string = "hello" */ //var聲明方式二 /* var ( a int //0 b string // "" c bool // false d int = 8 // 8 name string = "yuchao" //hello age = 18 //go編譯器自動類型推導 ) */ //var聲明方式三 //平行賦值,忽略類型聲明,自動推導變量類型 var name,age,addr="chao",18,"shahe" func main() { fmt.Println(name,age,addr) fmt.Println(num1,num2,num3) //聲明變量name且賦值"chao",簡短聲明,只能在函數內部使用定義局部變量 name := "chao" fmt.Println(name) }

常量

常量使用const修飾,表明永遠是隻讀的,不能修改。且const常量必須有值

package main

import (
    "fmt"
)

//const pi  = 3.1415926
//常量必須賦值,不寫就報錯
/*
優雅的寫法
const (
    //go的類型推導,編譯器會根據值,推導出類型,是字符串,仍是數字
    birthDay = "1993-10-1"
    pi       = 3.1415926
)
*/

const (
    a int = 100
    b     //這裏若是不寫值和類型,會使用上一層a的值
    c int = 200
    d     //同理使用c的值
)

func main() {
    //fmt.Printf("birthDay=%v\n", birthDay)
    //fmt.Printf("pi=%v", pi)
    fmt.Printf("a=%d b=%d c=%d d=%d\n", a, b, c, d)
}

iota常量生成器

常量聲明也能夠用iota常量生成器初始化,它用於生成一組類似規則初始化的常量。可是不用每行都寫一遍初始化表達式。在一個const聲明語句中,在第一個聲明的常量所在行,iota會被設置爲0,而後在每個有常量聲明的行加一。

func main() {
    //fmt.Printf("birthDay=%v\n", birthDay)
    //fmt.Printf("pi=%v", pi)
    fmt.Printf("a=%d b=%d c=%d d=%d\n", a, b, c, d)

    const (
        e = iota
        f // f=iota
        g //g=iota
    )
    fmt.Printf("e=%d f=%d g=%d\n", e, f, g)
    //iota實際用在time包中的效果
    //週日爲0,週一爲1,依次推導
    type Weekday int
    const (
        Sunday Weekday = iota
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
        Saturday
    )
    fmt.Printf("Monday is %d\n", Monday)
    fmt.Printf("Saturday is %d\n", Saturday)
}

Go數據類型與操做符

  1. 布爾類型
  2. 整數和浮點數類型
  3. 字符串類型

布爾類型

  • 布爾類型的值有兩種:true和false
  • if和for語句的條件部分都是bool類型的值
  • ==和< > 等比較操做也會產生布爾型的值
  • 一元操做符!對應邏輯非操做,!true的值是false
  • 布爾值能夠和&&(and)和 ||(or)操做符結合
package main

import "fmt"

//定義無參函數
func testBool() {
    var a bool
    fmt.Println(a)
    a = true
    fmt.Println(a)
    a = !a
    fmt.Println(a)

    var b bool = true
    if a == true && b == true {
        fmt.Println("正確")
    } else {
        fmt.Println("錯誤")
    }
    if a == true || b == true {
        fmt.Println("||正確")
    } else {
        fmt.Println("||錯誤")
    }
    fmt.Printf("%t %t\n", a, b)
}

func main() {
    testBool()
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

goland IDE

下載地址:https://www.jetbrains.com/go/download/#section=windows

激活地址:
http://idea.lanyus.com/
相關文章
相關標籤/搜索