Nivelle 开拓视野冲破艰险看见世界 身临其境贴近彼此感受生活

go学习第二篇(数据类型)

2018-08-31
go

go 语法结构认识

package main

定义了包名,每个可独立执行的go程序都包含一个名为main的包

import "fmt"

表示需要引入的工具包,在当前程序中可以直接使用函数fmt的功能

-


 func main(){}
 

是当前可执行程序的入口

fmt 

格式化输出函数


注意:

当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

标识符第一个字母必须是字母或下划线不能是数字或者关键字,或者运算符。

数据类型

  • 布尔型
  • 数字型
  • 字符串
  • 派生类型

类型学习 DEMO:


package main

import "fmt"

type User struct {
	name string
	age  int
}

type Person struct {
	User // 默认会具有User的各种属性
	sex  int
}

// 多变量声明
var x, y int // 多个类型相同的变量

var ( // 这种只能出现在全局变量中,函数体内不支持
	a int
	b bool
)

var c, d int = 1, 2

var e, f = 123, "hello"

func main() {
	fmt.Println("类型强转")

	i1 := 1 // “:=”简洁赋值语句,可以不用var。但是在函数外的每个语句都必须用关键字开头(var func ),“:=”不能用在函数之外。
	var f1 float32
	f1 = float32(i1)

	fmt.Printf("print:%f", f1)

	fmt.Println()

	p1 := Person{User{"nivelle", 27}, 1}

	fmt.Println(p1.User)

	fmt.Println(p1.name, p1.sex)

	var compareResult int // 变量的声明必须使用空格隔开

	compareResult = compare(1, 2)

	fmt.Printf("compare result is %d", compareResult)

	fmt.Println()

	array1 := []int{1, 2, 3, 4}

	fmt.Println(array1)

	var a = "nivelle is learning go" // 根据变量的值自动判断类型
	var b string = "go is nice"      // 指名类型和值
	var c bool                       // 指定变量类型,声明后若不赋值,使用默认值。
	fmt.Println(a, b, c)

	g, h := 123, "go world"

	println(x, y, a, b, c, d, e, f, g, h)

}

func compare(a int, b int) int {
	if a > b {
		return 1
	} else if a == b {
		return 0
	} else {
		return 2
	}
}


结果:

类型强转
print:1.000000
{nivelle 27}
nivelle 1
compare result is 2
[1 2 3 4]
nivelle is learning go go is nice false
0 0 nivelle is learning go go is nice false 2 123 hello 123 go world

值类型和引用类型

int,float,bool,string 属于基本类型,使用这些类型的变量直接指向内存在内存中的值。

一个引用类型的变量存储的是变量值所在的内存地址,或内存地址中第一个字所在的位置。

空白标识符_ 能用于抛弃值,如值5 在: , b = 5,7 中被抛弃。 其实是一个只写变量,你不能得到它的值。这样做是因为go 语言汇总你必须使用所有被申明的变量,但有时候你并不需要使用从一个函数得到的所有返回值。

go 语言常量定义

常量中的数据类型只能是布尔,数字(整数,浮点型和复数)和字符串型。

//const identifier [type] = value

package main

import "fmt"

const (
	d      = "fuck java"
	e      = 321
	f bool = true
)

func main() {
	const LENGTH int = 10
	const WIDTH int = 5
	var area int

	const a, b, c = 1, false, "str"

	area = LENGTH * WIDTH

	fmt.Printf("area:%d", area)

	println()

	println(a, b, c)

	println()

	println(d, e, f)

}


结果:

area:50
1 false str

fuck java 321 true


控制语句

  • for循环
  • 嵌套循环
  • break
  • continue
  • goto
package main

import "fmt"

func main() {
	var b int = 15
	var a int

	numbers := [6]int{1, 2, 3, 5}

	for a := 0; a < 10; a++ {
		fmt.Printf("a的值为:%d\n", a)
	}

	for a < b {
		a++
		fmt.Printf("a的值为: %d\n", a)
	}

	for i, x := range numbers {
		fmt.Printf("数组第%d位x的值=%d\n", i, x)
	}
}



结果:

a的值为:0
a的值为:1
a的值为:2
a的值为:3
a的值为:4
a的值为:5
a的值为:6
a的值为:7
a的值为:8
a的值为:9
a的值为: 1
a的值为: 2
a的值为: 3
a的值为: 4
a的值为: 5
a的值为: 6
a的值为: 7
a的值为: 8
a的值为: 9
a的值为: 10
a的值为: 11
a的值为: 12
a的值为: 13
a的值为: 14
a的值为: 15
数组第0位x的值=1
数组第1位x的值=2
数组第2位x的值=3
数组第3位x的值=5
数组第4位x的值=0
数组第5位x的值=0


package main

import "fmt"

func main() {
	/* 定义局部变量 */
	var a int = 10

	/* 循环 */
LOOP:
	for a < 20 {
		if a == 15 {
			/* 跳过迭代 */
			a = a + 1
			goto LOOP
		}
		fmt.Printf("a的值为 : %d\n", a)
		a++
	}
}


结果:

a的值为 : 10
a的值为 : 11
a的值为 : 12
a的值为 : 13
a的值为 : 14
a的值为 : 16
a的值为 : 17
a的值为 : 18
a的值为 : 19

注意:运行过程中报了如下错误:

./Hello.go:5:6: main redeclared in this block

原因:同一个目录下面不能有个多 package main


评论