Golang学习笔记(二):类型、变量、常量_Golang

基本类型

1.基本类型列表

复制代码 代码如下:

类型        长度     说明
bool         1      true/false,默认false, 不能把非0值当做true(不用数字代表true/false)
byte         1      uint8 别名
rune         4      int32别名。 代表一个unicode code point
int/unit            一来所运行的平台,32bit/64bit
int8/uint8   1     -128 ~ 127; 0 ~ 255
int16/uint16 2     -32768 ~ 32767; 0 ~ 65535
int32/uint32 4     -21亿 ~ 21亿, 0 ~ 42亿
int64/uint64 8

float32      4     精确到7位小数,相当于c的float
float64      8     精确到15位小数,相当于c的double

complex64    8
complex128   16

uintptr            足够保存指针的32位、64位整数,指针(可以存指针的整数型)
array              值类型,数组
struct             值类型,结构体
string             值类型,字符串类型,常用
slice              引用类型,切片
map                引用类型,字典
channel            引用类型,通道
interface          接口类型,接口
function           函数类型,函数

2.类型转换

不支持隐式类型转换,必须进行显式类型转换

转换只发生在两种互相兼容的类型之间: 各类int不允许相互赋值或操作,不然会在编译时报错

复制代码 代码如下:

<type>(expression)

示例

复制代码 代码如下:

package main
import "fmt"

func main(){
    a := 0x1234
    b := 1234.56
    c := 256

    fmt.Printf("%x\n", uint8(a))
    fmt.Printf("%d\n", int(b))
    fmt.Printf("%f\n", float64(c))
}

结果

复制代码 代码如下:

34
1234
256.000000

3.类型别名

复制代码 代码如下:

type t_str string
var b t_str = "a str"

4.类型默认值

声明不赋值,类型零值,非空值,而是声明后的默认值

复制代码 代码如下:

bool: false
integers: 0
floats: 0.0
string: ""
pointers,functions,interfaces,slices,channels,maps: nil

保留字

复制代码 代码如下:

break      case   chan     const        continue
default    defer  else     fallthrough  for
func       go     goto     if           import
interface  map    package  range        return
select     struct switch   type         var

变量

1.变量声明

复制代码 代码如下:

//第一种,指定变量类型,声明后若不赋值,使用默认值
var v_name v_type
v_name = value

//第二种,根据值自行判定变量类型
var v_name = value

//第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误.
v_name := value

e.g.
var a int = 10
var b = 10
c : = 10

示例:

复制代码 代码如下:

package main
var a = 1234
var b string = "hello"
var c bool

func main(){
    println(a, b, c)
}

结果:

复制代码 代码如下:

1234 hello false

2.多变量声明:

复制代码 代码如下:

//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要显示声明类型,自动推断

vname1, vname2, vname3 := v1, v2, v3 //出现在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误

//类型不同多个变量, 全局变量, 局部变量不能使用这种方式
var (
    vname1 v_type1
    vname2 v_type2
)

示例:

复制代码 代码如下:

package main

var x, y int
var (  //这种只能出现在全局变量中,函数体内不支持
    a int
    b bool
)

var c, d int = 1, 2
var e, f = 123, "hello"

//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"

func main(){
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)
}

结果:

复制代码 代码如下:

0 0 0 false 1 2 123 hello 123 hello

注意:

A.多变量赋值时,将先行计算所有左侧变量的值,再进行赋值

复制代码 代码如下:

    i := 0
    i, l[i] = 1, 2
    //get i = 1, l[0] = 2

    sc[0], sc[0] = 1, 2
    //get sc[0] = 2

B.垃圾桶_

复制代码 代码如下:

    func test()(int, string) {
        return 123, "abc"
    }

    a, _ := test()

C.已声明但是没有使用的变量会在编译阶段报错,较Python 更为严格

常量

常量可以是字符,字符串,布尔或数字

常量赋值是编译期的行为

1.常量声明

在编译阶段就能确定下来的值,在运行时无法改变该值
常量可以定义为数值、布尔值或字符串等类型

复制代码 代码如下:

const constantName = value
const Pi float32 = 3.1415926

const c_name [type] = value
const c_name1, c_name2 = value1, value2
const (
    c_name1 = vluae1
    c_name2 = value2
)

