特性
Go语言具有以下的特征:
- 自动垃圾回收
- 更丰富的内置类型
- 函数多返回值
- 错误处理
- 匿名函数和闭包
- 类型和接口
- 并发编程
- 反射
- 语言交互性
命令
go build test.go # 生成可执行文件 test
go run test.go # 运行代码
关键字
25 个关键字
| | | | |
---|
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
36 个预定义标识符
| | | | | | | | |
---|
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
print | println | real | recover | string | true | uint | uint8 | uintptr |
包引入
package main
import (
"fmt"
"math"
"strconv"
"time"
"unsafe"
)
全局声明
var (
goalA int
goalB bool
)
const (
Unknown = iota
Female
Male
)
const (
Tag = "abc"
TagLen = len(Tag)
TagSize = unsafe.Sizeof(Tag)
)
变量声明
func funcvar() {
var m int = 2
var n int = 2
fmt.Println("res:", m+n)
}
打印和格式化
func prt() {
fmt.Println("Hello world")
}
func prtG() {
fmt.Println(fmt.Sprintf("goal vars: goalA=%d, goalB=%v", goalA, goalB))
fmt.Println(fmt.Sprintf("goal consts: Unknown=%d, Female=%d, Male=%d", Unknown, Female, Male))
fmt.Println(fmt.Sprintf("goal consts: Tag=%s, TagLen=%d, TagSize=%d", Tag, TagLen, TagSize))
}
func funcfmt() {
var succ = true
var statuscode int = 200
var lon = 119.232322
var lat = 39.232322
strLon := strconv.FormatFloat(lon, 'f', -1, 32)
strLat := strconv.FormatFloat(lat, 'f', -1, 32)
var date = "2021-10-01"
var url = "succ=%t&code=%d&date=%s&lon=%s&lat=%s"
var targetUrl = fmt.Sprintf(url, succ, statuscode, date, strLon, strLat)
fmt.Println(targetUrl)
}
引用
func funcref() {
var n = 2
m := &n
var m2 *int = &n
fmt.Println(n, m, m2)
n = 4
fmt.Println(n, m, m2, *m)
}
指针
func funcptr() {
var a int= 20
var ip *int
ip = &a
fmt.Printf("a 变量的地址是: %x\n", &a )
fmt.Printf("ip 变量储存的指针地址: %x\n", ip )
fmt.Printf("*ip 变量的值: %d\n", *ip )
fmt.Println("ip == nil:", ip == nil)
var ptr *int
fmt.Println("ptr == nil:", ptr == nil)
}
函数多返回值
func funnumbers() (int, float64, string) {
a, b, c := 20, 64.2231, "ok"
return a, b, c
}
func funccallf() {
_, f, s := funnumbers()
fmt.Println(f, s)
}
iota使用
func funcconstiota() {
const (
a = iota
b
c
d = "ha"
e
f = 100
g
h = iota
i
)
const (
x = "hx"
y
)
const (
i2 = 1 << iota
j2 = 3 << iota
k2
l2
)
fmt.Println(a, b, c, d, e, f, g, h, i)
fmt.Println(x, y)
fmt.Println(i2, j2, k2, l2)
}
条件语句
func funccondition(i int) {
if i < 0 {
fmt.Println("if end", fmt.Sprintf("%d < 0", i))
} else {
fmt.Println("else end")
}
switch i {
case 0:
fmt.Println("case 0")
case 1:
fmt.Println("case 1")
default:
fmt.Println("case default")
}
}
select使用
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func funcselect() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}
多函数参数
func funcparams(name, nick string, age, work int) {
fmt.Println(name, nick, age, work)
getSquareRoot := func(x float64) float64 {
return math.Sqrt(x)
}
fmt.Println(getSquareRoot(9))
}
闭包函数
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
func funcclosepk() {
nextNumber := getSequence()
fmt.Println(nextNumber(), nextNumber(), nextNumber())
}
递归函数
func fibonacci3(n int) int {
if n < 2 {
return n
}
return fibonacci3(n-2) + fibonacci3(n-1)
}
func funcrecursion() {
var i int
for i = 0; i < 10; i++ {
fmt.Printf("%d,", fibonacci3(i))
}
fmt.Print("\n")
}
结构体和方法
type Circle struct {
radius float64
}
func (c Circle) getArea() float64 {
return 3.14 * c.radius * c.radius
}
func (c *Circle) setRadius(r float64) {
c.radius = r
}
func funcmethod() {
var c Circle = Circle{2}
fmt.Println(c.radius, "getArea", c.getArea())
c.setRadius(3)
fmt.Println(c.radius, "getArea", c.getArea())
}
数组的使用
func funcarrays() {
var l1 [5] int
fmt.Println(l1)
l2 := [3]int {2, 1, 3}
l3 := [...]int {2, 1, 3, 0}
fmt.Println(l2)
fmt.Println(l3)
l4 := [5]int {1: 1, 3: 9}
fmt.Println(l4)
l1[2] = 50
fmt.Println(l1)
ml1 := [2][3] int {}
fmt.Println(ml1)
ml2 := [2][3] int {{1,2,3}, {4,5,6}}
fmt.Println(ml2)
fmt.Println(ml2[1][2])
}
切片的使用
func funcslice() {
s1 := [] int{1,2,3,4,5,6,7,8}
fmt.Println(s1[:3])
fmt.Println(s1[1:3])
fmt.Println(s1[1:])
fmt.Println(cap(s1))
}
map的使用
func funcmap() {
var countryCapitalMap map[string]string
countryCapitalMap = make(map[string]string)
countryCapitalMap [ "France" ] = "巴黎"
countryCapitalMap [ "Italy" ] = "罗马"
countryCapitalMap [ "Japan" ] = "东京"
countryCapitalMap [ "India " ] = "新德里"
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [country])
}
capital, ok := countryCapitalMap [ "American" ]
if (ok) {
fmt.Println("American 的首都是", capital)
} else {
fmt.Println("American 的首都不存在")
}
}
range的使用
func funcrange() {
nums := [] int{1,2,3,4,5,6,7,8}
for i, num := range nums {
fmt.Println(i, num)
}
for i, c := range "aBcd" {
fmt.Println(i, c)
}
kvs := map[string]string{"a": "apple", "b": "banana"}
for k := range kvs {
fmt.Printf("%s \n", k)
}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
fmt.Println(kvs["a"])
}
接口的使用
type Phone interface {
call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
fmt.Println("I am Nokia, I can call you!")
}
type IPhone struct {
}
func (iPhone IPhone) call() {
fmt.Println("I am iPhone, I can call you!")
}
func funcinterface() {
var phone Phone
phone = new(NokiaPhone)
phone.call()
phone = new(IPhone)
phone.call()
}
错误处理
func sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
}
return math.Sqrt(f), nil
}
func sqrtx(f float64) float64 {
f2, err := sqrt(f)
if(err != nil) {
strF := strconv.FormatFloat(f, 'f', -1, 64)
panic("error: sqrt(" + strF + "): " + err.Error())
}
return f2
}
type DivideError struct {
dividee int
divider int
}
func (de *DivideError) Error() string {
strFormat := `
Cannot proceed, the divider is zero.
dividee: %d
divider: 0
`
return fmt.Sprintf(strFormat, de.dividee)
}
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
if varDivider == 0 {
dData := DivideError{
dividee: varDividee,
divider: varDivider,
}
errorMsg = dData.Error()
return
} else {
return varDividee / varDivider, ""
}
}
func funcerror() {
v1, err1 := sqrt(64)
fmt.Println("sqrt(64) = ", v1, err1)
v2, err2 := sqrt(-64)
fmt.Println("sqrt(-64) = ", v2, err2)
v3 := sqrtx(64)
fmt.Println("sqrtx(64) = ", v3)
if result, errorMsg := Divide(100, 10); errorMsg == "" {
fmt.Println("100/10 = ", result)
}
if _, errorMsg := Divide(100, 0); errorMsg != "" {
fmt.Println("errorMsg is: ", errorMsg)
}
}
go并发
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func funcgo() {
go say("world")
say("hello")
}
chan 遍历
func fibonacci2(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func funcforchan() {
c := make(chan int, 10)
go fibonacci2(cap(c), c)
for i := range c {
fmt.Println(i)
}
}
调用 C库
import "C"
import "unsafe"
func funccallc() {
cstr := C.CString("Hello, world")
C.puts(cstr)
C.free(unsafe.Pointer(cstr))
}