一、输出hello,world程序

package main;

import "fmt";

func main() {
    fmt.Printf("hello,world");
}

二、定义变量

package main;

import "fmt";

func main() {
    //定义一个类型为int的变量a
    var a int;

    //定义多个类型为int的变量
    var b, c, d int;

    //定义并初始化
    var e int = 0;

    //定义多个变量并初始化
    var f, g, h int = 1, 2, 3;

    //上面简化写法,根据值的类型初始化
    var i, j, k = 4, 5, 6;

    //更简洁的写法
    //但这种方式只能在函数内部使用
    //:=这种操作是先声明再初始化两步操作,你对一个变量两次:=操作会报错
    l := 7;

    //特殊的变量名_,任何赋予它的值都会被丢弃
    _, m := 8, 9;

    fmt.Printf("%d %d %d %d %d %d %d %d %d %d %d %d %d", a, b, c, d, e, f, g, h, i, j, k, l, m);
}

三、定义常量

package main;

import "fmt";

func main() {
    //常量可定义为数值、布尔值或字符串
    const CNT = 1000;
    const PI = 3.14;
    const PRE = "db_";

    fmt.Printf("%d %f %s", CNT, PI, PRE);
}

四、go的基础类型

package main;

import (
    "fmt"
    "errors"
)

func main() {
    //bool类型
    var isRun = false;
    //数值类型

    //有符号整型
    var a int8 = 1;
    var b int16 = 2;
    var c int32 = 3;
    //无符号整型
    var d uint8 = 4;
    var e uint16 = 5;
    var f uint32 = 6;
    //rune是int32的别称,byte是uint8的别称
    var g rune = 7;
    var h byte = 8;
    //不同类型的变量之间不允许互相赋值或操作
    //下面是错误的
    //tmp := a + b;

    //浮点数
    var i float32 = 1.23;
    var j float64 = 2.45;

    //复数
    var k complex64 = 5+5i;
    var l complex128 = 3+3i;

    //字符串
    var str1 string = "hello";
    //go中字符串是否可改变的,下面是错误的
    //str1[0] = 'w';

    //如果要改变字符串,需要先转成[]byte类型,修改后再转string
    tmp := []byte(str1);
    tmp[0] = 'w';
    str1 = string(tmp);

    //通过+进行字符串连接
    str2 := "hello";
    str3 := str2 + ",go";

    //错误类型
    err := errors.New("我是个错误");
    if err != nil {
        fmt.Print(err);
    }

    fmt.Printf("%t\n", isRun);
    fmt.Printf("%d %d %d %d %d %d %d %d\n", a, b, c, d, e, f, g, h);
    fmt.Printf("%f %f\n", i, j);
    fmt.Printf("%v %v\n", k, l);
    fmt.Printf("%s\n", str1);
    fmt.Printf("%s\n", str3);
}

五、分组声明

package main;

import (
    "fmt"
);

func main() {
    //分组定义类型
    type {
        F64 float64;
        STR string;
    };
    //分组定义常量
    const (
        PI = 3.14;
        CNT = 1000;
        PRE = "db_";
    );
    //分组声明变量
    var (
        i int;
        pi float32;
        pre string;
    );
    //iota枚举
    const (
        a = iota;
        b = iota;
        c = iota;
    );
    //每遇到一个const关键字,iota就会重置
    const d = iota;

    fmt.Printf("%d %d %d %d", a, b, c, d);
}

六、array、slice、map

package main;

import (
    "fmt"
);

func main() {
    //声明数组,5表示数组长度,int表示存储的元素类型
    var arr [5]int;
    //下标从0开始
    arr[0] = 5;
    arr[1] = 6;

    //长度也是数组类型的一部分,[4]int与[5]int是不同类型
    //数组不能改变长度,数组之间的赋值是值的赋值,而不是指针
    
    //声明并初始化
    a := [3]int{1, 2, 3};
    b := [5]int{4, 5, 6};
    //会自动计算长度
    c := [...]int{7, 8, 9};
    //多维数组,二行二列
    d := [2][2]int{[2]int{1, 2}, [2]int{3, 4}};
    e := [2][2]int{{1, 2}, {3, 4}};

    //slice并不是真正意义上的动态数组,而是一个引用类型
    //slice总是指向一个底层array
    //slice的声明类似array,只是不需要长度
    var f []int;
    g := []byte{'a', 'b', 'c'};
    //slice可以从一个数组或一个已经存在的slice中再次声明
    var h []byte = g[1:3];

    //数组和slice声明的不同
    //声明数组时,方括号内写明了数组的长度或使用...自动计算长度
    //声明slice时,方括号内没有任何字符

    var i = [6]int{1, 2, 3, 4, 5, 6};
    //声明初始化两个slice
    var j []int = i[2:5];
    var k []int = i[1:6];
    //slice是引用类型,改变j中的内容,i和k的内容也会变
    j[0] = 9;

    //map类型的声明,key是字符串,值是int
    //这种方式会创建一个nil map,所以在使用时必须用make初始化。
    var m map[string]int;
    m = make(map[string]int);

    //另一种声明方式
    n := make(map[string]int);

    //声明并初始化
    l := map[string]int {"age":30, "height":192}

    m["age"] = 25;
    m["height"] = 172;

    n["age"] = 25;
    n["height"] = 186;

    //map是无序的,长度不固定,引用类型
    //判断key是否存在
    //map有两个返回值,第二值表示key是否存在
    val, exist := m["height"];
    if exist {
        fmt.Print(val);
    }

    fmt.Printf("%v\n%v\n%v\n%v\n%v\n", a, b, c, d, e);
    fmt.Printf("%v\n%v\n%v\n", f, g, h);
    fmt.Printf("%v\n%v\n%v\n", i, j, k);
    fmt.Printf("%v\n%v\n%v\n", m, n, l);
}

七、make、new操作

make用于内建类型(map、slice和channel)的内存分配。new用于各种类型的内存分配。

new返回指针
make返回初始化后的(非零)值,不是指针。

posted on 2017-04-26 14:42  怀素真  阅读(432)  评论(0编辑  收藏  举报