本文共 4238 字,大约阅读时间需要 14 分钟。
特点:
a.自动垃圾回收b.丰富的内置类型c.函数多返回值d.错误处理e.匿名函数和闭包f.类型和接口g.goroutine并发编程h.反射i.CGO调用c函数go语言从main包中的main函数开始执行,Go语言的main()函数不能带参数,也不能定义返回值。命令行传入的参数在os.Args变量中保存。如果需要支持命令行开关,可使用flag包。在包声明之后,是一系列的import语句,用于导入该程序所依赖的包。
package mainimport "fmt"// 我们需要使用fmt包中的Println()函数func main() { fmt.Println("Hello, world. 你好,世界! ")}》go run hello.go》go build hello.go1.变量=赋值运算符:= 类型推断并附初值a.各种变量的声明var v1 intvar v2 stringvar v3 [10]int // 数组var v4 []int // 数组切片var v5 struct { f int}var v6 *int // 指针var v7 map[string]int // map,key为string类型,value为int类型var v8 func(a int) intconst zero = 0.0b.变量声明时初始化
var v1 int = 10 // 正确的使用方式1var v2 = 10 // 正确的使用方式2,编译器可以自动推导出v2的类型v3 := 10 // 正确的使用方式3,编译器可以自动推导出v3的类型go语言是一种强类型语言,在变量定义时可以指明数据类型,也可以选择自动推导c.变量赋值
i, j = j, i //支持多重赋值d.匿名变量""表示假 设GetName()函数的定义如下,它返回3个值,分别为firstName、lastName和nickName:func GetName() (firstName, lastName, nickName string) { return "May", "Chan", "Chibi Maruko"}若只想获得nickName,则函数调用语句可以用如下方式编写:, , nickName := GetName() 假 设GetName()函数的定义如下,它返回3个值,分别为firstName、lastName和nickName:func GetName() (firstName, lastName, nickName string) { return "May", "Chan", "Chibi Maruko"}若只想获得nickName,则函数调用语句可以用如下方式编写:, _, nickName := GetName()
e.常量,定义时添加const
const Pi float64 = 3.14159265358979323846const zero = 0.0 // 无类型浮点常量const (size int64 = 1024eof = -1 // 无类型整型常量)const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值const a, b, c = 3, 4, "foo"// a = 3, b = 4, c = "foo", 无类型整型和字符串常量f.枚举
下面是一个常规的枚举表示法,其中定义了一系列整型常量:const (Sunday = iotaMondayTuesdayWednesdayThursdayFridaySaturdaynumberOfDays // 这个常量没有导出)同Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。以上例子中numberOfDays为包内私有,其他符号则可被其他包访问。g.go语言的数据类型
布尔类型:bool。 整型:int8、uint8、byte、int16、int、uint、int32、int64、uintptr等。 浮点类型:float32、float64。 复数类型:complex64(由2个float32构成的复数类型)、complex128。 2+3i 字符串:string。 字符类型:rune。 代表单个Unicode字符。 错误类型:error。此外,Go语言也支持以下这些复合类型: 指针(pointer) 数组(array) 切片(slice) 字典(map) 通道(chan) 结构体(struct) 接口(interface)字符串取值及其遍历
str := "Hello,世界"n := len(str)for i := 0; i < n; i++ { ch := str[i] // str[i]="x";错误,字符串是不能重新被改变了,数组才行fmt.Println(i, ch)}数组的使用
[32]byte // 长度为32的数组,每个元素为一个字节[2N] struct { x, y int32 } // 复杂类型数组[1000]float64 // 指针数组[3][5]int // 二维数组[2][2][2]float64 // 等同于var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
mySlice := myArray[:] //基于myArray的所有元素创建数组切片
mySlice := myArray[:5] //基于myArray的前5个元素创建数组切片mySlice := myArray[5:] //基于从第5个元素开始的所有元素创建数组切片mySlice := make([]int, 5) //创建一个初始元素个数为5的数组切片,元素初始值为0:mySlice := make([]int, 5, 10) //创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间:len(mySlice)=5cap(mySlice)=10 ,mySlice = append(mySlice, 1, 2, 3) ,任何数组都可以动态增长mySlice := []int{1, 2, 3, 4, 5} //直接创建并初始化包含5个元素的数组切片:for _, v := range myArray { //数组遍历
fmt.Print(v, " ")} for i := 0; i <len(mySlice); i++ { fmt.Println("mySlice[", i, "] =", mySlice[i])}数组复制:
slice1 := []int{1, 2, 3, 4, 5}slice2 := []int{5, 4, 3}copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置map的使用
map是一堆键值对的未排序集合。var personDB map[string] PersonInfo
personDB = make(map[string] PersonInfo) personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203,..."} person, ok := personDB["1234"] // ok是一个返回的bool型,返回true表示找到了对应的数据delete(myMap, "1234") //删除一个key2.流程控制
a.if语句if a < 5 { return 0} else { return 1} b.switch..case..switch i { case 0:fmt.Printf("0")case 1:fmt.Printf("1")case 2:fallthroughdefault:fmt.Printf("Default")}c.for
for i := 0; i < 10; i++ { sum += i}d.goto
i := 0HERE:fmt.Println(i)i++if i < 10 { goto HERE}}e.函数定义
实名函数package mymathimport "errors"func Add(a int, b int) (ret int, err error) { if a < 0 || b < 0 { // 假设这个函数只支持两个非负数字的加法err= errors.New("Should be non-negative numbers!")return}return a + b, nil // 支持多重返回值}import "mymath"// 假设Add被放在一个叫mymath的包中
// ...c := mymath.Add(1, 2)匿名函数
f := func(x, y int) int { return x + y}闭包函数
var j int = 5 //全局变量a := func()(func()) { var i int = 10return func() { fmt.Printf("i, j: %d, %d\n", i++, j) //闭包的记忆性}}()3.面向对象编程
Go语言中的大多数类型都基于值语义而不是引用赋值语义,包括: 基本类型,如byte、 int、 bool、 float32、 float64和string等; 复合类型,如数组(array)、结构体(struct)和指针(pointer)等。转载于:https://blog.51cto.com/a1liujin/2080143