Golang(二)基本概念

类型

  • 18个基本类型:bool、string、rune、byte、int、uint、int8、uint、int8、int16、uint16、int32、uint32、int64、uint64、float64、complex64、complex128
  • 7个复合类型:array、struct、function、interface、slice、map、channel
  • 其中,slice、map 和 channel 都是引用类型
  • 最后,还有一种无符号的整数类型 uintptr,没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程是才需要,特别是 Go 语言和 C 语言函数库或操作系统接口相交互的地方

值传递和引用传递

  • 在golang中函数的参数默认为按值传递,即在函数内部修改传入参数的值是函数外部传入值的深拷贝
  • 如果想要使用引用传递,需要将传入的参数设置为指针类型。如果传入的参数数据很大,建议使用指针类型,减少内存因拷贝参数而占用
  • 本质上指针作为入参也是值传递,go里面其实都是值传递,只是指针一般比原始参数小很多,拷贝代价更低,也方便在不同函数间修改同一个变量

枚举

  • 在go语言中,没有直接支持枚举的关键字,也就造成go没有直接枚举的功能。但是go提供另一种方法来实现枚举,那就是 const+iota

// 实现枚举例子

type State int

// iota 初始化后会自动递增
const (
    Running State = iota // value --> 0
    Stopped              // value --> 1
    Rebooting            // value --> 2
    Terminated           // value --> 3
)

func (this State) String() string {
    switch this {
    case Running:
        return "Running"
    case Stopped:
        return "Stopped"
    default:
        return "Unknow"
    }
}

func main() {
    state := Stopped
    fmt.Println("state", state)
}
// 输出 state Running
// 没有重载String函数的情况下则输出 state 0

切片与函数参数

  • 上述已经提过,slice 本身为引用类型,作为参数会将指针的值作为参数以值传递方式传递进函数内部
  • 此时函数内部会产生另一个底层数组相同的切片。修改相应位置的值,函数外的切片对应的值也会随之改变。但是执行 append 操作时因为是两个切片,函数外的 len 值不会改变
  • 不断 append,直到超过 cap 时,底层数组会改变(尺寸变大一倍)。此时修改某一位置的值,函数外的切片不会体现
  • 示例代码如下:

package main

import "fmt"

