go 简介
Go是静态(编译型)强类型语言,是区别于解析型语言的弱类型语言(静态:类型固定 强类型:不同类型不允许直接运算)。
python动态强类型语言
编译:java,c,c++,c
解析型:python,js,php...
编译型语言涉及到跨平台,因为它需要编译成该平台的可执行文件,java--》运行在jvm之上
go:跨平台编译,交叉编译,在windows平台编译出mac上可执行
解释型:不存在跨平台问题,有解释器
跨平台的编译型语言,交叉编译
管道(channel),切片(slice ),并发(routine)
有垃圾回收的机制
支持面向对象和面向过程的编程模式(go的面向对象没有类的概念)
2009 年11 月7 日 weekly.2009 -11 -06 —— 早期的版本
2015 年8 月19 日 go1.5 —— 实现的架构变化,同时保留了和旧版本的兼容性,本次更新中移除了”最后残余的C代码”。
2018 年8 月24 日 go 1.11 :modules,包管理
2020 年 8 月 go 1.15
中国的互联网公司,多多少少都会用,有些没用的,都在准备用
服务的开发,微服务开发,运维相关,区块链,云平台
第一款开源区块链产品是用go写的
很新,生态不完善
完美契合当下高并发的互联网生态
语法简单,速度快
云计算和区块链的火,互联网企业高并发的需求
开发环境搭建
-goland(jetbrains全家桶),vscode
-推荐用goland,pycharm,idea,androidstudio
go version
-goland 创建项目,选择go的安装路径(默认)
-gopath:所有的go代码必须放在这个路径下的src文件夹下,否则无法执行,默认创建到用户家目录下的go文件夹(mac,windows,linux)
-创建项目路径,go文件都不要出现中文
go 命令
go env
-GO111MODULE=空的,没有使用MODULE模式
-GOPATH=C:\Users\home\go
-GOROOT=c:\go
go build
go run
go get
go version
go fmt
helloword
package main
import "fmt"
func main () {
fmt.Println("hello world" )
}
go build s1.go
s1.exe
go run s1.go
print
printf
println
注释
//单行注释
/*
多行注释
多行注释
*/
变量
package main
import "fmt"
func main () {
var age int =10
fmt.Println(age)
var age =10
age=100
var name ="lqz"
fmt.Println(age)
fmt.Print(name)
fmt.Printf("%T\n" ,age)
fmt.Printf("%T" ,name)
fmt.Printf("%p" ,&name)
a:=10
a := 99
a=99
fmt.Println(a)
var age int
var age
var width, height int = 100 , 50
var width,height =100 ,50
var width,height =100 ,"lqz"
width,height :=100 ,";qz"
var (
name = "naveen"
age int = 29
height int
)
fmt.Println(name,age,height)
var a int =10
b,a:=99 ,100
fmt.Println(b)
fmt.Print(a)
}
变量定义规范
数据类型
Java中数据类型对应:
常量
package main
import "fmt"
func main () {
const age int8 = 99
age=199
fmt.Println(age)
const age = 99
age=88
fmt.Println(age)
const name,age = "zhangsan" ,99
const (
name string ="lqz"
age =99
)
const (
s1 = iota
s2 = iota
s3
s4 = 99
s5 = iota
)
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(s3)
fmt.Println(s4)
fmt.Println(s5)
const (
s1 = iota
s2 = iota
s3
s4 = 99
s5
s6
)
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(s3)
fmt.Println(s4)
fmt.Println(s5)
}
函数概念
package main
import "fmt"
//给类型命别名
type MyFunc func(a,b int )(int ,string)
type Myint int
func main() {
var a int =10
var b Myint=9
fmt.Println(a+int (b))
//定义方式
/*
func 名字(参数名 类型,参数名 类型)(返回值类型,返回值类型){
函数体内容
return 返回值1 ,返回值2
}
*/
//1 调用函数
add(2 ,3 ,"xxx" )
var a int =add(2 ,3 )
a := add(2 , 3 )
fmt.Println(a)
//多返回值就需要用多变量接收
a,b:=add(3 ,4 )
fmt.Println(a,b)
//多返回值,忽略一个返回值
a,_:=add(3 ,4 )
fmt.Println(a)
fmt.Println(_)
//匿名函数(定义在函数内部的函数,不能是有名函数),头等函数
var a func()
a = func (){
fmt.Println("我是匿名函数" )
}
a()
//函数返回值是函数
a:=test()
fmt.Println(a) // 函数内存地址
a()
//8 函数返回值为函数,返回的函数带参数
a:=test()
a("xxx" )
//9 函数返回值为函数,返回的函数带参数,带返回值
var a func(a,b int )int
a=test()
fmt.Println(a(2 ,3 ))
//10 函数参数为函数类型,返回值为带参数,带返回值的函数类型
a,b:=test(func() {
fmt.Println("我是函数参数" )
})(3 ,4 )
f:= func() {
fmt.Println("我是函数参数" )
}
f1:=test(f)
a,b:=f1(3 ,4 )
fmt.Println(a,b)
//闭包函数的使用
a:=test(19 )
////a是闭包函数
a()
//装饰器是闭包函数的典型应用(go中没有装饰器的语法糖),通过闭包实现装饰器
//类型重命名
var a MyFunc =test()
c,d:=a(1 ,2 )
fmt.Println(c,d)
}
//1 有参数无返回值(定义函数)
func add(a int ,b int ) {
fmt.Println(a+b)
}
//2 有参数无返回值,有多个相同类型参数
func add(a ,b int ) {
fmt.Println(a+b)
}
//3 有参数无返回值,有多个相同类型参数,也有不同类型
func add(a ,b int ,msg string) {
fmt.Println(a+b)
fmt.Print(msg)
}
//4 多个参数,一个返回值
func add(a, b int ) int {
return a + b
}
//5 多个参数,多个返回值
func add(a, b int ) (int ,int ) {
return a + b,a*b
}
//6 命名返回值
func add(a, b int ) (c int ,d int ) {
c=a+b
d=a*b
//return 时,不需要再写c,d了
return
}
//7 函数是一等公民,函数可以赋值给变量
//8 函数返回值为函数
func test() func() {
return func() {
fmt.Println("我是返回函数" )
}
}
/9 函数返回值为函数,返回的函数带参数
// 类型只要有不一样的地方,就不是一个类型
func test() func(msg string) {
return func(msg string) {
fmt.Println(msg)
}
}
//10 函数返回值为函数,返回的函数带参数,带返回值
func test() func(a,b int ) int {
return func(a,b int ) int {
return a+b
}
}
//11 函数参数为函数类型,返回值为带参数,带返回值的函数类型
func test(f func()) func(a,b int ) (int ,int ){
return func(a,b int ) (int ,int ) {
f()
return a+b,a*b
}
}
//12 闭包函数:1 定义在函数内部 2 对外部作用域有引用
// 闭包函数就是多了一种函数传参的方法,包进去了(内存逃逸)
func test(age int ) func() {
a:= func() {
fmt.Println(age)
}
return a
}
//13 Myfunc 为类型别名
func test() MyFunc {
return func(a,b int )(int ,string) {
fmt.Println("xxx" )
return 10 ,"ok"
}
}
变量作用域范围
package main
import "fmt"
var a int
func main () {
fmt.Println(a)
a=19
fmt.Println(a)
test1()
fmt.Println(a)
}
func test1 () {
a=99
fmt.Println(a)
}
var a int
func main () {
var a int
fmt.Println(a)
a=19
fmt.Println(a)
test1()
fmt.Println(a)
}
func test1 () {
fmt.Println(a)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现