Go基本概念

编码

  • Go默认支持UTF-8编码

声明变量

  • var vname1, vname2, vname3 type
  • var vname1, vname2, vname3 type = v1, v2, v3
  • var vname1, vname2, vname3 = v1, v2, v3
  • vname1, vname2, vname3 := v1, v2, v3
  • var c complex64 = 5+5i

常量

  • const Pi float32 = 3.1415926
  • const MaxThread = 10
  • const prefix = "astaxie_"

变量类型

  • boolean
    bool
  • Numerical
    rune, int8, int16, int32, int64, byte, uint8, uint16, uint32, uint64
    rune == int32, byte == uint8
    float32, float64
    complex64
  • String
s := "hello"
m := `hello
        world`

注:string是不能直接修改的,若想修改可以这样

s := "hello"
c := []byte(s)  // convert string to []byte type
c[0] = 'c'
s2 := string(c)  // convert back to string type
fmt.Printf("%s\n", s2)
  • Error
err := errors.New("dfsdsfs sdlfk")
if err != nil {
    fmt.Println(err)
}

iota enumerate

这个是为了生成 enum 值,起始于0,按1递增

const (
    x = iota   //  x == 0
    y = iota   //  y == 1
    z = iota   //  z == 2
    w            //  w == 3
)
const v = iota  //  v == 0

潜规则

Go 里没有 public private 关键字,首字母大写的变量、方法、常量都可以被被外部引用,否则就小写

数组,切片,映射

数组

var arr [n]type
var arr [10]int
a := [3]int{1, 2, 3}
c := [...]int{4, 5, 6}
doubleArray := [2][4]int{[4]int{1,2,3,4}, [4]{5,6,7,8}}
easyArray := [2][4]int{{1,2,3,4},{5,6,7,8}}

切片

切片和数组的区别是切片长度可变,也就是不指定数组长度。事实上,切片是引用类型。
var fslice []int
slice := []byte{'a', 'b', 'c', 'd'}

切片有 length(len) 和 capability(cap) 两个概念,一个是切片长度,一个是切片总容量
注:

  • append操作将改变原先的 slice,所以其他指向该数组的 slices 都会被影响。
  • 但是,如果原先的 slice没有空间了(cap-len==0),那么append将返回一个新的数组,指向原先数组的slices将不被影响。

映射

映射就类似Python里的字典,定义方式是: map[keyType] valueType

var numbers map[string] int
numbers := make(map[string]int)
numbers["one"] = 1

rating := map[string]float32 {"C": 5, "Go": 4.5, "Python": 4.5}
csharpRating, ok := rating["C#"]

delete(rating, "C")

映射是无序的,它也是引用类型,没有固定长度。

make, new

make 是为slice,map,channel这三个类型分配内存空间的,返回的也是对应的类型。此外make也会进行初始化,所以它返回的肯定不是空值。
new也是用来分配空间的,但是返回的是指针。new不仅针对slice,map,channel这三个类型。

package main
import "fmt"
func main() {
    var s1 = make([]int, 0)
    var s2 []int
    fmt.Println(s1 == nil)  // false
    fmt.Println(s2 == nil)  // true
}

控制语句

if

if integer == 3 {
    fmt.Println("The integer is equal to 3")
} else if integer < 3 {
    fmt.Println("The integer is less than 3")
} else {
    fmt.Println("The integer is greater than 3")
}

goto

func myFunc() {
    i := 0
Here:   // label ends with ":"
    fmt.Println(i)
    i++
    goto Here   // jump to label "Here"
}

for

func main(){
    sum := 0;
    for index:=0; index < 10 ; index++ {
        sum += index
    }
    fmt.Println("sum is equal to ", sum)
}
sum := 1
for sum < 1000 {
    sum += sum
}

for 也有 break,continue这样的关键字

for k,v := range map {
    fmt.Println("map's key:",k)
    fmt.Println("map's val:",v)
}

switch