func testSliceParams(strs []string, msg string) {
    fmt.Printf("WangAo test: strs----2: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    tmp := strs[0]
    strs[0] = msg
    fmt.Printf("WangAo test: strs----3: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----4: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs[0] = tmp
    fmt.Printf("WangAo test: strs----5: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----6: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----7: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----8: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----9: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    tmp = strs[0]
    strs[0] = msg
    fmt.Printf("WangAo test: strs---10: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
}

func main()  {
    strs := make([]string, 0, 3)
    strs = append(strs, "test1")
    fmt.Printf("WangAo test: strs----1: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    testSliceParams(strs, "test2")
    fmt.Printf("WangAo test: strs---11: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)

}

原文地址:https://www.cnblogs.com/wangao1236/p/10898950.html

时间: 2024-11-02 13:15:10

Golang(二)基本概念的相关文章

C/C++调用Golang 二

C/C++调用Golang 二 <C/C++调用Golang 一>简单介绍了C/C++调用Golang的方法步骤,只涉及一个简单的函数调用.本文总结具体项目中的使用场景,将介绍三种较复杂的调用方式:一,C++向golang传入复杂结构体:二,C++向golang传入回调函数,在golang中调用C++函数:三,C++调用golang函数,返回复杂的结构体. (本文后面涉及三个例子,省略了编译步骤,仅展示关键代码.具体操作步骤参考<C/C++调用Golang 一>) 一 C++向go

实时计算Samza中文教程(二)——概念

希望上一篇背景篇让大家对流式计算有了宏观的认识,本篇根据官网是介绍概念,先让我们看看有哪些东西呢? 概念一:Streams Samza是处理流的.流则是由一系列不可变的一种相似类型的消息组成.举个例子,一个流可能是在一个网站上的所有点击,或者更新到一个特定数据库表的更新操作,或者是被一个服务或者事件数据生成所有日志信息.消息能够被加到另一个流之后或者从一个流中读取.一个流能有多个消费者,并且从一个流中读取不会删除消息(使得小心能够被广播给所有消费者).另外消息可以有一个关联的key用来做分区,这

2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)

首先祝自己生日快乐~23咯~ 一  autorelease的概念 autorelease会像C语言的自动变量那样来对待对象实例.当超出作用域(相当于变量作用域)时,对象的实例release实力方法被调用. 另外,同C语言的自动变量不同的是,编程人员可以自己设置变量的作用域,即通过autoreleasepool来实现 . 调用对象的autorelease方法,其实就是将对象就近放入一个NSAutoreleasePool中,该对象的生存周期相当于C语言变量的作用域.对于所有调用了autoreleas

从零开始学JavaScript二(基本概念)

基本概念 一.区分大小写 在ECMAScript中的一切(变量.函数名.操作符)都是区分大小写的. 如变量名test和Test分别表示两个不同的变量, 二.标识符 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符按照下列格式规则组合起来的一或者多个字符: 第一个字符必须为一个字母.下划线(_).或者一个美元符号($); 其它字符可以是字母.下划线.美元符号或数字. ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写,例如:firstSe

PowerDesigner教程系列(二)概念数据模型

目标:本文主要介绍PowerDesigner概念数据模型以及实体.属性创建.一.新建概念数据模型1)选择File-->New,弹出如图所示对话框,选择CDM模型(即概念数据模型)建立模型. 2)完成概念数据模型的创建.以下图示,对当前的工作空间进行简单介绍.(以后再更详细说明) 3)选择新增的CDM模型,右击,在弹出的菜单中选择“Properties”属性项,弹出如图所示对话框.在“General”标签里可以输入所建模型的名称.代码.描述.创建者.版本以及默认的图表等等信息.在“Notes”标签

Twitter Storm学习之二-基本概念介绍

2.1 Storm基本概念 在运行一个Storm任务之前,需要了解一些概念: Topologies Streams Spouts Bolts Stream groupings Reliability Tasks Workers Configuration Storm集群和Hadoop集群表面上看很类似.但是Hadoop上运行的是MapReduce jobs,而在Storm上运行的是拓扑(topology),这两者之间是非常不一样的.一个关键的区别是: 一个MapReduce job最终会结束,

A Tour of Golang (二)

是时候继续总结一波golang使用心得了!码的代码越多了解的go就越多,go处理问题的思路确实不一样 9. defer panic recover defer 接上次的问题继续讨论,先来看下golang blog上怎么说defer A defer statement pushes a function call onto a list. The list of saved calls is executed after the surrounding function returns. Defe

delphi 基础之二 面向对象概念初步

面向对象概念初步 1.类的定义 类的定义分两步:首先在类(单元)的接口(interface)部分说明这个方法.然后在实现部分(implementation)部分编写方法的实现代码. 定义: type 类名=class(父类名) 数据域说明;      //类内部使用变量/常量的声明; 方法说明首部; end; 实现代码: procedure 类名.方法(参数); 实现代码; end; 2.创建对象及对象成员的引用 创建对象分两步: 首先声明对象,语法格式为 var 类名;//此时对象名还只是个指

golang 二维平面求多重遮挡三角形总面积

解决问题描述:二维平面有很多三角形错落,可能会相互叠加落在一起,也可能互相远离.目标求出这些三角形的总占地面积. 我最开始想的解决方案是用总面积-总重叠面积 = 总占地面积.后来实现起来发现当面临多次重叠时,这样算是错误的. 后来参考了一些文献,得出结论:这个问题抽象出来就是求n个集合的并集问题.公式如下: A1∪A2∪......∪An = A1 + A2 + ......+ An ﹣(A1∩A2 + A1∩A3 + ......+ A[n-1]∩An) + (A1∩A2∩A3 + A1∩A2

golang 二维切片

初始化: res := make([][length]int, length), 例如: res := make([][2]int, 10) fmt.Println(res) 输出: [[0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0]] 或者 a := [][]float64{ {1, 2, 3, 4}, {12, 21, 3, 14}, {1, 1, 2, 3}, {2, 3, 1, 6}, {2, 2, 3, 3}, {1