golang基础学习

一、输出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,d,e,f,h,i,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",h);
    fmt.Printf("%f %f\n",j);
    fmt.Printf("%v %v\n",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",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,3};
    b := [5]int{4,6};
    //会自动计算长度
    c := [...]int{7,8,9};
    //多维数组,二行二列
    d := [2][2]int{[2]int{1,2},[2]int{3,4}};
    e := [2][2]int{{1,{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,3,4,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",e);
    fmt.Printf("%v\n%v\n%v\n",h);
    fmt.Printf("%v\n%v\n%v\n",k);
    fmt.Printf("%v\n%v\n%v\n",m,n,l);
}

七、make、new操作

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“怎么以正确的方式替换Go语言程序自身”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希
本文小编为大家详细介绍“Go语言中除法运算的效率怎么提高”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中除法运算的效率怎么提高”文章能帮助大家解...
本文小编为大家详细介绍“Go语言中的next()方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中的next()方法怎么使用”文章能帮助大家解决疑...
这篇文章主要介绍了Go语言中slice的反转方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中slice的反转方法怎...
这篇文章主要介绍“怎么使用Go语言实现数据转发功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Go语
这篇文章主要讲解了“Go语言中怎么实现代码跳转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究
这篇文章主要讲解了“Go语言如何多开协程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言如何多开协...