0.一直很好奇,go是不是像傳說中的速度快,解決了多線程問題,快速進行了解了解,和java進行對比,他是怎么解決語言發展的問題的…,所有語言都是差不多的,只是熟練程度不同而已
1.go圖標是土撥鼠,2009發行
docker使用go,解決了并發問題
google facebook 騰訊 百度 七牛云 京東 小米使用go開發
可以簡單的開發web服務,不需要很多框架.區塊鏈以太坊,嵌入式
2.特點
1.語法簡單 只有i++ 沒有括號
2.支持并發 不用多線程了
3.垃圾回收
3.環境
go1.16 安裝包
cmd: go version配置環境變量
GOROOT安裝路徑 \bin
GOPATH代碼依賴 創建文件夾 bin pkg srcgo evc
開發工具 goland
4.代碼
package main //相當于默認的包
import "fmt" //工具類
func main(){ //定義方法fmt.PrintLn("Hello World") //沒有分號}
//font size調整字體
//開發工具報錯cmd: go env -w GO111MODULE=off
5.代碼1(js語法)
var name string ="aaa" //小寫的//多個變量定義簡單var name1,bb string name= "aaa"//初始化并定義,自動推導name :="aaa"age :=10var( //定義多個變量name stringage int)fmt.Printf("%T,%p",name,&age) //查看類型,查看地址var a int =100var a int =300a,b = b,a //變量交換,區別于其他語言//定義函數func test() (int,int){ //返回值return 100,200}a,_: =test() //沒有類了 接收匿名變量,不占用內存空間,也不分配內存,會丟棄//必須要使用,不然報錯//全局變量,函數外,//常量const URL string="aaa"const a,b,c =3,14,"aaa",false//iota 常量計數器計算 會自動+1 不定義的話,可以對數組遍歷,用得不多const(a =iota //0b //1c="aaa" //給標號2d //3)
5.數據類型(好像js啊,又像java一樣強類型)
var flag bool =true //默認false//整形var age int64 =19 var age uint64 =19 //無符號//32可能會精度丟失var money float64=3.14 //%f打印 默認6位小數 ,%.1f保留一位小數并且4四舍五入var age byte =19 var aa string ="" +"xxx" // %s ,%d 打印ASCIII碼,中文打印GBK//類型轉換c: =float64(a) //int轉float64 ,java使用(float)強制轉換和隱式 ,這里沒有優先級,d:=int(f)//但是使用 float64轉float32會丟失
6.關系運算符 && || == !
if !(a&&b){ //去括號}else{}//位運算 用于二進制加密解密,安全 ^異或: 不同為1 >> <<var a uint=60var a uint=13a & b //看二進制%b// &^可以清空特點的位 比如 1010 &^ 0011 = 1000 如果b為0取a的值,不是就取0,這個代碼是清空了a的后兩位, b代表清空哪里
7.其他運算符 & 和指針
var a int *
8.輸入
var x intvar y float64
fmt.ScanLn(&x,&y)
9.語法 沒有小括號
if a>20 && b<20 {}else if a>30 && b<20{} else{}switch score{ //?case 90:case 50,60,70:fallthrough //穿透到后面的default:break //停止穿透for i:=1 ;i<=10;i++{}//無限循環for{}}
10.字符串
str:="aaa"len(str) fmt.Printf("aaa",str[2]) //ascill碼fmt.Printf("%c",str[2])for i,v:=range str{//下標和值}str[2]= 'a' //錯誤的,不能轉,是int
11.函數
add(1,2)
func add(a,b int)(int) {c:=a+breturn c}
func add() {}
func add() int {return 10}
func add()(string,string ){return "aa","bb"}//要放在最后可變參數,只能一個
func add(nums ...int) int {len(nums)nums[0]return 10}
12.值傳遞 基礎類型,arr struct
arr1:=[4]int{1,2,3,4}func update(arr2 [4] int){//值傳遞,復制一份,不改原數據fmt.Println("aaa",arr2[1])arr2[1]=10
}//引用傳遞(值變化,傳入地址) 切片(可擴容的數組) map chans1: =[]int{1,2,3,4}func aa(s2 []int)
13.作用域 就近原則
for b:=1; b<=10fmt.PrintLn(b) //報錯,只能循環使用
14.遞歸函數, 有就出結果,沒有死循環
15.defer推遲執行函數最后執行,多個逆序執行 1cba
defer func1("a")func1("1")
defer func1("b")
defer func1("c")//關閉操作,寫日志
16.函數的類型是 func()
fmt.Printf("%T",f1) //如果有返回值也不一樣//函數類型的變量var f5 func(int,int)f5=f1f5(1,2) //地址一樣f2:=f1//匿名函數f3:=func(){}f3()//執行func(){}()f3:=func(a int,b int) int {return a+b} //返回值 f3(1,2)//支持函數里面傳函數(高階函數)//回調函數(被調用的)
func main(){oper(10,20,func()(int){})
}func oper(a,b int ,fun func(int,int) int) int{return 10})
17.函數閉包 不推薦使用可讀性差(函數里面定義函數 內層操作外層變量,創建的函數的值不會被銷毀,只有復制另外一個函數才重新創建)
func main(){r1:=aa()//1r1:=aa() //2r2:=aa()//1 創建新函數} func aa()func () int{ //返回函數a:=1func1:= func bb(){return a++}return func1
}
18.go語言的面向對象是使用結構體指針實現的(c語言使用比較友好)
type Person struct {name stringage int
}func (p *Person) SayHello() {fmt.Printf("Hello, my name is %s and I'm %d years old.\n", p.name, p.age)
}
19.沒有繼承和多態,實現不一樣
go```java```java
type Animal struct {name string
}func (a *Animal) Speak() {fmt.Println("I'm an animal.")
}type Dog struct {Animal // 嵌入Animal類型breed string
}func main() {d := Dog{Animal: Animal{name: "Buddy"},breed: "Labrador",}d.Speak() // 調用嵌入類型Animal的方法fmt.Println(d.name) // 訪問嵌入類型Animal的字段
}
19.總結
- 對比java語法確實簡化許多,但是那個類型我寫著好別扭, var a int64 可能寫java寫習慣了…
- 解決多線程問題, 直接寫個 go 函數名就解決了,java需要寫多線程
- 繼承和多態還是java 比較簡潔,用指針看起來不大舒服…
- go開發結束代碼沒有 ; 號,可能我覺得他的作用還是很大的, 如果我要復制代碼會格式變化,沒有分號可能可讀性比較弱
- go語言用在docker,但是生態還沒有java好,可發掘的潛力比較大