=右侧,必须为常量或常量表达式,如果使用到了函数,必须为内置函数(编译期行为)

const i = 10000

说明:

复制代码 代码如下:

A.常量必须是编译期能确定的Number(char/integer/float/complex)、String和bool

B.在定义常量数组时,如果不提供初始化值,则表示与上行常量类型,值,完全相同

    const (
        a = "abc"
        b
    )
    //则 b = "abc"

C.常量可以用len(), cap(), unsafe.Sizeof()常量计算表达式的值.  常量表达式中,函数必须是内置函数,否则编译不过

    package main

    import "unsafe"
    const (
        a = "abc"
        b = len(a)
        c = unsafe.Sizeof(a)
    )

    func main(){
        println(a, b, c)
    }

结果:    abc 3 16

枚举

iota,特殊常量,可以认为是一个可以被编译器修改的常量

在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1

不提供初始值,则表示使用上一行的表达式

1.声明:

iota生成从0开始的自动增长枚举值,意味着,多一个枚举值,iota+=1,无论是否使用

基本语法

复制代码 代码如下:

const (
    a = 1
    b = 2
)

const (
    a = iota //0
    b  //1
    c  //2
)

const (
    _ = iota
    a    //1
    b    //2
)

iota用法

复制代码 代码如下:

func main() {
    const (
            a = iota  //0
            b   //1
            c   //2
            d = "ha"  //独立值,iota += 1
            e    //"ha"   iota += 1
            f = 100    //iota +=1
            g     //100  iota +=1
            h = iota  //7,恢复计数
            i      //8
    )

}

const (
    x = iota // 0
    y = iota // 1
    z = iota // 2
    w //省略,默认和前面一样字面值   w = iota, 即3
)
const v = iota //遇到const关键字,iota重置

注意: 每行的变量数必须一致 const ( A, B = iota, iota C, D E, F )

复制代码 代码如下:

func main() {
    println(A,B,C,D,E,F)
}

//结果: 0 0 1 1 2 2   【各自增长】

运算符

Go运算符全部是从左到右结合的

不支持运算符重载

复制代码 代码如下:

优先级    运算符                        说明
  高   * / % << >> & &^(AND NOT)
       + - ! ^
       == != < <= > >=
       <-                             channel运算符
       &&
  低   ||

在go中,++ --为语句,而非表达式

复制代码 代码如下:

package main

func main(){
    i := 1
    i ++
    println(i)

    b := i
    println(b)

    //syntax error: unexpected ++, expecting semicolon or newline or }
    //c := i++
    //意味着, ++/--不能出现在等号右侧
}

指针

Go保留了指针, *T表示T对应的指针类型

如果包含包名, 则应该是 *.T

代表指针类型的符号 '*' 总是和类型放在一起,而不是紧挨着变量名

同样支持指针的指针**T

1.声明

复制代码 代码如下:

var a, b *int

2.说明

复制代码 代码如下:

操作符&取变量地址,用*透过指针变量间接访问目标对象
默认值是nil,没有NULL常量
不支持指针运算,不支持‘->'预算福,直接'.'选择符操作指针目标对象成员
可以在unsafe.Pointer和任意类型指针间进行转换
可以将unsafe.Pointer转换为uintptr,然后变相做指针运算,uintptr可以转换为整数

3.示例

复制代码 代码如下:

package main
import "fmt"

type User struct {
    Id int
    Name string
}
func main(){
    i := 100
    var p *int = &i  //取地址

    println(*p)   //取值

    up := &User{1, "Jack"}
    up.Id = 100  //直接取只针对想成员
    fmt.Println(up)

    u2 := *up  //拷贝对象
    u2.Name = "Tom"
    fmt.Println(up, u2)
}

4.结果:

复制代码 代码如下:

100
&{100 Jack}
&{100 Jack} {100 Tom}

分组声明

复制代码 代码如下:

import (
    "fmt"
    "os"
)

const (
    i = 100  //首行必须有常量表达式
    pi = 3.1415
)

var (  //全局变量可用,函数体内不支持
    i int
    pi float32
)

时间: 2024-12-31 03:07:57

Golang学习笔记(二):类型、变量、常量_Golang的相关文章

