笔记仅于自己复习
函数里的知识内容如下
- base1()//变量、输入、打印
- base2()//条件、循环、函数
- base3()//数组、字典、结构体、类
最下面main函数可查看对应base函数输出的值
package main
import (
"fmt"
"math/rand"
"time"
)
//import . "fmt"//导入所有包
//import otherName "fmt"//取别名
//import _ "fmt"//忽略此包
//变量、输入、打印
func base1() {
//一个文件夹只能有一个main
a := 78//临时变量
a += 800
var b, c int //初始值为0
var d int = 100
e, f, g := 2, 5, 8
f, g = g, f
const h string = "this_is_const_h"
var (
i int = 45
j string = "this_is_j"
)
const (
//iota在const自动自动增长,如果是同一行,值都一样
k = iota //0
m = iota //1
)
o := 3 + 4i
/*
类型:bool(true,false)、byte、rune(4,储存unicode码,可储存中文字符)、
int、uint、complex64/128(复数类型)、uintptr(4,指针类型)
*/
n := '中'
fmt.Printf("a=%d,c=%d\n\a", a, c)
//%T操作变量所属类型
// %v自动匹配格式输出
fmt.Println(a, "556", b, c, d, e, f, g, h[1:3], i, j, n, o)
fmt.Println(real(o), imag(o)) //复数的实部虚部
var sa string
fmt.Scanf("%s", &sa)
println(sa)
fmt.Scan(&sa)
println(sa)
fmt.Printf("%d", int('a')) //类型转换
//bool不可以转int
type newName int
}
//多返回值,匿名返回
func f3() (int, int, int) {
return 1, 2, 5
}
func f2(a ...int) (result int) {
//两种返回
result = 7
return 2
}
//e为不定参数
func f1(a, b int, c, d string, e ...int) int {
f2(e...) //e里的所有值都传入f2
f2(e[4:]...)
return 1
}
//条件、循环、函数
func base2() {
var a = 10
//if语句写法1
if a == 12 {
} else {
}
//if语句写法2
//第一个为赋值,第二个为条件
if a = 10; a == 10 {
}
//第一个初始化,第二个条件
switch a = 4; a {
case 1: //默认不写break
fallthrough //执行下面的
case 2:
fallthrough //执行下面的
case 3, 4, 5:
default:
}
//for1
for i := 0; i < 100; i++ {
}
//for2
str := "hello"
for i, s := range str {
fmt.Printf("【i=%v,s=%v】", i, s)
}
//for3
for i := range str {
fmt.Printf("【i=%v,s=%v】", i, str[i])
}
//for3默认为true
for {
break
}
goto laber1
laber1:
//函数类型
type TF1 func() (int, int, int)
var tf TF1
tf = f3
tf()
tf()
tf()
tf() //tf内的变量依然存在,不会被释放(可用来做自增)
func() (int, int) { return 1, 2 }() //匿名函数并调用
var ff2 = func() {}
ff2()
defer println("在函数结束前调用defer") //多个defer,先进后出,堆
println("序号1")
}
type char byte
func (c char) disp() { //绑定函数
fmt.Printf("%c", c)
}
//接口
type api interface {
//只有声明,没有实现
apiFunc()
}
type mint int
//接口绑定,只针对自定义数据类型
func (c char) apiFunc() {
fmt.Print(c)
}
func (i mint) apiFunc() {
fmt.Print(i)
}
type person struct {
Name string
age int
}
//多重继承,嵌套多个结构体
type person2 struct {
person //匿名继承
int
}
func (p *person) GetAge() int { return p.age }
func (p *person) SetAge(age int) { p.age = age }
// NewPerson 构造函数
func NewPerson(name string) *person { return &person{Name: name} }
//数组、字典、结构体、类
func base3() {
var a = [40]int{8, 5, 9, 6, 15: -1, 20: -89} //部分初始化:下标:值
b := [20][30]int{
{1, 2, 5},
5: {1, 2, 4, 8: -55},
}
fmt.Println(a)
fmt.Println(b)
//var b[n]int//不能用n
for i := range a {
a[i] = i
}
c := [5]int{1, 2, 3}
d := [5]int{1, 0, 3}
fmt.Println(c == d, c != d) //false true
//随机数
rand.Seed(time.Now().UnixNano()) //设置种子
fmt.Println(rand.Intn(100))
var e = []int{1, 2, 3, 4, 5}
f := []int{1, 2, 3, 4, 5}
g := e[1:3:4] //内容[1,3)容量3
h := make([]int, 5, 10) //len=5,cap=10,5个0
fmt.Println(e, f, g)
fmt.Println(len(g), cap(g)) //2 3
h = append(h, 4)
fmt.Println(h) //[0 0 0 0 0 4]
copy(g, h) //h->g
m1 := map[byte]string{
'a': "hello",
'b': "world",
}
m1['c'] = "C++"
fmt.Println(m1)
for key, val := range m1 {
fmt.Println(key, val)
}
val, ok := m1['d'] //是否存在键
fmt.Println(val, ok)
delete(m1, 'c')
//首字母大写结构体(类)是public,小写private,属性方法也一样
type ST1 struct {
v1 string
v2 int
next *ST1
}
var st1 = ST1{"444", 8, new(ST1)}
var st2 = &ST1{v1: "444", v2: 8}
fmt.Println(st1, st2, st1.v2, st2.v1, (*st2).v1) //st2.v1与(*st2).v1等价
fmt.Println(st1 == *st2, st1 != *st2) //false true
var st3 ST1
st3 = st1
fmt.Println(st3)
type ST2 struct {
v2 int
ST1 //继承ST1中的属性
v3 int
}
st21 := ST2{500, ST1{"sss", 44, new(ST1)}, 40}
st21.v1 = "hello struck"
st21.ST1 = ST1{"hej", 78, new(ST1)}
st21.ST1.v2 = 45
fmt.Printf("%+v", st21)
ch1 := char('a')
ch1.disp() //方法绑定
cf := ch1.disp //方法值
cf()
cf1 := (*char).disp //方法表达式1
cf1(&ch1)
cf2 := char.disp //方法表达式2
cf2(ch1)
var aa [4]interface{}
aa[1] = 1234
aa[2] = "asdfg"
aa[3] = [5]int{1, 2, 5, 85}
fmt.Println("\n\naa>>>", aa)
var bb int
bb = aa[1].(int) //断言,aa[]是空接口类型,不能直接赋值给bb,需要断言
fmt.Println(bb)
{
a := NewPerson("hello")
a.SetAge(58)
var b person2
b.person = *a
b.int = 10 //直接访问匿名字段
fmt.Println(a)
fmt.Println(b)
}
}
func base4() {
}
func main() {
//base1()//变量、输入、打印
//base2()//条件、循环、函数
//base3()//数组、字典、结构体、类
base4()
}