首页 > 其他分享 >Go

Go

时间:2023-04-25 16:12:54浏览次数:27  
标签:name int fmt var func Go main

Go语言

Go语言介绍

​ 全称Golang,是Google公司2009年11月对外公布的一门编程语言
静态强类型(静态:类型固定 强类型:不同类型不允许直接运算)
属于 编译型语言 源代码编译成机器语言,由机器直接执行机器码即可执行。

python是解释型语言,想要编译成可执行文件需要借助于 pipinstaller

https://zhuanlan.zhihu.com/p/430490285

python代码防泄漏方案

1.启动起来后删除源代码
2.使用pipinstaller,打包成可执行文件
3. 做到docker镜像中,运行容器需要进行授权码校验。即-e PASSWORD

Go语言特性

​ 1. 跨平台的编译型语言

​ 2. 语法接近c语言

​ 3. 管道(channel),切片(slice),并发(routine)

​ 4. 支持面向对象和面向过程编程模式

Go语言发展

2015年8月19日 go1.5 —— 实现的架构变化,同时保留了和旧版本的兼容性,本次更新中移除了”最后残余的C代码”---》以后再写go不用c写了,用go写---》语言的自举
2018年8月24日 go1.11 —— modules和WebAssembly支持  go mod模式  包管理
最新 1.20版

Go语言应用程序

​ 像k8s,docker,七牛都是Go语言编写的

环境搭建

1.下载go的sdk(开发环境)

https://golang.google.cn/dl/
    下载msi文件

2.下载编辑器 goland ,vscode

https://www.jetbrains.com.cn/go/download/other.html

先安装环境在安装编辑器,一路下一步

hello world

package main // package 声明 这个go文件属于哪个包
import (
	"fmt" // fmt.Println 会自动导入这个 goland做的
	"time"
)

func main() {
	fmt.Println("hello world")
	time.Sleep(10 * time.Second)
}

// 编译代码成可执行文件,在哪个平台就默认编译成当前平台的

// 命令行执行go build 文件名.go 就可以生成可执行文件

变量名命名规范

​ Go语言中的函数名、变量名、常量名、类型名和包名等所有的命名,都遵循一个简单的命名规则

  1. 一个名字必须用字母开头或下划线开头,后面可以跟着任意数量的数字字母
  2. 大写字母与小写字母有不同的含义。
  3. 关键字和保留字不能作为变量名

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

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

建议定义变量,函数名使用:用驼峰

go文件命名:建议用下划线

变量的定义和使用

package main

import "fmt"

// 变量定义
func main() {
	// 1.完整定义var关键字 变量名 变量类型 = 变量值
	//var name string = "lxj" // string  必须用双引号
	//var age int = 19        // 数字

	// 2. 类型推导,根据值自动推导出变量类型
	//var name = "lxj"
	//name = "pyy"      // 只能更改成同一类型

	// 3.简略声明 必须使用:= 不能分家
	//name := "lqz"

	// 4.一次性声明多个变量
	// 完整定义 1
	//var name, age, hobby string = "坤", "21", "唱跳rap打篮球"  // 问题是只能指定一个类型
	// 完整定义多个变量 2
	//var (
	//	name  string = "爱坤"
	//	age   int    = 19
	//	hobby string = "唱跳Rap打篮球"
	//)

	// 5.类型推导 1
	//var name, age, hobby = "坤", 19, "唱跳rap打篮球"
	// 方法  2
	//var (
	//	name  = "爱坤"
	//	age   = 19
	//	hobby = "唱跳Rap打篮球"
	//)

	// 6.简略声明
	//name, age, hobby := "坤", 19, "唱跳rap打篮球"

	// 7.完整定义和类型推导混合使用
	//var (
	//	name      = "坤"
	//	age   int = 19
	//	hobby     = "唱跳rap打篮球"
	//)

	// 8 变量名不能重复定义
	//var name = "坤"
	//var name = "lxj"  // 报错 重复定义
	//name := "lxj"     // 报错没有新变量在左侧

	// 9 变量可以先定义在赋值,必须使用完整定义反射
	//var name string // 默认值空字符串
	//var age int     // 默认值0
	//
	//age = 19               // 可以后面在赋值

	//fmt.Println(name, age) // 定义了变量必须用,不用会报错
	// 10,查看变量类型
	a := 19
	fmt.Printf("a的值是:%v,类型是:%T", a, a) // printf可以打印出变量的值和类型

}

