当前位置:网站首页>Go语言初始
Go语言初始
2022-08-02 14:01:00 【意大利面拌42号混凝土】
Go语言初始
一、go语言介绍和发展
# 好多公司:python+go混用,架构师---》前端,运维,测试,后端各种语言
# Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言--》12年
# 真正发展也就6,7年时间,很新,云原生的火--docker,k8s
# Go上有些坑----》一直在发展---》泛型
# python 1989年 java 1990年
# Go是静态强类型语言,是区别于解析型语言的编译型语言(静态:类型固定 强类型:不同类型不允许直接运算)
# go最大的好处:跨平台编译---》mac写的代码--》编译完了--》发给你女朋友,直接可以运行,部署简单
# php部署---》php解释器---》模块---》运行起来
# python部署----》解释器--》装模块---》运行起来
# java部署---》字节码文件---》运行在jvm(java虚拟机)---》装jdk--》运行起来
# go部署---》可执行文件----》运行即可
# 跨平台的编译型语言
-python,php,nodejs天然跨平台---》解释器--》运行在解释器上---》解释器跨平台
-java号称跨平台----》java字节码运行在虚拟机上---》在不同平台装虚拟机
-c,c++ 不支持跨平台,需要在不同平台编译成可执行文件再执行
-go 跨平台编译--》可以在win上编译成linux可执行文件
# 支持面向对象
# 区块链,云原生
-第一开源的区块链代码用go写的
二、go语言开发环境搭建
# 开发需要装
# python解释器 pycharm IDE集成开发工具
# go sdk goland IDE集成开发工具 ---》jetbrains全家桶
# 下载:https://golang.google.cn/dl/ ----》1.17.x--》一路下一步--》自动把安装路径加入到环境变量
# 在命令行下敲
go version #看到输出就ok了
# goland和Golang:
三、第一个helloworld
package main // 每个go文件必须属于某一个包
import "fmt" //导入包fmt
func main() {
// main函数
fmt.Println("hello world")
}
// go 是编译型语言---》先编译---》再执行
// go build s1.go---->s1.exe
// 执行可执行文件 s1.exe
// go run s1.exe 编译并运行(编译到哪里去了?用完就删了)
// go要运行,必须是main包下的main函数---》入口
/*
go build 编译
go run 编译并运行
交叉编译
*/
// win 编译出不同平台可执行
// Mac
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build filename.go
// Linux
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build filename.go
// go env go的环境变量
GO111MODULE= // 新版本默认都是开启的,是否开启go module模式
GOPROXY=https://goproxy.cn,direct // 下载go 模块的地址
GOROOT=D:\Program Files\Go // go的安装路径,必须对,如果不对会有问题
GOPATH=C:\Users\oldboy\go // 如果使用go path模式,所有代码必须放在这个文件夹的bin路径下
// 在代码中 import "fmt",从哪导入的fmt---》就是从go root路径下
//可能会有第三方包,使用go path模式,导入路径就从go path的bin路径下开始算
四、命名规范
# go文件名的命名规范:尽量用下划线方式 python用下划线
# go的变量命名规范:推荐用驼峰 python用下划线
# 关键字和保留字不能作为变量名
// 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
// go语言中有37个保留字,主要对应内建的常量、类型和函数
内建常量: true false iota nil
内建类型: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
内建函数: make len cap new append copy close delete
complex real imag
panic recover
//goto python中没有 java中作为了保留关键字,但是没有作用 go,c都有goto,
五、变量
package main
import "fmt"
func main() {
//1 变量的完整定义
//var关键字 变量名 变量类型 = 变量值
//var name string ="lqz" // 变量定义了必须使用,如果不使用就报错
//fmt.Println(name)
//2 类型推导 不写类型了,并不是没有类型,推导出来的
//var name ="lqz"
//fmt.Println(name)
//3 简略声明 :跟=是一家 类型也固定
//name := "lqz"
//fmt.Println(name)
//4 go语言的变量类型一旦确定,不能更改
//age := 19 // 就是int类型
//age="lqz" // 不能这么用
// 5 变量要先定义,在使用,不能重复定义
//var age int // 定义
//age=99 //赋初值
//fmt.Println(age) // 使用
//var age=99
//age:=99
//fmt.Println(age)
// 6 同时定义多个变量
//var name ="lqz"
//var age =99
//var hobby="篮球"
//var name,age,hobby string,int,string="lqz",99,"篮球" //这个不行
var (
name string="lqz"
age=99
hobby string="篮球"
)
//var name,age,hobby="lqz",99,"篮球"
// name,age,hobby :="lqz",99,"篮球"
//var width, height int = 100, 50 // 可以
fmt.Println(name)
fmt.Println(age)
fmt.Println(hobby)
}
六、Python和Go语言混编
1 、动态链接库(dll,so文件)
Linux下的动态库以.so 结尾
Windows下的动态库以.dll结尾
2 、Go语言打包成动态链接库文件(dll,so)
2.1 windows下
golang 编译 dll 过程中需要用到 gcc,所以先安装 MinGW。
windows 64 位系统应下载地址为: https://sourceforge.net/projects/mingw-w64/
下载后运行 mingw-w64-install.exe,完成 MingGW 的安装
2.2 mac,Linux下
自带gcc,无需任何安装
2.3 编写Go代码
package main
import "C" //必须引入C库
import "fmt"
//加入下面注释代码,表示导出,可以被python调用
//export PrintDll
func PrintDll() {
fmt.Println("我来自dll")
}
//export Sum
func Sum(a int, b int) int {
return a + b
}
func main() {
//必须加一个main函数,作为CGO编译的入口,无具体实现代码
}
注意:
1 注释 //export PrintBye 和 //export Sum 在编译 动态库(dll ,so)的时候是必须的,说明了 动态库 需要输出的函数
2 main函数必须写,没有执行代码,作为CGO编译的入口
3 必须引入C库(import “C”
2.4 编译成so库
go build -buildmode=c-shared -o s1.so s1.go
2.4 编译成dll库
go build -buildmode=c-shared -o s1.so s1.go
注意:
1 -o表示输出,s1.so 表示编译成so文件的名字,s1.go表示编译哪个go文件
2 “-s -w” 选项用于减小生成动态链接库的体积,-s 是压缩,-w 是去掉调试信息
go build -ldflags “-s -w” -o main.dll -buildmode=c-shared s1.go
3 编译模式buildmode
模式 | 说明 |
archive | 编译成二进制文件。一般是静态库文件。 xx.a |
c-archive | 编译成C归档文件。C可调用的静态库。xx.a。注意要编译成此类文件需要import C 并且要 外部调用的函数要使用 “//export 函数名” 的方式在函数上方注释。否则函数默认不会被导出。 |
c-shared | 编译成C共享库。同样需要 import “C” 和在函数上方注释 // export xxx |
default | 对于有main包的直接编译成可执行文件。没有main包的,编译成.a文件 |
编译成window可执行程序 | |
plugin | 将main包和依赖的包一起编译成go plugin。非main包忽略。【类似C的共享库或静态库。插件式开发使用 |
3、使用python语言来调用
from ctypes import cdll
lib = cdll.LoadLibrary('./s1.so')
# 调用go语言的Sum
result = lib.Sum(100, 200)
print(result)
# 调用go语言的PrintDll
lib.PrintDll()
边栏推荐
猜你喜欢
随机推荐
WiFi Association & Omnipeek Packet Capture Analysis
智能指针-使用、避坑和实现
Sentinel源码(六)ParamFlowSlot热点参数限流
ttl电平与rs232电平转换电路(232电平定义)
网络安全第四次作业
一维卷积神经网络_卷积神经网络的基础知识「建议收藏」
如何选择正规的期货交易平台开户?
ftp常用命令详解_iftop命令详解
Interviewer: Can you talk about optimistic locking and pessimistic locking?
Flutter 实现光影变换的立体旋转效果
Large and comprehensive pom file example
政策利空对行情没有长期影响,牛市仍将继续 2021-05-19
The most complete ever!A collection of 47 common terms of "digital transformation", read it in seconds~
Geoffery Hinton:深度学习的下一个大事件
The future of financial services will never stop, and the bull market will continue 2021-05-28
【ONE·Data || Getting Started with Sorting】
deal!It's July 30th!
存储过程详解
C# 编译错误:Compiler Error CS1044
网络安全第二次作业