C#学习笔记整理_变量等基础语法(必看篇)_C#教程

C#学习笔记1: 变量的作用域冲突时,调用实例变量:this.a,调用类变量:类名.a 常量总是静态的,必须初始化,一般用全大写格式,声明关键字为const,如const int NUNBE = 10; C#的基本预定义类型内置于.NET Framework结构中(System),object是基类: 整型:System.SByte.System.Int16.System.Int32.System.Int64 有符号的8位.16位.32位.64位分别表示为sbyte.short.int.long

kvm虚拟化学习笔记(二)之linux kvm虚拟机安装

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1289627 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linuxkvm虚拟机安装htt

C#学习笔记(二)

笔记 C#学习笔记(二) write by cash(天下第七)2002.01.20版权所有,翻录不究cashcao@msn.com 选择 我身上携带着精神.信仰.灵魂 思想.欲望.怪癖.邪念.狐臭它们寄生于我身体的家 我必须平等对待我的每一位客人-----------伊沙:<原则> 我的名字是cash,所以我很功利主义:我的星像是Leo,所以我很大男人主义:我的语言是C#,所以我有点儿拿不定主义. /* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇

Bootstrap3学习笔记(二)之排版_javascript技巧

在上篇文章给大家介绍了BootStrap3学习笔记(一)之网格系统 对于标题,Bootstrap已经修改了h1--h6的样式,如果需要副标题,还可以在其中使用small标记 <h1>h1. Bootstrap heading <small>Secondary text</small></h1> <h2>h2. Bootstrap heading <small>Secondary text</small></h2>

Golang学习笔记(三):控制流_Golang

控制结构分为: 条件+选择+循环 IF 1.说明 复制代码 代码如下: 条件表达式没有括号 支持一个初始化表达式(可以是多变量初始化语句) 初始化语句中定义的都是只能在block级别中使用的局部变量,不能在block之外使用 左大括号必须和条件语句在同一行(必须与if/else在同一行) go没有三元运算符 if判断语句条件不需要括号 在判断语句里卖弄允许声明一个变量,其作用域只在逻辑块内,其他地方不起作用 花括号一定存在,且必须与if/else在同一行 2.语法 复制代码 代码如下: //基本

PL/SQL学习笔记(二)

定义并使用变量 PL/SQL有四种类型:标量类型,复合类型,引用类型(reference),LOB(Large Obejct)类型 一.标量类型 最常用的就是标量类型,是指只能存放单个数值的变量,包括数字类型.字符类型.日期类型和布尔类型,每种类型又包含相应的子类型. 常量标量类型如下:   VARCHAR2 (n) , CHAR (n), NUMBER (p,s),DATE, TIMESTAMP , LONG , LONG   RAW ,BOOLEAN,BINARY_INTEGER(仅PL /

Lua学习笔记之类型与值_Lua

基础介绍 Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8种基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字)类型 string(字符串)类型 userdata(自定义类型) function(函数)类型 thread(线程)类型 table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: local iValue = 10

cmake 学习笔记(二)

在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) 字符串列表 A;B;C # 分号分割或空格分隔的值 变量(字符串或字符串列表) set(Foo a b c) 设置变量 Foo command(${Foo}) 等价于 command(a b c) command("${Foo}") 等价于 command("a b c"

MyBatis学习笔记(二)之关联关系_java

今天主要学习的关联关系是一对一关系与一对多关系. 一.一对一关系 还是通过例子来解释说明.(一个妻子对应一个丈夫). 1)数据库信息 create table t_wife( id int primary key auto_increment, wife_name varchar(), fk_husband_id int ); create table t_husband( id int primary key auto_increment, husband_name varchar() );

Hadoop学习笔记二 安装部署

硬件环境 共有3台机器,均使用的FC5系统,Java使用的是jdk1.6.0.IP配置如下: dbrg-1:202.197.18.72 dbrg-2:202.197.18.73 dbrg-3:202.197.18.74 这里有一点需要强调的就是,务必要确保每台机器的主机名和IP地址之间能正确解析. 一个很简单的测试办法就是ping一下主机名,比如在dbrg-1上ping dbrg-2,如果能ping通就OK!若不能正确解析,可以修改/etc/hosts文件,如果该台机器作Namenode用,则需