变量类型

数字

# 整数有正负
int8    int16   int32	 int64
"rune 是 int32的别名"

# 正整数
uint8   uint16  uint(32位系统是32,64位系统是64)
"byte 是uint8的别名"

# 浮点型
float32   float64  # 小数后面范围不一样

# 复数类型
complex64  complex128
  • int8:-128 ~ 127
  • int16:-32768 ~ 32767
  • int32:-2147483648 ~ 2147483647
  • int64:-9223372036854775808 ~ 9223372036854775807

字符

# string 
双引号包裹不能换行, 反引号可以回车换行
"go 用单引号包裹字符,会返回对应的ASCII码"

布尔类型

true 
false

常量

定义常量

func main() {
	//1 .定义常量
	const name string = "lxj"
	const username = "nxm"
	println(name, username)
}

常量与变量的作用范围

在内部可以重新定义变量的

package main
var name string = "lxj"
func main() {
	// 内部没有用外部的
	//name := "pyy"   // 内部有优先用内部的
	println(name)
}

内置常量iota

想要使用必须用const 关键字,他的作用是自增

func main() {
	const (
		a = iota // 0
		b        // 1
		c        // 2
		d        // 3
	)
	println(a, b, c, d)
}

===================================================================
func main() {
	const (
		a = 10   // 10
		b = iota // 1   iota在哪一行 就从那一行开始自增
		c        // 2
		d        // 3
	)
	println(a, b, c, d)
}

iota 后续的行都会自增,不需要在+iota

函数

基础用法

普通函数
func main() {
	test()

}
func test() {
	fmt.Println("我是普通函数")
}

有参函数

func main() {
	test(1, "1")

}
// 必须指定参数的类型
func test(a int, b string) {
	fmt.Println(a, b)
}
===================================================================
func main() {
	test(1, 10, "ss")

}
// 多个参数相同类型可以简写
func test(a, c int, b string) {
	fmt.Println(a, b, c)
}

有返回值的有参函数
func main() {
	res := test(1, 10)
	fmt.Println(res)
}
// 需要在test(a, b int) 后面指定返回值的类型
func test(a, b int) int {
	return a + b
}
===================================================================
// 多个参数多个返回值
func main() {
	res, res1 := test(1, 10, "成功")
	fmt.Println(res, res1)
}

func test(a, b int, c string) (int, string) {
	return a + b, c
}

高级用法

同一个包下的变量函数只能定义一次,用了同样的名字会报错

匿名函数,一般定义在其他函数的内部

package main

import "fmt"

func main() {
	test()
}
func test() {
	func() {
		fmt.Println("我是内部的匿名函数")
	}() // 需要加括号调用,不然报错
}

定义变量接收函数,匿名函数带参数

package main

import "fmt"

func main() {
	test1()
}
func test() {
	//f := func() {
	//	fmt.Println("我是内部的匿名函数")
	//} // 报错需要指定f的类型
	var f func() = func() {
		fmt.Println("我是内部的匿名函数")
	}
	fmt.Printf("%T", f) // 打印出来是func() 类型,可以自定义
}

func test1() {
	var f func() = func() {
		fmt.Println("内层函数")
	}
	// func(a int) 也可以不写 函数的参数和返回值都是类型的一部分(如果写类型也要写参数)
	var f1 func(a int) = func(a int) {
		fmt.Println(a)
	}
	var f2 func(b int) int = func(b int) int {
		fmt.Println(b)
		return b + 10
	}

	var f3 func(b int) string = func(b int) string {
		fmt.Println(b)
		return "我是你爹"
	}
	fmt.Printf("%T\n", f)  // 打印出来是func()
	fmt.Printf("%T\n", f1) // 打印出来是func(int)
	fmt.Printf("%T\n", f2) // 打印出来是func(int) int
	fmt.Printf("%T\n", f3) // 打印出来是func(int) string
	f3(1)

}

