go言語入門学習サイト

go言語初心者のために基礎から解説します。

ダブルクオーテーションのありかなしかは何が違う?

かなり基礎だがダブルクオーテーションのありとなしの解説をします。


【結論】

"" で囲むと文字列扱い。

"" で囲まないのは数値型や変数などとして扱いたい時などです。


【理由】

""はダブルクオーテーションと言い値を文字列として扱いたい時に使います。

一方でダブルクオーテーションなしは1や10などの値を数値として扱いたい時や変数として扱う時などになしにします。

【具体例】

s := "ABCDEFG"
s = s + "123"
fmt.Println(s)

ABCDEFG123

ダブルクオーテーションがあれば見た目が数字だとしても文字列扱いとなりこのように文字列同士の結合も可能です。

【結論】

ダブルクオーテーションがあるのは基本的に文字列でそれ以外は数値や変数の扱いである。





TechAcademy [テックアカデミー]


【アイデミー】AIを学んで一発逆転のキャリアチェンジ!



取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com

go言語でポインタを構造体で使用する

go言語で構造体でポインタを扱う事ができます。
その方法をやってみましょう。

【結論】

&vで構造体の値をポインタで返します。

【理由】


package main

import "fmt"

func main() {
// 構造体を定義
type 構造体 struct {

  // ポインタ変数を割り当てる
  p := &v

}

関数内でポインタを渡してそのポインタを出せば良いのです。



【具体例】

package main

import "fmt"

type Vertex struct {
X int
Y int
}

func main() {
v := Vertex{1, 2}
p := &v
// var p *Vertex
// p = &v
p.X = 1e9
fmt.Println(v)
}



{1000000000 2}

p.X = 1e9は
p := &vがpにVertexをかけます。
さらにp = &vでポインタ変数を割り当てる。
整数型のXに1e9を取り出し{1000000000 2}となります。

【結論】

ポインタを取り出す事により大きいサイズを使いやすくなります。
データのサイズが大きい場合は構造体からp := &vで取り出します。






TechAcademy [テックアカデミー]


【アイデミー】AIを学んで一発逆転のキャリアチェンジ!



取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com

go言語の構造体とはどのようなもの

go言語は他のプログラミング言語にあるクラスはありません。
モノを一つにまとめるのにはクラスに相当する構造体を使います。

【基本】

複数データがありそれをひとまとめにします。
構造体structを利用して名前nameや性別genderなどを書く事で自身のデータ構造を定義できます。

type Me struct {
name string
gender string
age int
}



【コード】

package main

import "fmt"

type Vertex struct {
X int
Y int
}

func main() {
fmt.Println(Vertex{1, 2})
}



{1 2}

Vertex{1, 2} をX、Yに代入にし構造体として定義されるので{1, 2} となります。



package main

import "fmt"

type Vertex struct {
X int
Y int
}

func main() {
v := Vertex{1, 2}
fmt.Println(v)
}


{1 2}

先程のと書き方を変えました。
同じ結果です。



package main

import "fmt"

// Vertexは構造体
type Vertex struct {
X int
Y int
z int
}

func main() {
v := Vertex{1, 2, 3}
fmt.Println(v)
}



{1 2 3}

z intには3が入り{1 2 3}となります。




package main

import "fmt"

// Vertexは構造体
type Vertex struct {
X int
Y int
z int
}

func main() {
v := Vertex{1, 2, 3}
v.z = 10
fmt.Println(v)
}




{1 2 10}

v.z = 10でzを10にする事で{1, 2, 3}が{1 2 10}となります。



package main

import "fmt"

// Vertexは構造体
type Vertex struct {
X int
Y int
}

func main() {
v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X)
}


4

v.X = 4
fmt.Println(v.X)
はX intだけを表示する処理です。
さらにX intの1を4に変更してるので4だけの表示です。


【結論】

構造体はstructで定義した変数にfunc main()内の値を入れて出します。
なかなか最初だと慣れないかも知れませんが良く使うので身につけておきましょう。





TechAcademy [テックアカデミー]


【アイデミー】AIを学んで一発逆転のキャリアチェンジ!



取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com

go言語のポインタの基本

go言語にはポインタがあります。
ポインタはC言語などにもありますが初めて扱う人だとなかなかイメージしにくいです。
そのポインタを解説します。


【結論】

ポインタはメモリを格納するものでvar p *intにコードを書きます。
ポインタにはポインタ変数、ポインタ型、ポインタ値がある。


【理由】

ポインタは3つの機能の総称です。

・ポインタ型
アドレスを記憶するものです。
int型やstring型です。

・ポインタ変数
ポインタ型で宣言された変数です。

・ポインタ値
ポインタ変数が記憶できる値です。

package main

import "fmt"

func main() {
var p *int
if p == nil {
fmt.Println("p is nil")
} else {
fmt.Println("p is not nil")
}
// p is nil
}

このコードだとintがポインタ型、p がポインタ変数、p is nilがポインタ値になります


【具体例】

package main

import "fmt"

func main() {
i, j := 42, 2701

p := &i // point to i
fmt.Println(*p) // read i through the pointer

p = 21 // set i through the pointer

fmt.Println(i) // see the new value of i

p = &j // point to j

p = *p / 37 // divide j through the pointer

fmt.Println(j) // see the new value of j
}

42
21
73

i, j := 42, 2701をポインタ変数*pに入れて、ポインタ値のi、jで出力します。

2701は*p = *p / 37でポインタ変数*pに入れて37で割りポインタ変数jで出力して73になります。

