博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang入门
阅读量:6610 次
发布时间:2019-06-24

本文共 4238 字,大约阅读时间需要 14 分钟。

特点:

a.自动垃圾回收
b.丰富的内置类型
c.函数多返回值
d.错误处理
e.匿名函数和闭包
f.类型和接口
g.goroutine并发编程
h.反射
i.CGO调用c函数

go语言从main包中的main函数开始执行,Go语言的main()函数不能带参数,也不能定义返回值。命令行传入的参数在os.Args变量中保存。如果需要支持命令行开关,可使用flag包。在包声明之后,是一系列的import语句,用于导入该程序所依赖的包。

package main
import "fmt"// 我们需要使用fmt包中的Println()函数
func main() {
fmt.Println("Hello, world. 你好,世界! ")
}
》go run hello.go
》go build hello.go
1.变量
=赋值运算符
:= 类型推断并附初值
a.各种变量的声明
var v1 int
var v2 string
var 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) int
const zero = 0.0

b.变量声明时初始化

var v1 int = 10 // 正确的使用方式1
var 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.14159265358979323846
const zero = 0.0 // 无类型浮点常量
const (
size int64 = 1024
eof = -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 = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays // 这个常量没有导出
)
同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)=5
cap(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") //删除一个key

2.流程控制

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:
fallthrough
default:
fmt.Printf("Default")
}

c.for

for i := 0; i < 10; i++ {
sum += i
}

d.goto

i := 0
HERE:
fmt.Println(i)
i++
if i < 10 {
goto HERE
}
}

e.函数定义

实名函数
package mymath
import "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 = 10
return 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

你可能感兴趣的文章
太感谢DUDU拉!有这样的管理员,博客园能不火吗?
查看>>
15.2. switchport trunk encapsulation dot1q 提示 invaild input at^marker.
查看>>
(EM算法)The EM Algorithm
查看>>
Linux~yum命令安装程序
查看>>
getline函数(精华版)
查看>>
互联网辅助代理IP软件的应用需守牢数据安全的“底线”
查看>>
快速排序及其优化
查看>>
web
查看>>
第七天 结构伪类选择器(一)
查看>>
程序猿生存指南-10 敲定工作
查看>>
JDBC练习题——登录系统
查看>>
代码即设计 | 掘金年度征文
查看>>
GuzzleSwoole v1.1.0,让 Guzzle 完美兼容 Swoole 协程
查看>>
javascript性能优化
查看>>
运维工程师笔试真题:美团点评 2017 春招真题
查看>>
关于绝对定位和overflow的可见与不可见
查看>>
Vue学习笔记2
查看>>
LDAP密码认证例子
查看>>
2019程序媛面试之美少女战士
查看>>
有限状态机是什么?
查看>>