go学习(一)变量、常量

Wesley13
• 阅读 669

emm,发觉自己没有系统的学习。都是有需求来临时调研技术,从今天起每天抽出时间系统化学习Go.

类型

Go是静态类型语言,运行期间不能改变类型

定义

  1. 可以使用var 关键字
  2. 可以使用 := 让系统推导类型

example:

var a int
a := 0
是一致的

但是要注意一点

var a int 
f := func () {
    a:=1 //此时是局部变量(没进行参数传递)
}
f()
此时a的值不会变

更灵活的语法:

var x , y ,z int
x,y,z := 1,float64(12313),"dassad" //动态类型推导,不建议这么写,增加阅读难度

特殊占位符 _

_用于将结果忽略的位置

func test() (int, string) {
   return 1, "abc"
}
func main() {
   _, s := test()
   println(s)
}

代码块定义

代码块内有新的变量生命周期

s := "abc"
println(&s)

s, y := "hello", 20 // 重新赋值: 与前 s 在同⼀层次的代码块中,且有新的变量被定义。
println(&s, y) // 通常函数多返回值 err 会被重复使⽤。

{
    s, z := 1000, 30 // 定义新同名变量: 不在同⼀层次代码块。
    println(&s, z)
}

基本类型

类型

长度

默认值

说明

bool

1

false

byte

1

0

uint8 之间可以相互转换

rune

4

0

unicode code point,int32

int/uint

4或者8

0

32位长度4 64位长度8

int8/uint8

1

0

-128127, 0255

int16/uint16

2

0

-3276832767,065535

int32/uint32

4或者8

0

32位长度4 64位长度8, 21亿正负

int64/uint64

8

0

complex64

8

0

复数类型

complex128

16

0

复数类型

array

值类型

struct

值类型

string

""

值类型

slice

4或者8

nil

引用类型

map

4或者8

nil

引用类型

channel

4或者8

nil

引用类型

interface

nil

接口类型

function

nil

函数类型

new 和 make对引用类型的区别

引⽤类型包括 slice、map 和 channel。它们有复杂的内部结构,除了申请内存外,还需 要初始化相关属性。

new会计算引用类型大小,并为其分配初始值(默认值),并返回指针

make会被编译期编译为具体创建函数,分配内存和初始化成员结构,返回对象而非指针

a:=[]int{0,0,0}
a[1] = 10
b := make([]int, 3) 
b[1] = 10 

c:=new([]int) //指针,但是只有头指针,可以append,但是不能直接使用
c[1]=10

常量

golang的常量只支持编译器可确定的类型。(数字、字符串、布尔)

不能定义在方法体内部

常量值还可以是 len、cap、unsafe.Sizeof 等编译期可确定结果的函数返回值。

重点: 编译期可确定的值(因为常量是不可写的,要在编译期确定结果,放入常量内存区域)

枚举

关键字 iota 定义常量组中从 0 开始按⾏计数的⾃增枚举值。

每一个const内iota都会从0开始

const (
 Sunday = iota // 0
 Monday // 1,通常省略后续⾏表达式。
 Tuesday // 2
 Wednesday // 3
 Thursday // 4
 Friday // 5
 Saturday // 6
)

const (
 Sunday1 = iota // 0
 Monday1 // 1,通常省略后续⾏表达式。
 Tuesday1 // 2
 Wednesday1 // 3
 Thursday1 // 4
 Friday1 // 5
 Saturday1 // 6
)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Easter79 Easter79
3年前
Swift解读专题二——基本类型
Swift解读专题二——基本类型一、常量和变量        Swift语言的常量和变量在使用之前,必须被定义。常量用于处理程序中只在初始化时设置的量值,之后不能进行赋值改变,变量用于处理程序中可以进行改变的量值。分别用let和var来声明常量和变量,示例如下:var varValue  1
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
go基础语法
1.常量定义用const关键字修饰常量名并赋值,常量命名不同于java等语言,golang中一般用小写,因为在golang中首字母大写表示public权限consta32.常量使用使用数值常量进行运算时不需要进行强制类型转换,编译器会自动识别consta,b3,4va
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_