ポインタ変数は全く経験ないと分かりにくいが
とにかくどんどんコード書いて身につけましょう。







TechAcademy [テックアカデミー]


【アイデミー】AIを学んで一発逆転のキャリアチェンジ!



取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com

Go言語のdefer文をコードで動かす。

Go言語のdeferは指定した部分の処理を遅らせる処理です。
一体どういう事を処理で見ていきます。


【理由】

defer 関数(またはメソッド)呼び出し
このような処理をすると指定部分の処理が後から呼び出されます。

実際に簡単なコードで見ていきましょう。

package main

import "fmt"

func main() {
defer fmt.Println("world")

fmt.Println("hello")
}


hello
world

defer fmt.Println("world")が後から処理されます。
なので後からworldとなります。


【具体例】



package main

import "fmt"

func foo(x, y int) int {
defer fmt.Println(x + y)

x = x * x
y = y * y

return x + y
}

func main() {
fmt.Println(foo(1, 2))
}



3
5

defer fmt.Println(x + y)が後から処理されるので1が入った変数x同士かけ、2が入った変数y同士かけてdeferの部分で足したのがでるので3
5となります。




// 置き関数呼び出しはスタックにプッシュされます。関数が戻ると
// 延期された通話は、最後の最初の順序で実行されます。//
package main

import "fmt"

func main() {
fmt.Println("conting")

for i := 0; i < 10; i++ {
defer fmt.Println(i)
}

fmt.Println("done")
}





conting
done
9
8
7
6
5
4
3
2
1
0

先にcontingとdoneになります。

for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
をすると通常とは逆に回数処理します。
10未満からなので9 8 7となります。




【結論】

基本的な使い方は
funcA1の中で funcB2の前に defer をつけると funcB2の実行を funcA1が終了するタイミングまで遅延することができます。




TechAcademy [テックアカデミー]


【アイデミー】AIを学んで一発逆転のキャリアチェンジ!



取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com

go言語のswitchの処理を時間帯を表すプログラムで見よう

go言語でswitchの処理をコードで動かします。
ifとの違いも比較しましょう。

【基本】

基本的にswitchはif文と同じような動きします。

switch文では処理のないcaseを追加するだけで共通処理が実行されifより簡素に処理ができます。


switch x {
case value1:
// x == value1のときに、実行されるコード
case value2:
// x == value2のときに、実行されるコード
...
default:
// xがどの値にも一致しない場合に実行されるコード
}

【具体例】


package main

import (
"fmt"
"time"
)

func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Goodmorining")
case t.Hour() < 17:
fmt.Println("Goodafternoon")
default:
fmt.Println("Goodevening")
}
}



Goodevening

これは現在時間表す処理です。
t := time.Now()が現在の時間なので例えば18時だとしたら

case t.Hour() < 12:
fmt.Println("Goodmorining")
case t.Hour() < 17:
fmt.Println("Goodafternoon")

はfalseとなります。
それ以外のdefaultになりGoodeveningとなります。




package main

import (
"fmt"
"time"
)

func main() {
t := time.Now()
if t.Hour() < 12 {
fmt.Println("Goodmorining")
} else if t.Hour() < 17 {
fmt.Println("Goodafternoon")
} else {
fmt.Println("Goodevening")
}
}


Goodevening

同じ処理をifでやりました。
各条件の処理に{}が必要なところが違います

if t.Hour() < 12 {
fmt.Println("Goodmorining")
}



【最後に】

ifよりもswitchを使うことでコードをシンプルにして見やすくできます。
簡潔に書きたい時には良いです。





TechAcademy [テックアカデミー]


【アイデミー】AIを学んで一発逆転のキャリアチェンジ!



取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com

go言語で平方根を出してみましょう。

go言語で今まで学習したif文やループ処理を使い平方根を求めてみましょう。

【具体例】

package main

import (
"fmt"
"math"
)

func Sqrt(x float64) float64 {
z := 1.0
bestZ := 1.0
bestDistance := x

for i := 0; i < 10; i++ {
z -= (z*z - x) / (2 * z)
if distance := x - 2*z
math.Abs (distance) < math.Abs(bestDistance) {
bestZ = z
bestDistance = distance
}
}
return bestZ
}

func main() {
fmt.Println(Sqrt(4))
fmt.Println(math.Sqrt(4))
}




2
2

【解説】

平方根を求めるには
import (
"math"
)

math.Sqrt(平方根を計算する数値)
で可能です。

mathパッケージを呼び出します。

func Sqrt(x float64) float64 {
z := 1.0
bestZ := 1.0
bestDistance := x

zとbestZに1.0を入れます。

次にfor分で繰り返し処理します。

for 初期化式(1.値を初期化) ; 条件式(2.条件) ; 増減式(3.値を更新) {
繰り返される箇所
}

for i := 0; i < 10; i++ {

z -= (z*z - x) / (2 * z)
if distance := x - 2*z
math.Abs (distance) < math.Abs(bestDistance) {
bestZ = z
bestDistance = distance

でiが0で{}を計算を10回繰り返します。

if distance := x - 2*z
math.Abs (distance) < math.Abs(bestDistance) {

if 条件A {
// 条件Aが true の時のみ実行される
}
によりbestDistanceが大きければ値が出力しまいます。

math.AbsのmathパッケージのAbs関数を使い絶対値にします。

そして、math.Sqrtにより平方根の数を返し2となります。






TechAcademy [テックアカデミー]


【アイデミー】AIを学んで一発逆転のキャリアチェンジ!



取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com