体验go语言的风骚式编程

区星
• 阅读 2399

最近想搞搞后台开发,话说注意力就转移到了公司用的golang。用Go做微服务比较方便,或许是因为golang强悍的语法吧,看到go的语法,自己已被深深的吸引。

来我们一起感受下Go的风骚式的代码风格。

1、魔鬼式变量声明

体验go语言的风骚式编程

2、数组的声明

体验go语言的风骚式编程

array就是数组,它的定义方式如下:

var arr [n]type

在[n]type中,n表示数组的长度,type表示存储元素的类型。对数组的操作和其它语言类似,都是通过[]来进行 读取或赋值:

var arr [10]int  // 声明了一个int类型的数组 
arr[0] = 42      // 数组下标是从0开始的 
arr[1] = 13      // 赋值操作 
fmt.Printf("The first element is %d\n", arr[0])  // 获取数据,返回42 
fmt.Printf("The last element is %d\n", arr[9]) //返回未赋值的最后一个元素,默认返回0 

由于长度也是数组类型的一部分,因此[3]int与[4]int是不同的类型,数组也就不能改变长度。数组之间的赋值是 值的赋值,即当把一个数组作为参数传入函数的时候,传入的其实是该数组的副本,而不是它的指针。如果要使用指 针,那么就需要用到后面介绍的slice类型了。

数组可以使用另一种:=来声明

a := [3]int{1, 2, 3} // 声明了一个长度为3的int数组 
b := [10]int{1, 2, 3} // 声明了一个长度为10的int数组,其中前三个元素初始化为1、2、3,其它默认为0 
c := [...]int{4, 5, 6} // 可以省略长度而采用`...`的方式,Go会自动根据元素个数来计算长度

3、 go语言强大的slice操作

golang 中的 slice 非常强大,让数组操作非常方便高效。在开发中不定长度表示的数组全部都是 slice 。但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果就是在实际开发中碰到很多坑,以至于出现一些莫名奇妙的问题,数组中的数据丢失了
slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptrslice 的长度 len 和容量 cap

体验go语言的风骚式编程

体验go语言的风骚式编程

其中 len 和 cap 就是我们在调用 len(slice) 和 cap(slice) 返回的值。

我们来按照 slice 的数据结构定义来解析出 ptr, len, cap

// 按照上图定义的数据结构

type Slice struct {
    ptr   unsafe.Pointer        // Array pointer
    len   int               // slice length
    cap     int               // slice capacity

示例代码

体验go语言的风骚式编程

4、map的声明

注意由于go语言是一个强类型的语言,因此hashmap也是有类型的,具体体现在key和value都必须指定类型,比如声明一个key为string,value也是string的map,
需要这样做

体验go语言的风骚式编程

go语言中的枚举
体验go语言的风骚式编程

5、for循环的遍历

func formapTest() {
    var arrayi= [...] int{1, 2, 3, 4, 5, 6, 7, 78, 9, 10}
    for index, c := range arrayi {
        fmt.Printf("array[%d] = %d", index, c)
    }

    str := "go语言的学习和啪啪"
    for i, ch := range str {
        fmt.Println(i, ch) //ch的类型为rune unicode编码
    }
    //输出为:28907  (Unicode编码时,两个字节代表一个字符)

    n := len(str)
    for i := 0; i < n; i++ {
        ch := str[i] // 依据下标取字符串中的字符,类型为byte
        fmt.Println(i, ch)
        //输出为utf-8编码,一个汉字字符占三个字节
    }

    array := []rune(str)
    n = len(array)
    for i := 0; i < n; i++ {
        ch := array[i]     // 依据下标取字符串中的字符,类型为byte
         fmt.Println(i, ch) //unicode 编码转十进制输出
        //golang中字符类型的实际数据类型为uint32,以for循环遍历的方式输出结果都是Unicode编码的
    }
    //var str string= "yyh,hello,卡卡论坛,好厉害哦"
    //fmt.Print(str)
    fmt.Print("\n================================\n")
    for i , ch :=  range str{
        //fmt.Printf("(%d, %c)",i,ch)
        fmt.Printf("(%d, %x)",i,ch)
    }

    fmt.Print(utf8.RuneCountInString(str))
    fmt.Print("================================\n")
    bytes := [] byte(str)

    //for len(bytes) > 0 {
        r, size := utf8.DecodeRune(bytes)
        fmt.Printf("%c  %d",r,size)
    //}
    fmt.Println()
    fmt.Println()
    fmt.Println()
    for i,c := range bytes{

        r,_ :=utf8.DecodeRune(bytes)
        fmt.Printf("%d  %c %x \n",i,r,c)
    }
    for i ,ch := range []rune(str){
        fmt.Printf("%d: %c  ",i,ch)
    }

    str2 := "123 我按时 的发ad fg票 是否 adfg 发 发生a f发 的sj df"
    sps   := strings.Split(str2," ")
    sps = strings.Fields(str2)
    var isContact  =  strings.Contains(str2,"你们")
    fmt.Println(sps)
    fmt.Println(isContact)
}

6、 golang中的结构体和继承

体验go语言的风骚式编程

7、 golang中的接口

体验go语言的风骚式编程

8、 golang中的空interface

类似于java中的object,空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface。空interface对于
描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值。它有点类似于C语言的void*类型。

体验go语言的风骚式编程

一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也
就可以返回任意类型的值。是不是很有用啊!

9、结构体中可以定义字段,但接口不行

structs与interfaces不能具有相同的API,因为interfaces无法定义字段。这个问题并算很大,因为可以在接口中定义getter和setter方法,虽然这有点混乱。 eg:

体验go语言的风骚式编程

10、Public和Private命名

Golang将Python的public和private方法命名方案做了进一步发展。当我最初发现以大写字母开头的函数、结构体是public,而小写开头的则是private的时候, 感觉不可思议,但我很享受这种语法。

type PublicStructName struct {} //public 外部能调用
type privateStructName struct {} // 私有 结构体,仅内部函数能调用

最后

今天就先到这里,golang语法很多,这里只是其中的冰山一角。如果大家想学习golang,我这里推荐:https://github.com/Unknwon/th...

阅读更多

31道Android面试题 ,牢固你的基础!

做后台是选择Java 、Go ,还是 PHP?

AndroidUtils:Android开发不得不收藏的Utils

美团面试题:Java-线程池 ThreadPool 专题详解

相信自己,没有做不到的,只有想不到的

在这里获得的不仅仅是技术!

体验go语言的风骚式编程

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
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
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
区星
区星
Lv1
如来者,无所从来,亦无所去,故名如来。
文章
5
粉丝
0
获赞
0