golang入门

author author     2022-10-21     596

关键词:

特点:
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 // 等同于2

var myArray [10]int = [10]int1, 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 := []int1, 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 := []int1, 2, 3, 4, 5
slice2 := []int5, 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)等。

go语言入门篇-golang之文本编码处理

Golang之文本编码处理  查看详情

golang入门的基本记录器。(代码片段)

查看详情

golang入门到项目实战golang并发编程之runtime包

参考技术Aruntime包里面定义了一些协程管理相关的api让出CPU时间片,重新等待安排任务运行结果退出当前协程运行结果运行结果如果修改最大核心数为1,运行结果如下,不会出现交替执行现象 查看详情

golang入门到项目实战golang结构体指针

参考技术A结构体指针和普通的变量指针相同,我先来回顾一下普通变量的指针,例如:运行结果实例运行结果我们还可以通过使用new关键字对结构体进行实例化,得到的是结构体的地址,例如:运行结果从运行结果,我们发现p_... 查看详情

golang入门:并发(代码片段)

Golang入门(4):并发摘要并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求,这也是并发的必要性之一。Golang的并发控制比起Java来说&... 查看详情

golang入门必读:

Go官方教程(必读):https://tour.go-zh.org/listGo官方手册(必读):https://golang.org/doc/effective_goPractical-Go(必读):https://dave.cheney.net/practical-go 查看详情

golang入门到项目实战|golang函数(代码片段)

golang函数简介函数的go语言中的一级公民,我们把所有的功能单元都定义在函数中,可以重复使用。函数包含函数的名称、参数列表和返回值类型,这些构成了函数的签名(signature)。go语言中函数特性go语言... 查看详情

golang入门案例之socket

//服务端代码packagemainimport( "fmt" "net" "log" "os" "encoding/binary")funcmain(){ //建立socket,监听端口 netListen,err:=net.Listen("tcp","localhost:8090") CheckError(err) defernetListen.Close() Log("Waitingforc 查看详情

golang入门到项目实战|golang继承(代码片段)

golang本质上没有oop的概念,也没有继承的概念,但是可以通过结构体嵌套实现这个特性。例如packagemainimport"fmt"typeAnimalstructnamestringageintfunc(aAnimal)eat()fmt.Println("eat...")func(aAnimal)sleep()fmt.Println("sleep")typeDogstr... 查看详情

golang入门到项目实战|golang指向数组的指针(代码片段)

定义语法varptr[MAX]*int;表示数据里面的元素的类型是指针类型实例演示packagemainimport"fmt"constMAXint=3funcmain()a:=[]int1,3,5variintvarptr[MAX]*intfmt.Println(ptr)//这个打印出来的是[<nil><nil><nil>]fo 查看详情

golang语言入门及安装

golang语言入门及安装go语言是google在2009年发布的开源编程语言使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。本次讲解在windows上安装go语言的开发环境首先进入go语言中文社区地址:https://studygolang.com/... 查看详情

golang入门到项目实战|golang构造函数(代码片段)

golang没有构造函数的概念,可以使用函数来模拟构造函数的功能。例如packagemainimport"fmt"typePersonstructnamestringageintfuncNewPerson(namestring,ageint)(*Person,error)ifname==""returnnil,fmt.Errorf("name不能为空")ifage<0returnnil... 查看详情

go语言入门指南零基础入门go语言|golang入门指南(代码片段)

...练习项目都在github这个仓库中`https://github.com/CocaineCong/Golang-Learning`1.【第一轮】基础部分1.1教程1.2练习2.【第二轮】网络爬虫2.1教程2.2mod管理第三方包2.3git机制3.【第三轮】备忘录4.【第四轮】商城or视频网站5.【第五轮】IM... 查看详情

go语言入门指南零基础入门go语言|golang入门指南(代码片段)

...练习项目都在github这个仓库中`https://github.com/CocaineCong/Golang-Learning`1.【第一轮】基础部分1.1教程1.2练习2.【第二轮】网络爬虫2.1教程2.2mod管理第三方包2.3git机制3.【第三轮】备忘录4.【第四轮】商城or视频网站5.【第五轮】IM... 查看详情

window下golang使用grpc入门案例(代码片段)

一、检查golang的安装环境https://golang.org/dl/需要墙,或者在这里下载https://pan.baidu.com/s/12tTmrVIel6sfeBInpt9lQA最新版本1.10下载msi安装即可goversion验证安装 查看详情

golang入门到项目实战|golang指针(代码片段)

Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无需拷贝数据。类型指针不能进行偏移和运算。Go语言中的指针操作非常简单&#... 查看详情

golang入门案例之httpclient请求

发请求,接收接送,并解析packagemainimport( "fmt" "net/http" "io/ioutil" "net/url" "encoding/json" "os")typeStudentstruct{ Namestring Ageint Guakebool Classes[]string Pricefloat32}func(s*Student)ShowStu(){ fmt.Pri 查看详情

golang入门到项目实战|golang运算符(代码片段)

Go语言内置的运算符有:算术运算符关系运算符逻辑运算符位运算符赋值运算符算术运算符运算符描述+相加-相减*相乘/相除%求余注意:++(自增)和--(自减)在Go语言中是单独的语句,并不是... 查看详情