GO 类型

变量

GO变量总是有固定的数值类型,类型决定了变量内存的长度和存储格式。我们只能修改变量,无法改变类型

编译后的机器码从不使用变量名,而是直接通过内存地址访问目标数据

定义

关键字 var 用于定义变量

var x int	//自动初始化为0
var y = false	//自动推断为bool类型
var x,y int

多变量赋值

var x,s = 100,"abc"
var x,y = y+3,x+2

首先计算出所有右值,然后赋值

建议以组的方式定义变量

var(
  x , y int
  a , b = 100 ,'abc'
)

简短模式

x := 100
a,b := 1,'abc'

简短模式限制:

定义变量,同时显示初始化

不能提供数据类型

只能用在函数内部

例:

package main 

var x = 100	//全局变量

func main(){
  println(&x,x)
  
  x:="abc"	//重新定义和初始化同名局部变量
  println(&x,x)

}
输出
0x49a018 100	//对比内存地址
0xc420039f68 abc

简短模式也可以退化赋值(变量内存地址不发生改变)

条件:最少有一个新变量被定义,且必须是同一作用域

编译器将未使用局部变量当作错误

命名

以字母或下划线开始,由多个字母,数字,下划线组成

空标识符

“_” 通常作为忽略占位符使用,无法读取其内容

常量 const

const x,y int = 123,0x22
const c = '哦'

常量定义 右值不能超出常量类型取值范围,否则会溢出

常量可以是某些编译器能计算出结果的表达式

常量组不知定类型和初始值,则与上一行非空常量右值相同

const(
  x  uint16 = 120
  y
  s = "abc"
  z
)

枚举

借助iota 标识符实现一组自增常量

const(
  x = iota //0
  y	//1
  z	//2
)
const(
  _,_ = iota,iota * 10	//0, 0*10
  a,b	//1, 1*10 
  c,d	//2, 2*10
)

中断iotaz自增

const(
  a = iota	//0
  b	//1
  c = 100 //100
  d	//100
  e = iota	//4 恢复iota自增
  f	//5
)

自增默认数据类型 int 可显示指定类型

建议用自定义类型实现用途明确的枚举类型。但不能将取值范围限定在预定义的枚举内

数字常量不会分配存储空间。

基本类型

长度

bool	    
byte             uint8
int,uint         32或64 依据平台
int8,uint8       -128~127,0~255
int16,uint16     -32768~32767,0~65535
int32,uint32     -21亿~21亿,0~42亿
int64,uint64    
float32	        
float64
complex64
complex128
rune             Unicode Code Point,int32
uintptr          足以存储指针的uint
string
array            数组
struct           结构体
function         函数
interface        接口
map              字典
slice            切片
channel          通道

标准库math  定义了各种数字类型的取值范围

标准库strconv 可在不同进制(字符串)间转换

例:

package main

import "strconv"

func main(){
  a,_:=strconv.ParseInt("1100100",2,32)
  println (a)
  println("0b" + strconv.FormatInt(a,2))
}
输出
100
0b1100100

别名:

byte   alias for uint8
rune   alias for int32

引用类型:特指 slice,map,channel

内置函数 new按指定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式

new 为引用分配内存,但创建不完整。

引用类型必须使用make函数创建

例:

package main

func mkslice() []int{
  s := make([]int,0,10)
  s = append(s,100)
  return s
}
func mkmap() map[string]int {
  m := make(map[string]int)
  m["a"] = 1
  return m
}
func main(){
  m := mkmap()
  println(m["a"])
  
  s := mkslice()
  println(s[0])

}
输出:
1
100

类型转换

除常量,别名类型以及未命名类型

GO强制要求使用显式类型转换

混合类型表达式必须确保类型一致

不能将非bool类型结果当作 true/false

如果转换目标是指针,单向通道或没有返回值的函数类型,那么必须使用括号

用括号,让编译器将*int解析为指针类型

(*int)(p)	*(int(p))
(<-chan int)(c)	<-(chan int(c))
(func())(x)	func() x

