Golang 概述 Go的优势
极其简单的部署方式
可以直接编译成机器码
不依赖其他库
可直接运行即可部署
静态语言
编译的时候检查出来大多数问题
语言层面的并发
天生基因支持,
充分的运用多核
强大的标准库
runtime系统调度机制
高效的GC垃圾回收
丰富的标准库
简单易学
25个关键字
支持内嵌C语言
面向对象语言
跨平台
HelloGolang go的语法是和python比较像的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package main import ( "fmt" "time" ) func main () { fmt.Print("hello go" ) time.Sleep(1 * time.Second) }
golang变量声明的四种方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package mainimport "fmt" func main () { var a int fmt.Println("a=" , a) fmt.Printf("type of a= %T\n" , a) var b int = 100 fmt.Println("b=" , b) fmt.Printf("type of b= %T\n" , b) var c = 100 fmt.Println("c=" , c) fmt.Printf("type of c= %T\n" , c) d := 200 fmt.Println("d=" , d) fmt.Printf("type of d = %T\n" , d) }
在声明全局变量时,我们使用上述的四种方法发现
编译直接报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var aa ,bb ="123" ,"456" fmt.Printf(aa,bb) var cc ,dd=123 ,"123" fmt.Println(cc,dd) var ( vv int =100 xx bool =true ) fmt.Println(vv,xx)
常量与枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package mainimport "fmt" const ( SHANGHAI = iota NANJING CHONGQING ) func main () { const length int = 100 fmt.Println(length) fmt.Println(SHANGHAI) fmt.Println(NANJING) fmt.Println(CHONGQING) }
golang函数的参数与返回结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package mainimport "fmt" func fool (i int , b string ) int { fmt.Println(i) fmt.Println(b) c := 100 return c } func main () { var c = fool(1 , "zf" ) fmt.Println("the result is=" , c) }
也可有多个返回结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package mainimport "fmt" func fool (i int , b string ) (int , int ) { fmt.Println(i) fmt.Println(b) c := 100 d := 200 return c, d } func main () { var c, d = fool(1 , "zf" ) fmt.Println("the result is=" , c) fmt.Println("the result is=" , d) }
在import本项目包时,会先去调用.go文件中的init方法,倘若导包后没有使用该包的函数,也会去执行init方法,且包中的对外的函数必须函数名首字母大写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ---------lib1--------- package lib1import "fmt" func Lib1Test () { fmt.Println("lib1Test-----" ) } func init () { fmt.Println("lib1-----init" ) } -------lib2-------- package lib2import "fmt" func Lib2Test () { fmt.Println("lib2Test-----" ) } func init () { fmt.Println("lib2---init" ) }
在调用时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package mainimport ( "golnagCode/lib1" "golnagCode/lib2" ) func main () { lib1.Lib1Test() lib2.Lib2Test() }
执行结果
defer 在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时的释放资源,Go的设计者提供defer (延时机制)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package mainimport "fmt" func func1 () { fmt.Println("A" ) } func func2 () { fmt.Println("B" ) } func func3 () { fmt.Println("C" ) } func main () { defer func1() defer func2() defer func3()
输出结果
数组与动态数组 1 2 3 4 5 6 7 8 9 10 11 12 13 func main () { myarray := [10 ]int {1 , 2 , 3 , 4 } for index, value := range myarray { fmt.Println("index=" , index, ",value=" , value) } fmt.Printf("myarray type of %T\n" , myarray) }
slice切片 切片(slice)是对数组的一个连续片段的引用,所以切片是一个引用类型,这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。
Go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比作切糕的话,切片就是你要的“那一块”,切的过程包含从哪里开始(切片的起始位置)及切多大(切片的大小),容量可以理解为装切片的口袋大小,如下图所示
示例:
1 2 3 4 5 6 7 8 9 10 11 12 package mainimport "fmt" func main () { slice := []int {1 , 2 , 3 , 4 , 5 } slice2 := slice[1 :3 ] for i, v := range slice2 { fmt.Printf("索引为:%d,值为:%d\n" , i, v) } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package mainimport "fmt" func main () { slice := []int {1 , 2 , 3 , 4 } slice2 := make ([]int , len (slice)) fmt.Println("--容量为:" , cap (slice2)) slice2 = slice[1 :3 ] for i, v := range slice2 { fmt.Println("索引为:" , i, "值为:" , v) } fmt.Println("----------------" ) slice2 = append (slice2, 1 ) for i, v := range slice2 { fmt.Println("索引为:" , i, "值为:" , v) } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package mainimport "fmt" func main () { Mymap1 := make (map [string ]string , 10 ) Mymap1["1" ] = "java" Mymap1["2" ] = "golang" Mymap1["3" ] = "c++" fmt.Printf("%v\n" , Mymap1) Mymap2 := map [int ]string { 1 : "2" , 2 : "2" , 3 : "2" , } fmt.Printf("%v\n" , Mymap2) }
对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package Heroimport "fmt" type Hero struct { Name string age int level int } func (h *Hero) GetName() { fmt.Println("Name =" , h.Name) } func (h *Hero) SetName(name string ) { h.Name = name } func (h *Hero) Show() { fmt.Println("Name =" , h.Name) fmt.Println("Age =" , h.age) fmt.Println("Level =" , h.level) }
要谨记Java与go之间的区别,Java的方法中形参的传递方式一般使用的是值引用,而Go使用的默认是值传递,若使用值传递则需要传递指针例如像方法上述的意义
继承 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 package mainimport ( "fmt" "strconv" ) type Human struct { name string age int height float32 } func (h *Human) setName(a string ) { h.name = a } func (h *Human) say() { fmt.Println("Now I am saying" ) } func (h *Human) show() { fmt.Printf("name:" + h.name) fmt.Printf("age:" + strconv.Itoa(h.age)) fmt.Printf("height:" + strconv.FormatFloat(float64 (h.height), 'f' , 2 , 32 )) } type SuperMan struct { *Human level int } func (s *SuperMan) Fly() { fmt.Println("I am SuperMan,I can fly" ) } func (s *SuperMan) show() { fmt.Printf("name:" + s.name) fmt.Printf(",age:" + strconv.Itoa(s.age)) fmt.Printf(",height:" + strconv.FormatFloat(float64 (s.height), 'f' , 2 , 32 )) fmt.Printf(",level:" + strconv.Itoa(s.level)) } func main () { human := Human{name: "zhangsan" , age: 22 , height: 1.75 } human.setName("lisi" ) human.say() human.show() fmt.Println("====================" ) s := SuperMan{&human, 100 } s.Fly() s.show() human.setName("123321" ) fmt.Println() s.show() }