i := 10
switch i {
case 1:
    fmt.Println("i is equal to 1")
case 2, 3, 4:
    fmt.Println("i is equal to 2, 3 or 4")
case 10:
    fmt.Println("i is equal to 10")
default:
    fmt.Println("All I know is that i is an integer")
}
integer := 6
switch integer {
case 4:
    fmt.Println("integer <= 4")
    fallthrough
case 5:
    fmt.Println("integer <= 5")
    fallthrough
case 6:
    fmt.Println("integer <= 6")
    fallthrough
case 7:
    fmt.Println("integer <= 7")
    fallthrough
case 8:
    fmt.Println("integer <= 8")
    fallthrough
default:
    fmt.Println("default case")
}

fallthrough会使得switch在按顺序查到匹配的case后,继续匹配下去

function

func SumAndProduct(A, B int) (int, int) {
    return A + B, A * B
}
func SumAndProduct(A, B int) (add int, multiplied int) {
    add = A+B
    multiplied = A*B
    return
}

variadic functions

func myfunc(arg ...int) {
    for _, n := range arg {
        fmt.Println(n)
    }
}

pass by pointers

package main
import "fmt"
// simple function to add 1 to a
func add1(a *int) int {
    *a = *a + 1 // we changed value of a
    return *a   // return new value of a
}
func main() {
    x := 3
    fmt.Println("x = ", x) // should print "x = 3"
    x1 := add1(&x) // call add1(&x) pass memory address of x
    fmt.Println("x+1 = ", x1) // should print "x+1 = 4"
    fmt.Println("x = ", x)    // should print "x = 4"
}

defer

for i := 0; i < 5; i++ {
    defer fmt.Printf("%d ", i)
}

panic and recover

func throwsPanic(f func()) (b bool) {
    defer func() {
        if x := recover(); x != nil {
            b = true
        }
    }()
    f() // if f causes panic, it will recover
    return
}

main and init functions

main 只能有一个,init可以有多个,但也只推荐一个package一个init
这俩方法都会被自动调用.


Go_init_flow.png

import

  1. Dot operator
import (
    . "fmt"
)

这样可以省略包名,直接调用里面的函数:
fmt.Println("...") => Println("...")

  1. alias operation
import (
    f "fmt"
)

fmt.Println("...") => f.Println("...")

  1. _ operator
import (
    _ "github.com/zzz"
)

只执行 zzz 里的init函数,不引入该包中的其他变量或函数

struct

1、 simple struct

type person struct {
    name string
    age int
}

P := person{"Tom", 25}     // 顺序要和定义的一致
Q := person{age: 24, name: "Bob"}  // 可以无序
R := struct{name string; age int}{"Amy", 18}  // 匿名struct

2、 embedded fields in struct

package main

import "fmt"

type Human struct {
    name   string
    age    int
    weight int
}

type Student struct {
    Human     // embedded field, it means Student struct includes all fields that Human has.
    specialty string
}

func main() {
    // instantiate and initialize a student
    mark := Student{Human{"Mark", 25, 120}, "Computer Science"}

    // access fields
    fmt.Println("His name is ", mark.name)
    fmt.Println("His age is ", mark.age)
    fmt.Println("His weight is ", mark.weight)
    fmt.Println("His specialty is ", mark.specialty)

    // modify mark's specialty
    mark.specialty = "AI"
    fmt.Println("Mark changed his specialty")
    fmt.Println("His specialty is ", mark.specialty)

    fmt.Println("Mark become old. He is not an athlete anymore")
    mark.age = 46
    mark.weight += 60
    fmt.Println("His age is", mark.age)
    fmt.Println("His weight is", mark.weight)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Hello World这是开发的一个开发魔咒,几乎所有人都是从这开始的,今天我也从魔咒开始先打印一份Hello W...
    cocoaAhda阅读 1,429评论 0 3
  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
    皮皮v阅读 1,089评论 0 3
  • 01.{ 换行: Opening Brace Can't Be Placed on a Separate Lin...
    码农不器阅读 2,393评论 0 14
  • 出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...
    Tuberose阅读 18,396评论 1 46
  • 关于成长的问题,我觉得都是大问题,需要认真想想,到底是否弄清楚了自己想要的是什么,对自己当下来说最重要的是什么,然...
    随意咖啡阅读 290评论 0 0