Go语言初始

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值