可以简写:
f3  := func(b int) string {
		fmt.Println(b)
		return "我是你爹"
	}

函数作为返回值

func main() {
	res := test2()
	fmt.Printf("%T", res)
}

func test2() func() {
	return func() {
		fmt.Println("我是内层函数")
	}
}

调用函数返回闭包函数 (闭包函数内用到了外部作用域的变量)

func main() {
	res := test2()
	res()  // 取决于闭包函数有没有参数,有就要传
	fmt.Printf("%T", res)
}

func test2() func() {
	a := 10
	f := func() {
		fmt.Println(a)
	}
	return f
}

标签:name,int,fmt,var,func,Go,main
From: https://www.cnblogs.com/LiaJi/p/17352917.html

相关文章

  • Google浏览器 查看http版本是1.1还是2.0
    1、打开网页2、F12进入开发者模式3、找到请求4、找到请求头5、找到ResPonseHeather点击Viewparsed......
  • Django(五)
    Django(五)request对象#GETPOSTFILESmethodpathpath_infoget_full_path()bodydefindex(request):print(request.path)#/index/print(request.path_info)#/index/print(request.get_full_path_info())#接收路径的全部内容连参数也能拿到pr......
  • Django 如何使用 Celery 完成异步任务或定时任务
    以前版本的Celery需要一个单独的库(django-celery)才能与Django一起工作,但从Celery3.1开始,情况便不再如此,我们可以直接通过Celery库来完成在Django中的任务。安装Redis服务端以Docker安装为例,安装一个密码为mypassword的Redis服务端dockerrun-itd--name......
  • Go-day2——go语言变量类型、常量、函数基础、函数高级
    目录一、go语言变量类型二、常量三、函数基础四、函数高级五、作业一、go语言变量类型#数字#int整数有正负int8int16int32int64 java byteshortintlong -int8一个字节表示(8个比特位)范围:-2的7次方到+2的7次方-1-int162个字节表......
  • [译]Golang template 小抄
    [译]Golangtemplate小抄目录[−]解析和创建模板命名模板创建模板解析多个模板解析字符串模板执行模板执行简单模板执行命名的模板模板编码和HTML上下文编码安全字符串和HTML注释模板变量.字符模板中的变量模板动作if/else语句移除空格Range......
  • go 枚举
    前言枚举类型是一种常用的数据类型,用于表示一组有限的、预定义的、具名的常量值。在枚举类型中,每个常量都是一个枚举值,它们之间的值相等且唯一。枚举类型通常用于表示一组相关的常量,比如星期、月份、性别等等。在其他语言里(比如 Java 和 C),都内置了枚举类型,而在 Go 语言里是......
  • go 环境搭建
     安装包下载安装包下载地址(下面3个都可以):国外官方:https://golang.org/dl/中文镜像:https://golang.google.cn/dl/中文网站:https://studygolang.com/dl(推荐)以选择直接安装版本(.msi)或者压缩包版本(.zip) windos编辑器:VSCode(免费) 或GoLand(收费) ......
  • Go | 一分钟掌握Go | 6 - 指针
     作者:Mars酱 声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我!前言go的指针相比c++里面的已经容易很多了。c++的指针定义太多了:空指针、野指针、常量指针、指针常量,还有结构体指针,c++在指针这一块就复杂很多。我理解的Go的指针我理......
  • Python Django 制作商品列表展示
    新建名为goods应用pythonmanage.pystartappgoods修改chapter1/settings.py文件在INSTALLED_APPS数组中添加goods在对象TEMPLATES.OPTIONS中添加django.template.context_processors.media添加三个常量MEDIA_URL='/media/'MEDIA_ROOT=os.path.join(BASE......
  • Go 使用 MongoDB 实现分页查询
    解决过程CSDN中搜到一个有Bug的代码import( "context" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options")funcFind(database*mongo.Databas......