自定义类型

使用type定义用户自定义类型

type flags byte

多个type定义可以合并成组

type(
  user struct{
    name string
    age uint8
  }
  event func(string) bool
)

自定义类型只表明有相同的底层数据结构,属完全不同的两种类型

不会继承基础类型的其他信息(包括方法)不能视作别名,不能隐式转换,不能直接用于比较表达式

例:

type data int
var d data = 10
var x int = d //错误

未命名类型

数组,切片,字典,通道灯类型与具体元素类型或长度等属性有关,故称作未未命名类型。也可以用type为其提供具体的名称,将其变为命名类型

具有相同声明的未命名类型称为同一类型

具有相同基类型的 指针

具有相同元素类型和长度的 数组(array)

具有相同元素类型 切片(slice)

具有相同键值类型 字典(map)

具有相同数据类型及操作方向 通道(channel)

具有形同字段序列(字段名,字段类型,标签,以及字段顺序)结构体(struct)

具有相同签名(参数和返回值列表,不包括参数名) 函数(func)

具有相同方法集(方法名,方法签名,不包括顺序) 接口(interface)

例:

var a struct{
  x int 'x'
}
var b struct{
  x int
}
b=a //错误
var a func(int,string)
var b func(string,int)
a=b	//错误  参数顺序也属于签名

未命名类型转换规则

所属类型相同

基础类型相同,且其中一个是未命名类型

数据类型相同,将双向通道赋值給单向通道,且其中一个为未命名类型

将默认值 nil 赋值給切片,字典,通道,指针,函数或接口

对象实现了接口

例:

type data [2]int
var d data = [2]int{1,2}	//基础类型相同,右为未命名类型
a:=make(chan int,2)
var b chan <- int = a	//双向通道转换为单向通道,b为未命名类型

原文地址:http://blog.51cto.com/13558754/2102848

时间: 2024-10-20 14:12:53

GO 类型的相关文章

菜鸟学python之对象类型及运算

Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型. 等号(=)用来给变量赋值. 1 变量赋值 1.1 单个变量赋值 >>> name="python" >>> print(name) python 1.2 多个变量赋值 >>> name=names="python&

JavaScript的进阶之路(三)引用类型之Object类型和Array类型

引用类型 Object类型 function a(num){ if(num>3){ a(--num); } console.log(num); } a(5); //如何创建对象的实例 var obj1= new Object(); console.log(obj1); obj1.name="吴琼"; obj1.age=28; console.log(obj1.name+" "+obj1.age); //对象字面量语法 ,有点封装的感觉 var obj2 = {

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

主键类型定义错了调试了半天

package com.itheima.demo1; import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table; @Entity@Table(name="u_user")public class User

js判断浏览器类型

js判断浏览器类型  <script type="text/javascript" >     <!--   function getOs()   {       var OsObject = "";      if(isIE = navigator.userAgent.indexOf("MSIE")!=-1) {           return "MSIE";      }      if(isFiref

Python的动态类型

动态类型:                                                      在python中,类型是在运行过程中自动决定的,而不是通过代码声明的. 变量:                                                                                     变量是一个系统表的元素,拥有指向对象的连接的空间 python中,类型的概念是存在于对象中的,而不是变量中,变量是通用的. 变量的使用

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全

译:SOS_SCHEDULER_YIELD类型等待在虚拟机环境中的增多

原文出处:Increased SOS_SCHEDULER_YIELD waits on virtual machines 注: 原文的用词是Increased,想译作增强(增长),或者加强,这么译起来是褒义词,而原文要表达的Increased并没有褒义的含义,最起码是一个中性的含义,想来想起用一个“滋长”偏编译的含义还是比较合适的,感觉还是有点过于贬义了,还是用最通俗的增多吧.个人英语水平有限,另外就是对于文中提到的“rdtsc周期”也不是非常清楚,翻译的也不是很清楚,权当是自娱自乐.总是原文的

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?